Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
526436fd
提交
526436fd
authored
12月 16, 2010
作者:
Anthony Minessale
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
doh
上级
2800ea19
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
500 行增加
和
0 行删除
+500
-0
esl_buffer.c
libs/esl/src/esl_buffer.c
+354
-0
esl_buffer.h
libs/esl/src/include/esl_buffer.h
+146
-0
没有找到文件。
libs/esl/src/esl_buffer.c
0 → 100644
浏览文件 @
526436fd
/*
* Copyright (c) 2010, Anthony Minessale II
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of the original author; nor the names of any contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "esl_buffer.h"
static
unsigned
buffer_id
=
0
;
struct
esl_buffer
{
unsigned
char
*
data
;
unsigned
char
*
head
;
esl_size_t
used
;
esl_size_t
actually_used
;
esl_size_t
datalen
;
esl_size_t
max_len
;
esl_size_t
blocksize
;
unsigned
id
;
int
loops
;
};
ESL_DECLARE
(
esl_status_t
)
esl_buffer_create
(
esl_buffer_t
**
buffer
,
esl_size_t
blocksize
,
esl_size_t
start_len
,
esl_size_t
max_len
)
{
esl_buffer_t
*
new_buffer
;
new_buffer
=
malloc
(
sizeof
(
*
new_buffer
));
if
(
new_buffer
)
{
memset
(
new_buffer
,
0
,
sizeof
(
*
new_buffer
));
if
(
start_len
)
{
new_buffer
->
data
=
malloc
(
start_len
);
if
(
!
new_buffer
->
data
)
{
free
(
new_buffer
);
return
ESL_FAIL
;
}
memset
(
new_buffer
->
data
,
0
,
start_len
);
}
new_buffer
->
max_len
=
max_len
;
new_buffer
->
datalen
=
start_len
;
new_buffer
->
id
=
buffer_id
++
;
new_buffer
->
blocksize
=
blocksize
;
new_buffer
->
head
=
new_buffer
->
data
;
*
buffer
=
new_buffer
;
return
ESL_SUCCESS
;
}
return
ESL_FAIL
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_len
(
esl_buffer_t
*
buffer
)
{
assert
(
buffer
!=
NULL
);
return
buffer
->
datalen
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_freespace
(
esl_buffer_t
*
buffer
)
{
assert
(
buffer
!=
NULL
);
if
(
buffer
->
max_len
)
{
return
(
esl_size_t
)
(
buffer
->
max_len
-
buffer
->
used
);
}
return
1000000
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_inuse
(
esl_buffer_t
*
buffer
)
{
assert
(
buffer
!=
NULL
);
return
buffer
->
used
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_seek
(
esl_buffer_t
*
buffer
,
esl_size_t
datalen
)
{
esl_size_t
reading
=
0
;
assert
(
buffer
!=
NULL
);
if
(
buffer
->
used
<
1
)
{
buffer
->
used
=
0
;
return
0
;
}
else
if
(
buffer
->
used
>=
datalen
)
{
reading
=
datalen
;
}
else
{
reading
=
buffer
->
used
;
}
buffer
->
used
=
buffer
->
actually_used
-
reading
;
buffer
->
head
=
buffer
->
data
+
reading
;
return
reading
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_toss
(
esl_buffer_t
*
buffer
,
esl_size_t
datalen
)
{
esl_size_t
reading
=
0
;
assert
(
buffer
!=
NULL
);
if
(
buffer
->
used
<
1
)
{
buffer
->
used
=
0
;
return
0
;
}
else
if
(
buffer
->
used
>=
datalen
)
{
reading
=
datalen
;
}
else
{
reading
=
buffer
->
used
;
}
buffer
->
used
-=
reading
;
buffer
->
head
+=
reading
;
return
buffer
->
used
;
}
ESL_DECLARE
(
void
)
esl_buffer_set_loops
(
esl_buffer_t
*
buffer
,
int
loops
)
{
buffer
->
loops
=
loops
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_read_loop
(
esl_buffer_t
*
buffer
,
void
*
data
,
esl_size_t
datalen
)
{
esl_size_t
len
;
if
((
len
=
esl_buffer_read
(
buffer
,
data
,
datalen
))
<
datalen
)
{
if
(
buffer
->
loops
==
0
)
{
return
len
;
}
buffer
->
head
=
buffer
->
data
;
buffer
->
used
=
buffer
->
actually_used
;
len
=
esl_buffer_read
(
buffer
,
(
char
*
)
data
+
len
,
datalen
-
len
);
buffer
->
loops
--
;
}
return
len
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_read
(
esl_buffer_t
*
buffer
,
void
*
data
,
esl_size_t
datalen
)
{
esl_size_t
reading
=
0
;
assert
(
buffer
!=
NULL
);
assert
(
data
!=
NULL
);
if
(
buffer
->
used
<
1
)
{
buffer
->
used
=
0
;
return
0
;
}
else
if
(
buffer
->
used
>=
datalen
)
{
reading
=
datalen
;
}
else
{
reading
=
buffer
->
used
;
}
memcpy
(
data
,
buffer
->
head
,
reading
);
buffer
->
used
-=
reading
;
buffer
->
head
+=
reading
;
/* if (buffer->id == 4) printf("%u o %d = %d\n", buffer->id, (unsigned)reading, (unsigned)buffer->used); */
return
reading
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_packet_count
(
esl_buffer_t
*
buffer
)
{
char
*
pe
,
*
p
,
*
e
,
*
head
=
(
char
*
)
buffer
->
head
;
esl_size_t
x
=
0
;
assert
(
buffer
!=
NULL
);
e
=
(
head
+
buffer
->
used
);
for
(
p
=
head
;
p
&&
*
p
&&
p
<
e
;
p
++
)
{
if
(
*
p
==
'\n'
)
{
pe
=
p
+
1
;
if
(
*
pe
==
'\r'
)
pe
++
;
if
(
pe
<=
e
&&
*
pe
==
'\n'
)
{
p
=
pe
++
;
x
++
;
}
}
}
return
x
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_read_packet
(
esl_buffer_t
*
buffer
,
void
*
data
,
esl_size_t
maxlen
)
{
char
*
pe
,
*
p
,
*
e
,
*
head
=
(
char
*
)
buffer
->
head
;
esl_size_t
datalen
=
0
;
assert
(
buffer
!=
NULL
);
assert
(
data
!=
NULL
);
e
=
(
head
+
buffer
->
used
);
for
(
p
=
head
;
p
&&
*
p
&&
p
<
e
;
p
++
)
{
if
(
*
p
==
'\n'
)
{
pe
=
p
+
1
;
if
(
*
pe
==
'\r'
)
pe
++
;
if
(
pe
<=
e
&&
*
pe
==
'\n'
)
{
pe
++
;
datalen
=
pe
-
head
;
if
(
datalen
>
maxlen
)
{
datalen
=
maxlen
;
}
break
;
}
}
}
return
esl_buffer_read
(
buffer
,
data
,
datalen
);
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_write
(
esl_buffer_t
*
buffer
,
const
void
*
data
,
esl_size_t
datalen
)
{
esl_size_t
freespace
,
actual_freespace
;
assert
(
buffer
!=
NULL
);
assert
(
data
!=
NULL
);
assert
(
buffer
->
data
!=
NULL
);
if
(
!
datalen
)
{
return
buffer
->
used
;
}
actual_freespace
=
buffer
->
datalen
-
buffer
->
actually_used
;
if
(
actual_freespace
<
datalen
&&
(
!
buffer
->
max_len
||
(
buffer
->
used
+
datalen
<=
buffer
->
max_len
)))
{
memmove
(
buffer
->
data
,
buffer
->
head
,
buffer
->
used
);
buffer
->
head
=
buffer
->
data
;
buffer
->
actually_used
=
buffer
->
used
;
}
freespace
=
buffer
->
datalen
-
buffer
->
used
;
/*
if (buffer->data != buffer->head) {
memmove(buffer->data, buffer->head, buffer->used);
buffer->head = buffer->data;
}
*/
if
(
freespace
<
datalen
)
{
esl_size_t
new_size
,
new_block_size
;
void
*
data
;
new_size
=
buffer
->
datalen
+
datalen
;
new_block_size
=
buffer
->
datalen
+
buffer
->
blocksize
;
if
(
new_block_size
>
new_size
)
{
new_size
=
new_block_size
;
}
buffer
->
head
=
buffer
->
data
;
data
=
realloc
(
buffer
->
data
,
new_size
);
if
(
!
data
)
{
return
0
;
}
buffer
->
data
=
data
;
buffer
->
head
=
buffer
->
data
;
buffer
->
datalen
=
new_size
;
}
freespace
=
buffer
->
datalen
-
buffer
->
used
;
if
(
freespace
<
datalen
)
{
return
0
;
}
else
{
memcpy
(
buffer
->
head
+
buffer
->
used
,
data
,
datalen
);
buffer
->
used
+=
datalen
;
buffer
->
actually_used
+=
datalen
;
}
/* if (buffer->id == 4) printf("%u i %d = %d\n", buffer->id, (unsigned)datalen, (unsigned)buffer->used); */
return
buffer
->
used
;
}
ESL_DECLARE
(
void
)
esl_buffer_zero
(
esl_buffer_t
*
buffer
)
{
assert
(
buffer
!=
NULL
);
assert
(
buffer
->
data
!=
NULL
);
buffer
->
used
=
0
;
buffer
->
actually_used
=
0
;
buffer
->
head
=
buffer
->
data
;
}
ESL_DECLARE
(
esl_size_t
)
esl_buffer_zwrite
(
esl_buffer_t
*
buffer
,
const
void
*
data
,
esl_size_t
datalen
)
{
esl_size_t
w
;
if
(
!
(
w
=
esl_buffer_write
(
buffer
,
data
,
datalen
)))
{
esl_buffer_zero
(
buffer
);
return
esl_buffer_write
(
buffer
,
data
,
datalen
);
}
return
w
;
}
ESL_DECLARE
(
void
)
esl_buffer_destroy
(
esl_buffer_t
**
buffer
)
{
if
(
*
buffer
)
{
free
((
*
buffer
)
->
data
);
free
(
*
buffer
);
}
*
buffer
=
NULL
;
}
/* For Emacs:
* Local Variables:
* mode:c
* indent-tabs-mode:t
* tab-width:4
* c-basic-offset:4
* End:
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
*/
libs/esl/src/include/esl_buffer.h
0 → 100644
浏览文件 @
526436fd
/*
* Copyright (c) 2010, Anthony Minessale II
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of the original author; nor the names of any contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "esl.h"
#ifndef ESL_BUFFER_H
#define ESL_BUFFER_H
/**
* @defgroup esl_buffer Buffer Routines
* @ingroup buffer
* The purpose of this module is to make a plain buffering interface that can be used for read/write buffers
* throughout the application.
* @{
*/
struct
esl_buffer
;
typedef
struct
esl_buffer
esl_buffer_t
;
/*! \brief Allocate a new dynamic esl_buffer
* \param buffer returned pointer to the new buffer
* \param blocksize length to realloc by as data is added
* \param start_len ammount of memory to reserve initially
* \param max_len length the buffer is allowed to grow to
* \return status
*/
ESL_DECLARE
(
esl_status_t
)
esl_buffer_create
(
esl_buffer_t
**
buffer
,
esl_size_t
blocksize
,
esl_size_t
start_len
,
esl_size_t
max_len
);
/*! \brief Get the length of a esl_buffer_t
* \param buffer any buffer of type esl_buffer_t
* \return int size of the buffer.
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_len
(
esl_buffer_t
*
buffer
);
/*! \brief Get the freespace of a esl_buffer_t
* \param buffer any buffer of type esl_buffer_t
* \return int freespace in the buffer.
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_freespace
(
esl_buffer_t
*
buffer
);
/*! \brief Get the in use amount of a esl_buffer_t
* \param buffer any buffer of type esl_buffer_t
* \return int ammount of buffer curently in use
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_inuse
(
esl_buffer_t
*
buffer
);
/*! \brief Read data from a esl_buffer_t up to the ammount of datalen if it is available. Remove read data from buffer.
* \param buffer any buffer of type esl_buffer_t
* \param data pointer to the read data to be returned
* \param datalen amount of data to be returned
* \return int ammount of data actually read
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_read
(
esl_buffer_t
*
buffer
,
void
*
data
,
esl_size_t
datalen
);
ESL_DECLARE
(
esl_size_t
)
esl_buffer_read_packet
(
esl_buffer_t
*
buffer
,
void
*
data
,
esl_size_t
maxlen
);
ESL_DECLARE
(
esl_size_t
)
esl_buffer_packet_count
(
esl_buffer_t
*
buffer
);
/*! \brief Read data endlessly from a esl_buffer_t
* \param buffer any buffer of type esl_buffer_t
* \param data pointer to the read data to be returned
* \param datalen amount of data to be returned
* \return int ammount of data actually read
* \note Once you have read all the data from the buffer it will loop around.
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_read_loop
(
esl_buffer_t
*
buffer
,
void
*
data
,
esl_size_t
datalen
);
/*! \brief Assign a number of loops to read
* \param buffer any buffer of type esl_buffer_t
* \param loops the number of loops (-1 for infinite)
*/
ESL_DECLARE
(
void
)
esl_buffer_set_loops
(
esl_buffer_t
*
buffer
,
int32_t
loops
);
/*! \brief Write data into a esl_buffer_t up to the length of datalen
* \param buffer any buffer of type esl_buffer_t
* \param data pointer to the data to be written
* \param datalen amount of data to be written
* \return int amount of buffer used after the write, or 0 if no space available
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_write
(
esl_buffer_t
*
buffer
,
const
void
*
data
,
esl_size_t
datalen
);
/*! \brief Remove data from the buffer
* \param buffer any buffer of type esl_buffer_t
* \param datalen amount of data to be removed
* \return int size of buffer, or 0 if unable to toss that much data
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_toss
(
esl_buffer_t
*
buffer
,
esl_size_t
datalen
);
/*! \brief Remove all data from the buffer
* \param buffer any buffer of type esl_buffer_t
*/
ESL_DECLARE
(
void
)
esl_buffer_zero
(
esl_buffer_t
*
buffer
);
/*! \brief Destroy the buffer
* \param buffer buffer to destroy
* \note only neccessary on dynamic buffers (noop on pooled ones)
*/
ESL_DECLARE
(
void
)
esl_buffer_destroy
(
esl_buffer_t
**
buffer
);
/*! \brief Seek to offset from the beginning of the buffer
* \param buffer buffer to seek
* \param datalen offset in bytes
* \return new position
*/
ESL_DECLARE
(
esl_size_t
)
esl_buffer_seek
(
esl_buffer_t
*
buffer
,
esl_size_t
datalen
);
/** @} */
ESL_DECLARE
(
esl_size_t
)
esl_buffer_zwrite
(
esl_buffer_t
*
buffer
,
const
void
*
data
,
esl_size_t
datalen
);
#endif
/* For Emacs:
* Local Variables:
* mode:c
* indent-tabs-mode:t
* tab-width:4
* c-basic-offset:4
* End:
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
*/
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论