Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Mr、小李
TDengine
提交
a4e51566
T
TDengine
项目概览
Mr、小李
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a4e51566
编写于
2月 17, 2020
作者:
weixin_48148422
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update buffer implementation
上级
167408b1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
118 addition
and
80 deletion
+118
-80
src/util/inc/tbuffer.h
src/util/inc/tbuffer.h
+73
-41
src/util/src/tbuffer.c
src/util/src/tbuffer.c
+45
-39
未找到文件。
src/util/inc/tbuffer.h
浏览文件 @
a4e51566
...
...
@@ -24,45 +24,78 @@
/*
SBuffer can be used to read or write a buffer, but cannot be used for both
read & write at a same time.
Read example:
SBuffer rbuf;
if (tbufBeginOperation(&rbuf) != 0) {
// handling errors
}
tbufInitRead(&rbuf, data, 1024);
int32_t a = tbufReadInt32(&rbuf);
// other read functions
Write example:
SBuffer wbuf;
if (tbufBeginOperation(&wbuf) != 0) {
// handling errors
}
tbufInitWrite(&wbuf, 1024);
tbufWriteInt32(&wbuf, 10);
// other write functions
size_t size = tbufGetSize(&wbuf);
char* data = tbufGetBuffer(&wbuf, true);
tbufUninitWrite(&wbuf);
read & write at a same time. Below is an example:
int main(int argc, char** argv) {
//--------------------- write ------------------------
SBuffer wbuf;
int32_t code = tbufBeginWrite(&wbuf);
if (code != 0) {
// handle errors
return 0;
}
// reserve 1024 bytes for the buffer to improve performance
tbufEnsureCapacity(&wbuf, 1024);
// write 5 integers to the buffer
for (int i = 0; i < 5; i++) {
tbufWriteInt32(&wbuf, i);
}
// write a string to the buffer
tbufWriteString(&wbuf, "this is a string.\n");
// acquire the result and close the write buffer
size_t size = tbufTell(&wbuf);
char* data = tbufGetData(&wbuf, true);
tbufClose(&wbuf, true);
//------------------------ read -----------------------
SBuffer rbuf;
code = tbufBeginRead(&rbuf, data, size);
if (code != 0) {
printf("you will see this message after print out 5 integers and a string.\n");
tbufClose(&rbuf, false);
return 0;
}
// read & print out 5 integers
for (int i = 0; i < 5; i++) {
printf("%d\n", tbufReadInt32(&rbuf));
}
// read & print out a string
printf(tbufReadString(&rbuf, NULL));
// try read another integer, this result in an error as there no this integer
tbufReadInt32(&rbuf);
printf("you should not see this message.\n");
tbufClose(&rbuf, false);
return 0;
}
*/
typedef
struct
{
jmp_buf
jb
;
char
*
buf
;
char
*
data
;
size_t
pos
;
size_t
size
;
}
SBuffer
;
// common functions can be used in both read & write
#define tbuf
BeginOperation(buf) setjmp((buf)->jb
)
#define tbuf
ThrowError(buf, code) longjmp((buf)->jb, (code)
)
size_t
tbufTell
(
SBuffer
*
buf
);
size_t
tbufSeekTo
(
SBuffer
*
buf
,
size_t
pos
);
size_t
tbufSkip
(
SBuffer
*
buf
,
size_t
size
);
void
tbufClose
(
SBuffer
*
buf
,
bool
keepData
);
// basic read functions
void
tbufInitRead
(
SBuffer
*
buf
,
void
*
data
,
size_t
size
);
#define tbufBeginRead(buf, data, len) (((buf)->data = (char*)data), ((buf)->pos = 0), ((buf)->size = ((data) == NULL) ? 0 : (len)), setjmp((buf)->jb))
char
*
tbufRead
(
SBuffer
*
buf
,
size_t
size
);
void
tbufReadToBuffer
(
SBuffer
*
buf
,
void
*
dst
,
size_t
size
);
const
char
*
tbufReadString
(
SBuffer
*
buf
,
size_t
*
len
);
...
...
@@ -70,10 +103,9 @@ size_t tbufReadToString(SBuffer* buf, char* dst, size_t size);
// basic write functions
void
tbufInitWrite
(
SBuffer
*
buf
,
size_t
size
);
#define tbufBeginWrite(buf) ((buf)->data = NULL, ((buf)->pos = 0), ((buf)->size = 0), setjmp((buf)->jb))
void
tbufEnsureCapacity
(
SBuffer
*
buf
,
size_t
size
);
char
*
tbufGetResult
(
SBuffer
*
buf
,
bool
takeOver
);
void
tbufUninitWrite
(
SBuffer
*
buf
);
char
*
tbufGetData
(
SBuffer
*
buf
,
bool
takeOver
);
void
tbufWrite
(
SBuffer
*
buf
,
const
void
*
data
,
size_t
size
);
void
tbufWriteAt
(
SBuffer
*
buf
,
size_t
pos
,
const
void
*
data
,
size_t
size
);
void
tbufWriteStringLen
(
SBuffer
*
buf
,
const
char
*
str
,
size_t
len
);
...
...
@@ -81,24 +113,24 @@ void tbufWriteString(SBuffer* buf, const char* str);
// read & write function for primitive types
#ifndef TBUFFER_DEFINE_
OPERA
TION
#define TBUFFER_DEFINE_
OPERA
TION(type, name) \
#ifndef TBUFFER_DEFINE_
FUNC
TION
#define TBUFFER_DEFINE_
FUNC
TION(type, name) \
type tbufRead##name(SBuffer* buf); \
void tbufWrite##name(SBuffer* buf, type data); \
void tbufWrite##name##At(SBuffer* buf, size_t pos, type data);
#endif
TBUFFER_DEFINE_
OPERA
TION
(
bool
,
Bool
)
TBUFFER_DEFINE_
OPERA
TION
(
char
,
Char
)
TBUFFER_DEFINE_
OPERA
TION
(
int8_t
,
Int8
)
TBUFFER_DEFINE_
OPERA
TION
(
uint8_t
,
Unt8
)
TBUFFER_DEFINE_
OPERA
TION
(
int16_t
,
Int16
)
TBUFFER_DEFINE_
OPERA
TION
(
uint16_t
,
Uint16
)
TBUFFER_DEFINE_
OPERA
TION
(
int32_t
,
Int32
)
TBUFFER_DEFINE_
OPERA
TION
(
uint32_t
,
Uint32
)
TBUFFER_DEFINE_
OPERA
TION
(
int64_t
,
Int64
)
TBUFFER_DEFINE_
OPERA
TION
(
uint64_t
,
Uint64
)
TBUFFER_DEFINE_
OPERA
TION
(
float
,
Float
)
TBUFFER_DEFINE_
OPERA
TION
(
double
,
Double
)
TBUFFER_DEFINE_
FUNC
TION
(
bool
,
Bool
)
TBUFFER_DEFINE_
FUNC
TION
(
char
,
Char
)
TBUFFER_DEFINE_
FUNC
TION
(
int8_t
,
Int8
)
TBUFFER_DEFINE_
FUNC
TION
(
uint8_t
,
Unt8
)
TBUFFER_DEFINE_
FUNC
TION
(
int16_t
,
Int16
)
TBUFFER_DEFINE_
FUNC
TION
(
uint16_t
,
Uint16
)
TBUFFER_DEFINE_
FUNC
TION
(
int32_t
,
Int32
)
TBUFFER_DEFINE_
FUNC
TION
(
uint32_t
,
Uint32
)
TBUFFER_DEFINE_
FUNC
TION
(
int64_t
,
Int64
)
TBUFFER_DEFINE_
FUNC
TION
(
uint64_t
,
Uint64
)
TBUFFER_DEFINE_
FUNC
TION
(
float
,
Float
)
TBUFFER_DEFINE_
FUNC
TION
(
double
,
Double
)
#endif
\ No newline at end of file
src/util/src/tbuffer.c
浏览文件 @
a4e51566
...
...
@@ -13,7 +13,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define TBUFFER_DEFINE_OPERATION(type, name) \
#include <stdlib.h>
#include <memory.h>
#include <assert.h>
#define TBUFFER_DEFINE_FUNCTION(type, name) \
type tbufRead##name(SBuffer* buf) { \
type ret; \
tbufReadToBuffer(buf, &ret, sizeof(type)); \
...
...
@@ -38,7 +42,8 @@ size_t tbufTell(SBuffer* buf) {
size_t
tbufSeekTo
(
SBuffer
*
buf
,
size_t
pos
)
{
if
(
pos
>
buf
->
size
)
{
longjmp
(
buf
->
jb
,
1
);
// TODO: update error code, other tbufThrowError need to be changed too
tbufThrowError
(
buf
,
1
);
}
size_t
old
=
buf
->
pos
;
buf
->
pos
=
pos
;
...
...
@@ -49,18 +54,20 @@ size_t tbufSkip(SBuffer* buf, size_t size) {
return
tbufSeekTo
(
buf
,
buf
->
pos
+
size
);
}
////////////////////////////////////////////////////////////////////////////////
// read functions
void
tbufInitRead
(
SBuffer
*
buf
,
void
*
data
,
size_t
size
)
{
buf
->
buf
=
(
char
*
)
data
;
void
tbufClose
(
SBuffer
*
buf
,
bool
keepData
)
{
if
(
!
keepData
)
{
free
(
buf
->
data
);
}
buf
->
data
=
NULL
;
buf
->
pos
=
0
;
// empty buffer is not an error, but read an empty buffer is
buf
->
size
=
(
data
==
NULL
)
?
0
:
size
;
buf
->
size
=
0
;
}
////////////////////////////////////////////////////////////////////////////////
// read functions
char
*
tbufRead
(
SBuffer
*
buf
,
size_t
size
)
{
char
*
ret
=
buf
->
buf
+
buf
->
pos
;
char
*
ret
=
buf
->
data
+
buf
->
pos
;
tbufSkip
(
buf
,
size
);
return
ret
;
}
...
...
@@ -72,8 +79,8 @@ void tbufReadToBuffer(SBuffer* buf, void* dst, size_t size) {
}
const
char
*
tbufReadString
(
SBuffer
*
buf
,
size_t
*
len
)
{
uint16_t
l
=
tbufReadUint16
();
char
*
ret
=
buf
->
buf
+
buf
->
pos
;
uint16_t
l
=
tbufReadUint16
(
buf
);
char
*
ret
=
buf
->
data
+
buf
->
pos
;
tbufSkip
(
buf
,
l
+
1
);
ret
[
l
]
=
0
;
// ensure the string end with '\0'
if
(
len
!=
NULL
)
{
...
...
@@ -83,9 +90,12 @@ const char* tbufReadString(SBuffer* buf, size_t* len) {
}
size_t
tbufReadToString
(
SBuffer
*
buf
,
char
*
dst
,
size_t
size
)
{
assert
(
dst
!=
NULL
);
size_t
len
;
const
char
*
str
=
tbufReadString
(
buf
,
&
len
);
if
(
len
>=
size
)
len
=
size
-
1
;
if
(
len
>=
size
)
{
len
=
size
-
1
;
}
memcpy
(
dst
,
str
,
len
);
dst
[
len
]
=
0
;
return
len
;
...
...
@@ -98,57 +108,53 @@ size_t tbufReadToString(SBuffer* buf, char* dst, size_t size) {
void
tbufEnsureCapacity
(
SBuffer
*
buf
,
size_t
size
)
{
size
+=
buf
->
pos
;
if
(
size
>
buf
->
size
)
{
char
*
nbuf
=
NULL
;
size_t
nsize
=
size
+
buf
->
size
;
nbuf
=
realloc
(
buf
->
buf
,
nsize
);
if
(
nbuf
==
NULL
)
{
longjmp
(
buf
->
jb
,
2
);
char
*
data
=
realloc
(
buf
->
data
,
nsize
);
if
(
data
==
NULL
)
{
tbufThrowError
(
buf
,
2
);
}
buf
->
buf
=
nbuf
;
buf
->
data
=
data
;
buf
->
size
=
nsize
;
}
}
void
tbufInitWrite
(
SBuffer
*
buf
,
size_t
size
)
{
buf
->
buf
=
NULL
;
buf
->
pos
=
0
;
buf
->
size
=
0
;
tbufEnsureCapacity
(
buf
,
size
);
}
char
*
tbufGetResult
(
SBuffer
*
buf
,
bool
takeOver
)
{
char
*
ret
=
buf
->
buf
;
char
*
tbufGetData
(
SBuffer
*
buf
,
bool
takeOver
)
{
char
*
ret
=
buf
->
data
;
if
(
takeOver
)
{
buf
->
pos
=
0
;
buf
->
size
=
0
;
buf
->
buf
=
NULL
;
buf
->
data
=
NULL
;
}
return
ret
;
}
void
tbufUninitWrite
(
SBuffer
*
buf
)
{
free
(
buf
->
buf
);
void
tbufEndWrite
(
SBuffer
*
buf
)
{
free
(
buf
->
data
);
buf
->
data
=
NULL
;
buf
->
pos
=
0
;
buf
->
size
=
0
;
}
void
tbufWrite
(
SBuffer
*
buf
,
const
void
*
data
,
size_t
size
)
{
tbufEnsureCapacity
(
size
);
memcpy
(
buf
->
buf
+
buf
->
pos
,
data
,
size
);
assert
(
data
!=
NULL
);
tbufEnsureCapacity
(
buf
,
size
);
memcpy
(
buf
->
data
+
buf
->
pos
,
data
,
size
);
buf
->
pos
+=
size
;
}
void
tbufWriteAt
(
SBuffer
*
buf
,
size_t
pos
,
const
void
*
data
,
size_t
size
)
{
assert
(
data
!=
NULL
);
// this function can only be called to fill the gap on previous writes,
// so 'pos + size <= buf->pos' must be true
if
(
pos
+
size
>
buf
->
pos
)
{
longjmp
(
buf
->
jb
,
3
);
}
memcpy
(
buf
->
buf
+
pos
,
data
,
size
);
assert
(
pos
+
size
<=
buf
->
pos
);
memcpy
(
buf
->
data
+
pos
,
data
,
size
);
}
void
tbufWriteStringLen
(
SBuffer
*
buf
,
const
char
*
str
,
size_t
len
)
{
if
(
len
>
0xffff
)
{
longjmp
(
buf
->
jb
,
4
);
}
// maximum string length is 65535, if longer string is required
// this function and the corresponding read function need to be
// revised.
assert
(
len
<=
0xffff
);
tbufWriteUint16
(
buf
,
(
uint16_t
)
len
);
tbufWrite
(
buf
,
str
,
len
+
1
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录