Merge pull request #26584 from taosdata/enh/TD-30987-3.0-1
enh: refact more encode and decode function
This commit is contained in:
commit
5e37442be5
|
@ -18,6 +18,7 @@
|
|||
|
||||
#include "tcoding.h"
|
||||
#include "tlist.h"
|
||||
#include "tutil.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -46,38 +47,8 @@ typedef struct {
|
|||
SDecoderNode* dStack;
|
||||
} SDecoder;
|
||||
|
||||
#define tPut(TYPE, BUF, VAL) ((TYPE*)(BUF))[0] = (VAL)
|
||||
#define tGet(TYPE, BUF, VAL) (VAL) = ((TYPE*)(BUF))[0]
|
||||
|
||||
#define tRPut16(PDEST, PSRC) \
|
||||
((uint8_t*)(PDEST))[0] = ((uint8_t*)(PSRC))[1]; \
|
||||
((uint8_t*)(PDEST))[1] = ((uint8_t*)(PSRC))[0];
|
||||
|
||||
#define tRPut32(PDEST, PSRC) \
|
||||
((uint8_t*)(PDEST))[0] = ((uint8_t*)(PSRC))[3]; \
|
||||
((uint8_t*)(PDEST))[1] = ((uint8_t*)(PSRC))[2]; \
|
||||
((uint8_t*)(PDEST))[2] = ((uint8_t*)(PSRC))[1]; \
|
||||
((uint8_t*)(PDEST))[3] = ((uint8_t*)(PSRC))[0];
|
||||
|
||||
#define tRPut64(PDEST, PSRC) \
|
||||
((uint8_t*)(PDEST))[0] = ((uint8_t*)(PSRC))[7]; \
|
||||
((uint8_t*)(PDEST))[1] = ((uint8_t*)(PSRC))[6]; \
|
||||
((uint8_t*)(PDEST))[2] = ((uint8_t*)(PSRC))[5]; \
|
||||
((uint8_t*)(PDEST))[3] = ((uint8_t*)(PSRC))[4]; \
|
||||
((uint8_t*)(PDEST))[4] = ((uint8_t*)(PSRC))[3]; \
|
||||
((uint8_t*)(PDEST))[5] = ((uint8_t*)(PSRC))[2]; \
|
||||
((uint8_t*)(PDEST))[6] = ((uint8_t*)(PSRC))[1]; \
|
||||
((uint8_t*)(PDEST))[7] = ((uint8_t*)(PSRC))[0];
|
||||
|
||||
#define tRGet16 tRPut16
|
||||
#define tRGet32 tRPut32
|
||||
#define tRGet64 tRPut64
|
||||
|
||||
#define TD_CODER_POS(CODER) ((CODER)->pos)
|
||||
#define TD_CODER_CURRENT(CODER) ((CODER)->data + (CODER)->pos)
|
||||
#define TD_CODER_MOVE_POS(CODER, MOVE) ((CODER)->pos += (MOVE))
|
||||
#define TD_CODER_CHECK_CAPACITY_FAILED(CODER, EXPSIZE) (((CODER)->size - (CODER)->pos) < (EXPSIZE))
|
||||
#define TD_CODER_REMAIN_CAPACITY(CODER) ((CODER)->size - (CODER)->pos)
|
||||
#define TD_CODER_CURRENT(CODER) ((CODER)->data + (CODER)->pos)
|
||||
#define TD_CODER_REMAIN_CAPACITY(CODER) ((CODER)->size - (CODER)->pos)
|
||||
|
||||
#define tEncodeSize(E, S, SIZE, RET) \
|
||||
do { \
|
||||
|
@ -100,6 +71,7 @@ void tEncoderInit(SEncoder* pCoder, uint8_t* data, uint32_t size);
|
|||
void tEncoderClear(SEncoder* pCoder);
|
||||
int32_t tStartEncode(SEncoder* pCoder);
|
||||
void tEndEncode(SEncoder* pCoder);
|
||||
static int32_t tEncodeFixed(SEncoder* pCoder, const void* val, uint32_t size);
|
||||
static int32_t tEncodeU8(SEncoder* pCoder, uint8_t val);
|
||||
static int32_t tEncodeI8(SEncoder* pCoder, int8_t val);
|
||||
static int32_t tEncodeU16(SEncoder* pCoder, uint16_t val);
|
||||
|
@ -127,6 +99,7 @@ void tDecoderClear(SDecoder* SDecoder);
|
|||
int32_t tStartDecode(SDecoder* pCoder);
|
||||
void tEndDecode(SDecoder* pCoder);
|
||||
static bool tDecodeIsEnd(SDecoder* pCoder);
|
||||
static int32_t tDecodeFixed(SDecoder* pCoder, void* val, uint32_t size);
|
||||
static int32_t tDecodeU8(SDecoder* pCoder, uint8_t* val);
|
||||
static int32_t tDecodeI8(SDecoder* pCoder, int8_t* val);
|
||||
static int32_t tDecodeU16(SDecoder* pCoder, uint16_t* val);
|
||||
|
@ -149,97 +122,65 @@ static int32_t tDecodeCStr(SDecoder* pCoder, char** val);
|
|||
static int32_t tDecodeCStrTo(SDecoder* pCoder, char* val);
|
||||
|
||||
/* ------------------------ IMPL ------------------------ */
|
||||
#define TD_ENCODE_MACRO(CODER, VAL, TYPE, BITS) \
|
||||
if ((CODER)->data) { \
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(CODER, sizeof(VAL))) return -1; \
|
||||
tPut(TYPE, TD_CODER_CURRENT(CODER), (VAL)); \
|
||||
} \
|
||||
TD_CODER_MOVE_POS(CODER, sizeof(VAL)); \
|
||||
return 0;
|
||||
|
||||
#define TD_ENCODE_VARIANT_MACRO(CODER, VAL) \
|
||||
while ((VAL) >= ENCODE_LIMIT) { \
|
||||
if ((CODER)->data) { \
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(CODER, 1)) return -1; \
|
||||
TD_CODER_CURRENT(CODER)[0] = ((VAL) | ENCODE_LIMIT) & 0xff; \
|
||||
} \
|
||||
\
|
||||
(VAL) >>= 7; \
|
||||
TD_CODER_MOVE_POS(CODER, 1); \
|
||||
} \
|
||||
\
|
||||
if ((CODER)->data) { \
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(CODER, 1)) return -1; \
|
||||
TD_CODER_CURRENT(CODER)[0] = (uint8_t)(VAL); \
|
||||
} \
|
||||
TD_CODER_MOVE_POS(CODER, 1); \
|
||||
return 0;
|
||||
|
||||
#define TD_DECODE_MACRO(CODER, PVAL, TYPE, BITS) \
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(CODER, sizeof(*(PVAL)))) return -1; \
|
||||
tGet(TYPE, TD_CODER_CURRENT(CODER), *(PVAL)); \
|
||||
TD_CODER_MOVE_POS(CODER, sizeof(*(PVAL))); \
|
||||
return 0;
|
||||
|
||||
#define TD_DECODE_VARIANT_MACRO(CODER, PVAL, TYPE) \
|
||||
int32_t i = 0; \
|
||||
*(PVAL) = 0; \
|
||||
for (;;) { \
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(CODER, 1)) return -1; \
|
||||
TYPE tval = TD_CODER_CURRENT(CODER)[0]; \
|
||||
if (tval < ENCODE_LIMIT) { \
|
||||
*(PVAL) |= (tval << (7 * i)); \
|
||||
TD_CODER_MOVE_POS(pCoder, 1); \
|
||||
break; \
|
||||
} else { \
|
||||
*(PVAL) |= (((tval) & (ENCODE_LIMIT - 1)) << (7 * i)); \
|
||||
i++; \
|
||||
TD_CODER_MOVE_POS(pCoder, 1); \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
return 0;
|
||||
|
||||
// 8
|
||||
static FORCE_INLINE int32_t tEncodeU8(SEncoder* pCoder, uint8_t val) {
|
||||
static FORCE_INLINE int32_t tEncodeFixed(SEncoder* pCoder, const void* val, uint32_t size) {
|
||||
if (pCoder->data) {
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, sizeof(val))) return -1;
|
||||
tPut(uint8_t, TD_CODER_CURRENT(pCoder), val);
|
||||
if (pCoder->pos + size > pCoder->size) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
}
|
||||
memcpy(pCoder->data + pCoder->pos, val, size);
|
||||
}
|
||||
TD_CODER_MOVE_POS(pCoder, sizeof(val));
|
||||
|
||||
pCoder->pos += size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tEncodeI8(SEncoder* pCoder, int8_t val) {
|
||||
if (pCoder->data) {
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, sizeof(val))) return -1;
|
||||
tPut(int8_t, TD_CODER_CURRENT(pCoder), val);
|
||||
}
|
||||
TD_CODER_MOVE_POS(pCoder, sizeof(val));
|
||||
return 0;
|
||||
static FORCE_INLINE int32_t tEncodeU8(SEncoder* pCoder, uint8_t val) { return tEncodeFixed(pCoder, &val, sizeof(val)); }
|
||||
static FORCE_INLINE int32_t tEncodeI8(SEncoder* pCoder, int8_t val) { return tEncodeFixed(pCoder, &val, sizeof(val)); }
|
||||
static FORCE_INLINE int32_t tEncodeU16(SEncoder* pCoder, uint16_t val) {
|
||||
return tEncodeFixed(pCoder, &val, sizeof(val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeI16(SEncoder* pCoder, int16_t val) {
|
||||
return tEncodeFixed(pCoder, &val, sizeof(val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeU32(SEncoder* pCoder, uint32_t val) {
|
||||
return tEncodeFixed(pCoder, &val, sizeof(val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeI32(SEncoder* pCoder, int32_t val) {
|
||||
return tEncodeFixed(pCoder, &val, sizeof(val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeU64(SEncoder* pCoder, uint64_t val) {
|
||||
return tEncodeFixed(pCoder, &val, sizeof(val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeI64(SEncoder* pCoder, int64_t val) {
|
||||
return tEncodeFixed(pCoder, &val, sizeof(val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeU16v(SEncoder* pCoder, uint16_t val) {
|
||||
while (val >= ENCODE_LIMIT) {
|
||||
TAOS_CHECK_RETURN(tEncodeU8(pCoder, (val | ENCODE_LIMIT) & 0xff));
|
||||
val >>= 7;
|
||||
}
|
||||
return tEncodeU8(pCoder, val);
|
||||
}
|
||||
|
||||
// 16
|
||||
static FORCE_INLINE int32_t tEncodeU16(SEncoder* pCoder, uint16_t val) { TD_ENCODE_MACRO(pCoder, val, uint16_t, 16); }
|
||||
static FORCE_INLINE int32_t tEncodeI16(SEncoder* pCoder, int16_t val) { TD_ENCODE_MACRO(pCoder, val, int16_t, 16); }
|
||||
// 32
|
||||
static FORCE_INLINE int32_t tEncodeU32(SEncoder* pCoder, uint32_t val) { TD_ENCODE_MACRO(pCoder, val, uint32_t, 32); }
|
||||
static FORCE_INLINE int32_t tEncodeI32(SEncoder* pCoder, int32_t val) { TD_ENCODE_MACRO(pCoder, val, int32_t, 32); }
|
||||
// 64
|
||||
static FORCE_INLINE int32_t tEncodeU64(SEncoder* pCoder, uint64_t val) { TD_ENCODE_MACRO(pCoder, val, uint64_t, 64); }
|
||||
static FORCE_INLINE int32_t tEncodeI64(SEncoder* pCoder, int64_t val) { TD_ENCODE_MACRO(pCoder, val, int64_t, 64); }
|
||||
// 16v
|
||||
static FORCE_INLINE int32_t tEncodeU16v(SEncoder* pCoder, uint16_t val) { TD_ENCODE_VARIANT_MACRO(pCoder, val); }
|
||||
static FORCE_INLINE int32_t tEncodeI16v(SEncoder* pCoder, int16_t val) {
|
||||
return tEncodeU16v(pCoder, ZIGZAGE(int16_t, val));
|
||||
}
|
||||
// 32v
|
||||
static FORCE_INLINE int32_t tEncodeU32v(SEncoder* pCoder, uint32_t val) { TD_ENCODE_VARIANT_MACRO(pCoder, val); }
|
||||
static FORCE_INLINE int32_t tEncodeU32v(SEncoder* pCoder, uint32_t val) {
|
||||
while (val >= ENCODE_LIMIT) {
|
||||
TAOS_CHECK_RETURN(tEncodeU8(pCoder, (val | ENCODE_LIMIT) & 0xff));
|
||||
val >>= 7;
|
||||
}
|
||||
return tEncodeU8(pCoder, val);
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeI32v(SEncoder* pCoder, int32_t val) {
|
||||
return tEncodeU32v(pCoder, ZIGZAGE(int32_t, val));
|
||||
}
|
||||
// 64v
|
||||
static FORCE_INLINE int32_t tEncodeU64v(SEncoder* pCoder, uint64_t val) { TD_ENCODE_VARIANT_MACRO(pCoder, val); }
|
||||
static FORCE_INLINE int32_t tEncodeU64v(SEncoder* pCoder, uint64_t val) {
|
||||
while (val >= ENCODE_LIMIT) {
|
||||
TAOS_CHECK_RETURN(tEncodeU8(pCoder, (val | ENCODE_LIMIT) & 0xff));
|
||||
val >>= 7;
|
||||
}
|
||||
return tEncodeU8(pCoder, val);
|
||||
}
|
||||
static FORCE_INLINE int32_t tEncodeI64v(SEncoder* pCoder, int64_t val) {
|
||||
return tEncodeU64v(pCoder, ZIGZAGE(int64_t, val));
|
||||
}
|
||||
|
@ -265,14 +206,16 @@ static FORCE_INLINE int32_t tEncodeDouble(SEncoder* pCoder, double val) {
|
|||
}
|
||||
|
||||
static FORCE_INLINE int32_t tEncodeBinary(SEncoder* pCoder, const uint8_t* val, uint32_t len) {
|
||||
if (tEncodeU32v(pCoder, len) < 0) return -1;
|
||||
TAOS_CHECK_RETURN(tEncodeU32v(pCoder, len));
|
||||
if (len) {
|
||||
if (pCoder->data) {
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, len)) return -1;
|
||||
memcpy(TD_CODER_CURRENT(pCoder), val, len);
|
||||
if (pCoder->pos + len > pCoder->size) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
}
|
||||
memcpy(pCoder->data + pCoder->pos, val, len);
|
||||
}
|
||||
|
||||
TD_CODER_MOVE_POS(pCoder, len);
|
||||
pCoder->pos += len;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -286,70 +229,137 @@ static FORCE_INLINE int32_t tEncodeCStr(SEncoder* pCoder, const char* val) {
|
|||
}
|
||||
|
||||
/* ------------------------ FOR DECODER ------------------------ */
|
||||
// 8
|
||||
static FORCE_INLINE int32_t tDecodeU8(SDecoder* pCoder, uint8_t* val) {
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, sizeof(*val))) return -1;
|
||||
tGet(uint8_t, TD_CODER_CURRENT(pCoder), *val);
|
||||
TD_CODER_MOVE_POS(pCoder, sizeof(*val));
|
||||
static int32_t tDecodeFixed(SDecoder* pCoder, void* val, uint32_t size) {
|
||||
if (pCoder->pos + size > pCoder->size) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
} else if (val) {
|
||||
memcpy(val, pCoder->data + pCoder->pos, size);
|
||||
}
|
||||
pCoder->pos += size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeI8(SDecoder* pCoder, int8_t* val) {
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, sizeof(*val))) return -1;
|
||||
tGet(int8_t, TD_CODER_CURRENT(pCoder), *val);
|
||||
TD_CODER_MOVE_POS(pCoder, sizeof(*val));
|
||||
return 0;
|
||||
static FORCE_INLINE int32_t tDecodeU8(SDecoder* pCoder, uint8_t* val) {
|
||||
return tDecodeFixed(pCoder, val, sizeof(*val));
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeI8(SDecoder* pCoder, int8_t* val) { return tDecodeFixed(pCoder, val, sizeof(*val)); }
|
||||
|
||||
// 16
|
||||
static FORCE_INLINE int32_t tDecodeU16(SDecoder* pCoder, uint16_t* val) { TD_DECODE_MACRO(pCoder, val, uint16_t, 16); }
|
||||
static FORCE_INLINE int32_t tDecodeI16(SDecoder* pCoder, int16_t* val) { TD_DECODE_MACRO(pCoder, val, int16_t, 16); }
|
||||
static FORCE_INLINE int32_t tDecodeU16(SDecoder* pCoder, uint16_t* val) {
|
||||
return tDecodeFixed(pCoder, val, sizeof(*val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tDecodeI16(SDecoder* pCoder, int16_t* val) {
|
||||
return tDecodeFixed(pCoder, val, sizeof(*val));
|
||||
}
|
||||
// 32
|
||||
static FORCE_INLINE int32_t tDecodeU32(SDecoder* pCoder, uint32_t* val) { TD_DECODE_MACRO(pCoder, val, uint32_t, 32); }
|
||||
static FORCE_INLINE int32_t tDecodeI32(SDecoder* pCoder, int32_t* val) { TD_DECODE_MACRO(pCoder, val, int32_t, 32); }
|
||||
static FORCE_INLINE int32_t tDecodeU32(SDecoder* pCoder, uint32_t* val) {
|
||||
return tDecodeFixed(pCoder, val, sizeof(*val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tDecodeI32(SDecoder* pCoder, int32_t* val) {
|
||||
return tDecodeFixed(pCoder, val, sizeof(*val));
|
||||
}
|
||||
// 64
|
||||
static FORCE_INLINE int32_t tDecodeU64(SDecoder* pCoder, uint64_t* val) { TD_DECODE_MACRO(pCoder, val, uint64_t, 64); }
|
||||
static FORCE_INLINE int32_t tDecodeI64(SDecoder* pCoder, int64_t* val) { TD_DECODE_MACRO(pCoder, val, int64_t, 64); }
|
||||
static FORCE_INLINE int32_t tDecodeU64(SDecoder* pCoder, uint64_t* val) {
|
||||
return tDecodeFixed(pCoder, val, sizeof(*val));
|
||||
}
|
||||
static FORCE_INLINE int32_t tDecodeI64(SDecoder* pCoder, int64_t* val) {
|
||||
return tDecodeFixed(pCoder, val, sizeof(*val));
|
||||
}
|
||||
|
||||
// 16v
|
||||
static FORCE_INLINE int32_t tDecodeU16v(SDecoder* pCoder, uint16_t* val) {
|
||||
TD_DECODE_VARIANT_MACRO(pCoder, val, uint16_t);
|
||||
uint8_t byte;
|
||||
uint16_t tval = 0;
|
||||
for (int32_t i = 0;; i++) {
|
||||
TAOS_CHECK_RETURN(tDecodeU8(pCoder, &byte));
|
||||
if (byte < ENCODE_LIMIT) {
|
||||
tval |= (((uint16_t)byte) << (7 * i));
|
||||
break;
|
||||
} else {
|
||||
tval |= ((((uint16_t)byte) & (ENCODE_LIMIT - 1)) << (7 * i));
|
||||
}
|
||||
}
|
||||
|
||||
if (val) {
|
||||
*val = tval;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeI16v(SDecoder* pCoder, int16_t* val) {
|
||||
uint16_t tval;
|
||||
if (tDecodeU16v(pCoder, &tval) < 0) {
|
||||
return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeU16v(pCoder, &tval));
|
||||
|
||||
if (val) {
|
||||
*val = ZIGZAGD(int16_t, tval);
|
||||
}
|
||||
if (val) *val = ZIGZAGD(int16_t, tval);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 32v
|
||||
static FORCE_INLINE int32_t tDecodeU32v(SDecoder* pCoder, uint32_t* val) {
|
||||
TD_DECODE_VARIANT_MACRO(pCoder, val, uint32_t);
|
||||
uint8_t byte;
|
||||
uint32_t tval = 0;
|
||||
for (int32_t i = 0;; i++) {
|
||||
TAOS_CHECK_RETURN(tDecodeU8(pCoder, &byte));
|
||||
if (byte < ENCODE_LIMIT) {
|
||||
tval |= (((uint32_t)byte) << (7 * i));
|
||||
break;
|
||||
} else {
|
||||
tval |= ((((uint32_t)byte) & (ENCODE_LIMIT - 1)) << (7 * i));
|
||||
}
|
||||
}
|
||||
|
||||
if (val) {
|
||||
*val = tval;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeI32v(SDecoder* pCoder, int32_t* val) {
|
||||
uint32_t tval;
|
||||
if (tDecodeU32v(pCoder, &tval) < 0) {
|
||||
return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeU32v(pCoder, &tval));
|
||||
|
||||
if (val) {
|
||||
*val = ZIGZAGD(int32_t, tval);
|
||||
}
|
||||
if (val) *val = ZIGZAGD(int32_t, tval);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 64v
|
||||
static FORCE_INLINE int32_t tDecodeU64v(SDecoder* pCoder, uint64_t* val) {
|
||||
TD_DECODE_VARIANT_MACRO(pCoder, val, uint64_t);
|
||||
uint8_t byte;
|
||||
uint64_t tval = 0;
|
||||
for (int32_t i = 0;; i++) {
|
||||
TAOS_CHECK_RETURN(tDecodeU8(pCoder, &byte));
|
||||
if (byte < ENCODE_LIMIT) {
|
||||
tval |= (((uint64_t)byte) << (7 * i));
|
||||
break;
|
||||
} else {
|
||||
tval |= ((((uint64_t)byte) & (ENCODE_LIMIT - 1)) << (7 * i));
|
||||
}
|
||||
}
|
||||
|
||||
if (val) {
|
||||
*val = tval;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeI64v(SDecoder* pCoder, int64_t* val) {
|
||||
uint64_t tval;
|
||||
if (tDecodeU64v(pCoder, &tval) < 0) {
|
||||
return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeU64v(pCoder, &tval));
|
||||
|
||||
if (val) {
|
||||
*val = ZIGZAGD(int64_t, tval);
|
||||
}
|
||||
if (val) *val = ZIGZAGD(int64_t, tval);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -359,11 +369,11 @@ static FORCE_INLINE int32_t tDecodeFloat(SDecoder* pCoder, float* val) {
|
|||
float f;
|
||||
} v;
|
||||
|
||||
if (tDecodeU32(pCoder, &(v.ui)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
TAOS_CHECK_RETURN(tDecodeU32(pCoder, &(v.ui)));
|
||||
|
||||
*val = v.f;
|
||||
if (val) {
|
||||
*val = v.f;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -373,30 +383,36 @@ static FORCE_INLINE int32_t tDecodeDouble(SDecoder* pCoder, double* val) {
|
|||
double d;
|
||||
} v;
|
||||
|
||||
if (tDecodeU64(pCoder, &(v.ui)) < 0) {
|
||||
return -1;
|
||||
}
|
||||
TAOS_CHECK_RETURN(tDecodeU64(pCoder, &(v.ui)));
|
||||
|
||||
*val = v.d;
|
||||
if (val) {
|
||||
*val = v.d;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeBinary(SDecoder* pCoder, uint8_t** val, uint32_t* len) {
|
||||
uint32_t length = 0;
|
||||
if (tDecodeU32v(pCoder, &length) < 0) return -1;
|
||||
if (len) *len = length;
|
||||
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, length)) return -1;
|
||||
if (val) {
|
||||
*val = (uint8_t*)TD_CODER_CURRENT(pCoder);
|
||||
TAOS_CHECK_RETURN(tDecodeU32v(pCoder, &length));
|
||||
if (len) {
|
||||
*len = length;
|
||||
}
|
||||
|
||||
TD_CODER_MOVE_POS(pCoder, length);
|
||||
if (pCoder->pos + length > pCoder->size) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
}
|
||||
|
||||
if (val) {
|
||||
*val = pCoder->data + pCoder->pos;
|
||||
}
|
||||
|
||||
pCoder->pos += length;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeCStrAndLen(SDecoder* pCoder, char** val, uint32_t* len) {
|
||||
if (tDecodeBinary(pCoder, (uint8_t**)val, len) < 0) return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeBinary(pCoder, (uint8_t**)val, len));
|
||||
(*len) -= 1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -409,7 +425,7 @@ static FORCE_INLINE int32_t tDecodeCStr(SDecoder* pCoder, char** val) {
|
|||
static int32_t tDecodeCStrTo(SDecoder* pCoder, char* val) {
|
||||
char* pStr;
|
||||
uint32_t len;
|
||||
if (tDecodeCStrAndLen(pCoder, &pStr, &len) < 0) return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeCStrAndLen(pCoder, &pStr, &len));
|
||||
|
||||
memcpy(val, pStr, len + 1);
|
||||
return 0;
|
||||
|
@ -417,16 +433,22 @@ static int32_t tDecodeCStrTo(SDecoder* pCoder, char* val) {
|
|||
|
||||
static FORCE_INLINE int32_t tDecodeBinaryAlloc(SDecoder* pCoder, void** val, uint64_t* len) {
|
||||
uint64_t length = 0;
|
||||
if (tDecodeU64v(pCoder, &length) < 0) return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeU64v(pCoder, &length));
|
||||
if (length) {
|
||||
if (len) *len = length;
|
||||
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, length)) return -1;
|
||||
*val = taosMemoryMalloc(length);
|
||||
if (*val == NULL) return -1;
|
||||
memcpy(*val, TD_CODER_CURRENT(pCoder), length);
|
||||
if (pCoder->pos + length > pCoder->size) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
}
|
||||
|
||||
TD_CODER_MOVE_POS(pCoder, length);
|
||||
*val = taosMemoryMalloc(length);
|
||||
if (*val == NULL) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
memcpy(*val, pCoder->data + pCoder->pos, length);
|
||||
|
||||
pCoder->pos += length;
|
||||
} else {
|
||||
*val = NULL;
|
||||
}
|
||||
|
@ -435,16 +457,20 @@ static FORCE_INLINE int32_t tDecodeBinaryAlloc(SDecoder* pCoder, void** val, uin
|
|||
|
||||
static FORCE_INLINE int32_t tDecodeBinaryAlloc32(SDecoder* pCoder, void** val, uint32_t* len) {
|
||||
uint32_t length = 0;
|
||||
if (tDecodeU32v(pCoder, &length) < 0) return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeU32v(pCoder, &length));
|
||||
if (length) {
|
||||
if (len) *len = length;
|
||||
|
||||
if (TD_CODER_CHECK_CAPACITY_FAILED(pCoder, length)) return -1;
|
||||
if (pCoder->pos + length > pCoder->size) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
}
|
||||
*val = taosMemoryMalloc(length);
|
||||
if (*val == NULL) return -1;
|
||||
memcpy(*val, TD_CODER_CURRENT(pCoder), length);
|
||||
if (*val == NULL) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
|
||||
}
|
||||
memcpy(*val, pCoder->data + pCoder->pos, length);
|
||||
|
||||
TD_CODER_MOVE_POS(pCoder, length);
|
||||
pCoder->pos += length;
|
||||
} else {
|
||||
*val = NULL;
|
||||
}
|
||||
|
@ -452,7 +478,7 @@ static FORCE_INLINE int32_t tDecodeBinaryAlloc32(SDecoder* pCoder, void** val, u
|
|||
}
|
||||
|
||||
static FORCE_INLINE int32_t tDecodeCStrAndLenAlloc(SDecoder* pCoder, char** val, uint64_t* len) {
|
||||
if (tDecodeBinaryAlloc(pCoder, (void**)val, len) < 0) return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeBinaryAlloc(pCoder, (void**)val, len));
|
||||
(*len) -= 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -72,10 +72,14 @@ int32_t tStartEncode(SEncoder* pCoder) {
|
|||
SEncoderNode* pNode;
|
||||
|
||||
if (pCoder->data) {
|
||||
if (pCoder->size - pCoder->pos < sizeof(int32_t)) return -1;
|
||||
if (pCoder->size - pCoder->pos < sizeof(int32_t)) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
}
|
||||
|
||||
pNode = tEncoderMalloc(pCoder, sizeof(*pNode));
|
||||
if (pNode == NULL) return -1;
|
||||
if (pNode == NULL) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
pNode->data = pCoder->data;
|
||||
pNode->pos = pCoder->pos;
|
||||
|
@ -111,7 +115,7 @@ void tEndEncode(SEncoder* pCoder) {
|
|||
|
||||
(void)tEncodeI32(pCoder, len);
|
||||
|
||||
TD_CODER_MOVE_POS(pCoder, len);
|
||||
pCoder->pos += len;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -119,10 +123,12 @@ int32_t tStartDecode(SDecoder* pCoder) {
|
|||
SDecoderNode* pNode;
|
||||
int32_t len;
|
||||
|
||||
if (tDecodeI32(pCoder, &len) < 0) return -1;
|
||||
TAOS_CHECK_RETURN(tDecodeI32(pCoder, &len));
|
||||
|
||||
pNode = tDecoderMalloc(pCoder, sizeof(*pNode));
|
||||
if (pNode == NULL) return -1;
|
||||
if (pNode == NULL) {
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
pNode->data = pCoder->data;
|
||||
pNode->pos = pCoder->pos;
|
||||
|
|
Loading…
Reference in New Issue