X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffmt.c;h=cc1a4ce238ab7f604d6750df0934305fabefc11c;hp=af317cfbd7fa0699ad7663d7db766216b4bd5158;hb=e5d8d3db6caa344b3d419b884556c21b15e7d123;hpb=2ccba0fda23268cb45841b5984fc31b4287a3d4b diff --git a/lib/silcutil/silcbuffmt.c b/lib/silcutil/silcbuffmt.c index af317cfb..cc1a4ce2 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) { @@ -106,6 +116,26 @@ int silc_buffer_format(SilcBuffer dst, ...) silc_buffer_pull(dst, 4); break; } + case SILC_BUFFER_PARAM_SI64_INT: + { + unsigned char xf[8]; + int64 x = va_arg(ap, int64); + 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]; + uint64 x = va_arg(ap, uint64); + 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_UI16_STRING: case SILC_BUFFER_PARAM_UI32_STRING: case SILC_BUFFER_PARAM_UI16_STRING_ALLOC: @@ -149,8 +179,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 +192,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); @@ -226,6 +266,24 @@ int silc_buffer_unformat(SilcBuffer src, ...) silc_buffer_pull(src, 4); break; } + case SILC_BUFFER_PARAM_SI64_INT: + { + int64 *x = va_arg(ap, int64 *); + HAS_SPACE(src, 8); + if (x) + SILC_GET64_MSB(*x, src->data); + silc_buffer_pull(src, 8); + break; + } + case SILC_BUFFER_PARAM_UI64_INT: + { + uint64 *x = va_arg(ap, uint64 *); + HAS_SPACE(src, 8); + if (x) + SILC_GET64_MSB(*x, src->data); + silc_buffer_pull(src, 8); + break; + } case SILC_BUFFER_PARAM_UI16_STRING: { uint16 len2;