X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffmt.c;h=be83be57936443bcd2af45a64ffba06761f357a0;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=af317cfbd7fa0699ad7663d7db766216b4bd5158;hpb=72cfa31520ebc0058763a30e21c13f6e9a964aa0;p=silc.git diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index af317cfb..be83be57 100644 --- a/lib/silcutil/silcbuffmt.c +++ b/lib/silcutil/silcbuffmt.c @@ -40,10 +40,20 @@ do { \ int silc_buffer_format(SilcBuffer dst, ...) { va_list ap; - SilcBufferParamType fmt; - unsigned char *start_ptr = dst->data; + int ret; va_start(ap, dst); + ret = silc_buffer_format_vp(dst, ap); + va_end(ap); + + return ret; +} + +int silc_buffer_format_vp(SilcBuffer dst, va_list ap) +{ + SilcBufferParamType fmt; + unsigned char *start_ptr = dst->data; + int len; /* Parse the arguments by formatting type. */ while(1) { @@ -69,7 +79,7 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_SI16_SHORT: { unsigned char xf[2]; - int16 x = (int16)va_arg(ap, int); + SilcInt16 x = (SilcInt16)va_arg(ap, int); HAS_SPACE(dst, 2); SILC_PUT16_MSB(x, xf); silc_buffer_put(dst, xf, 2); @@ -79,7 +89,7 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_UI16_SHORT: { unsigned char xf[2]; - uint16 x = (uint16)va_arg(ap, int); + SilcUInt16 x = (SilcUInt16)va_arg(ap, int); HAS_SPACE(dst, 2); SILC_PUT16_MSB(x, xf); silc_buffer_put(dst, xf, 2); @@ -89,7 +99,7 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_SI32_INT: { unsigned char xf[4]; - int32 x = va_arg(ap, int32); + SilcInt32 x = va_arg(ap, SilcInt32); HAS_SPACE(dst, 4); SILC_PUT32_MSB(x, xf); silc_buffer_put(dst, xf, 4); @@ -99,34 +109,58 @@ int silc_buffer_format(SilcBuffer dst, ...) case SILC_BUFFER_PARAM_UI32_INT: { unsigned char xf[4]; - uint32 x = va_arg(ap, uint32); + SilcUInt32 x = va_arg(ap, SilcUInt32); HAS_SPACE(dst, 4); SILC_PUT32_MSB(x, xf); silc_buffer_put(dst, xf, 4); silc_buffer_pull(dst, 4); break; } + case SILC_BUFFER_PARAM_SI64_INT: + { + unsigned char xf[8]; + SilcInt64 x = va_arg(ap, SilcInt64); + HAS_SPACE(dst, 8); + SILC_PUT64_MSB(x, xf); + silc_buffer_put(dst, xf, 8); + silc_buffer_pull(dst, 8); + break; + } + case SILC_BUFFER_PARAM_UI64_INT: + { + unsigned char xf[8]; + SilcUInt64 x = va_arg(ap, SilcUInt64); + HAS_SPACE(dst, 8); + SILC_PUT64_MSB(x, xf); + silc_buffer_put(dst, xf, 8); + silc_buffer_pull(dst, 8); + break; + } + case SILC_BUFFER_PARAM_UI8_STRING: case SILC_BUFFER_PARAM_UI16_STRING: case SILC_BUFFER_PARAM_UI32_STRING: + case SILC_BUFFER_PARAM_UI8_STRING_ALLOC: case SILC_BUFFER_PARAM_UI16_STRING_ALLOC: case SILC_BUFFER_PARAM_UI32_STRING_ALLOC: { unsigned char *x = va_arg(ap, unsigned char *); - uint32 tmp_len = strlen(x); + SilcUInt32 tmp_len = strlen(x); HAS_SPACE(dst, tmp_len); silc_buffer_put(dst, x, tmp_len); silc_buffer_pull(dst, tmp_len); break; } + case SILC_BUFFER_PARAM_UI8_NSTRING: case SILC_BUFFER_PARAM_UI16_NSTRING: case SILC_BUFFER_PARAM_UI32_NSTRING: case SILC_BUFFER_PARAM_UI_XNSTRING: + case SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC: case SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC: case SILC_BUFFER_PARAM_UI32_NSTRING_ALLOC: case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC: { unsigned char *x = va_arg(ap, unsigned char *); - uint32 len = va_arg(ap, uint32); + SilcUInt32 len = va_arg(ap, SilcUInt32); HAS_SPACE(dst, len); silc_buffer_put(dst, x, len); silc_buffer_pull(dst, len); @@ -149,8 +183,9 @@ int silc_buffer_format(SilcBuffer dst, ...) ok: /* Push the buffer back to where it belongs. */ - silc_buffer_push(dst, dst->data - start_ptr); - return dst->len; + len = dst->data - start_ptr; + silc_buffer_push(dst, len); + return len; } /* Unformats the buffer sent as argument. The unformatted data is returned @@ -161,12 +196,21 @@ int silc_buffer_format(SilcBuffer dst, ...) int silc_buffer_unformat(SilcBuffer src, ...) { va_list ap; + int ret; + + va_start(ap, src); + ret = silc_buffer_unformat_vp(src, ap); + va_end(ap); + + return ret; +} + +int silc_buffer_unformat_vp(SilcBuffer src, va_list ap) +{ SilcBufferParamType fmt; unsigned char *start_ptr = src->data; int len = 0; - va_start(ap, src); - /* Parse the arguments by formatting type. */ while(1) { fmt = va_arg(ap, SilcBufferParamType); @@ -192,7 +236,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_SI16_SHORT: { - int16 *x = va_arg(ap, int16 *); + SilcInt16 *x = va_arg(ap, SilcInt16 *); HAS_SPACE(src, 2); if (x) SILC_GET16_MSB(*x, src->data); @@ -201,7 +245,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI16_SHORT: { - uint16 *x = va_arg(ap, uint16 *); + SilcUInt16 *x = va_arg(ap, SilcUInt16 *); HAS_SPACE(src, 2); if (x) SILC_GET16_MSB(*x, src->data); @@ -210,7 +254,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_SI32_INT: { - int32 *x = va_arg(ap, int32 *); + SilcInt32 *x = va_arg(ap, SilcInt32 *); HAS_SPACE(src, 4); if (x) SILC_GET32_MSB(*x, src->data); @@ -219,16 +263,47 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_INT: { - uint32 *x = va_arg(ap, uint32 *); + SilcUInt32 *x = va_arg(ap, SilcUInt32 *); HAS_SPACE(src, 4); if (x) SILC_GET32_MSB(*x, src->data); silc_buffer_pull(src, 4); break; } + case SILC_BUFFER_PARAM_SI64_INT: + { + SilcInt64 *x = va_arg(ap, SilcInt64 *); + HAS_SPACE(src, 8); + if (x) + SILC_GET64_MSB(*x, src->data); + silc_buffer_pull(src, 8); + break; + } + case SILC_BUFFER_PARAM_UI64_INT: + { + SilcUInt64 *x = va_arg(ap, SilcUInt64 *); + HAS_SPACE(src, 8); + if (x) + SILC_GET64_MSB(*x, src->data); + silc_buffer_pull(src, 8); + break; + } + case SILC_BUFFER_PARAM_UI8_STRING: + { + SilcUInt8 len2; + unsigned char **x = va_arg(ap, unsigned char **); + HAS_SPACE(src, 1); + len2 = (SilcUInt8)src->data[0]; + silc_buffer_pull(src, 1); + HAS_SPACE(src, len2); + if (x) + *x = src->data; + silc_buffer_pull(src, len2); + break; + } case SILC_BUFFER_PARAM_UI16_STRING: { - uint16 len2; + SilcUInt16 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); @@ -239,9 +314,24 @@ int silc_buffer_unformat(SilcBuffer src, ...) silc_buffer_pull(src, len2); break; } + case SILC_BUFFER_PARAM_UI8_STRING_ALLOC: + { + SilcUInt8 len2; + unsigned char **x = va_arg(ap, unsigned char **); + HAS_SPACE(src, 1); + len2 = (SilcUInt8)src->data[0]; + silc_buffer_pull(src, 1); + HAS_SPACE(src, len2); + if (x && len2) { + *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + memcpy(*x, src->data, len2); + } + silc_buffer_pull(src, len2); + break; + } case SILC_BUFFER_PARAM_UI16_STRING_ALLOC: { - uint16 len2; + SilcUInt16 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); @@ -256,7 +346,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_STRING: { - uint32 len2; + SilcUInt32 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 4); SILC_GET32_MSB(len2, src->data); @@ -269,7 +359,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_STRING_ALLOC: { - uint32 len2; + SilcUInt32 len2; unsigned char **x = va_arg(ap, unsigned char **); HAS_SPACE(src, 4); SILC_GET32_MSB(len2, src->data); @@ -282,11 +372,27 @@ int silc_buffer_unformat(SilcBuffer src, ...) silc_buffer_pull(src, len2); break; } + case SILC_BUFFER_PARAM_UI8_NSTRING: + { + SilcUInt8 len2; + unsigned char **x = va_arg(ap, unsigned char **); + SilcUInt8 *len = va_arg(ap, SilcUInt8 *); + HAS_SPACE(src, 1); + len2 = (SilcUInt8)src->data[0]; + silc_buffer_pull(src, 1); + HAS_SPACE(src, len2); + if (len) + *len = len2; + if (x) + *x = src->data; + silc_buffer_pull(src, len2); + break; + } case SILC_BUFFER_PARAM_UI16_NSTRING: { - uint16 len2; + SilcUInt16 len2; unsigned char **x = va_arg(ap, unsigned char **); - uint16 *len = va_arg(ap, unsigned short *); + SilcUInt16 *len = va_arg(ap, SilcUInt16 *); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); silc_buffer_pull(src, 2); @@ -298,11 +404,29 @@ int silc_buffer_unformat(SilcBuffer src, ...) silc_buffer_pull(src, len2); break; } + case SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC: + { + SilcUInt8 len2; + unsigned char **x = va_arg(ap, unsigned char **); + SilcUInt8 *len = va_arg(ap, SilcUInt8 *); + HAS_SPACE(src, 1); + len2 = (SilcUInt8)src->data[0]; + silc_buffer_pull(src, 1); + HAS_SPACE(src, len2); + if (len) + *len = len2; + if (x && len2) { + *x = silc_calloc(len2 + 1, sizeof(unsigned char)); + memcpy(*x, src->data, len2); + } + silc_buffer_pull(src, len2); + break; + } case SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC: { - uint16 len2; + SilcUInt16 len2; unsigned char **x = va_arg(ap, unsigned char **); - uint16 *len = va_arg(ap, uint16 *); + SilcUInt16 *len = va_arg(ap, SilcUInt16 *); HAS_SPACE(src, 2); SILC_GET16_MSB(len2, src->data); silc_buffer_pull(src, 2); @@ -318,9 +442,9 @@ int silc_buffer_unformat(SilcBuffer src, ...) } case SILC_BUFFER_PARAM_UI32_NSTRING: { - uint32 len2; + SilcUInt32 len2; unsigned char **x = va_arg(ap, unsigned char **); - uint32 *len = va_arg(ap, uint32 *); + SilcUInt32 *len = va_arg(ap, SilcUInt32 *); HAS_SPACE(src, 4); SILC_GET32_MSB(len2, src->data); silc_buffer_pull(src, 4); @@ -335,7 +459,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) case SILC_BUFFER_PARAM_UI_XNSTRING: { unsigned char **x = va_arg(ap, unsigned char **); - uint32 len = va_arg(ap, uint32); + SilcUInt32 len = va_arg(ap, SilcUInt32); HAS_SPACE(src, len); if (len && x) *x = src->data; @@ -345,7 +469,7 @@ int silc_buffer_unformat(SilcBuffer src, ...) case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC: { unsigned char **x = va_arg(ap, unsigned char **); - uint32 len = va_arg(ap, uint32); + SilcUInt32 len = va_arg(ap, SilcUInt32); HAS_SPACE(src, len); if (len && x) { *x = silc_calloc(len + 1, sizeof(unsigned char));