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) {
case SILC_BUFFER_PARAM_SI16_SHORT:
{
unsigned char xf[2];
- short x = (short)va_arg(ap, int);
+ int16 x = (int16)va_arg(ap, int);
HAS_SPACE(dst, 2);
SILC_PUT16_MSB(x, xf);
silc_buffer_put(dst, xf, 2);
case SILC_BUFFER_PARAM_UI16_SHORT:
{
unsigned char xf[2];
- unsigned short x = (unsigned short)va_arg(ap, int);
+ uint16 x = (uint16)va_arg(ap, int);
HAS_SPACE(dst, 2);
SILC_PUT16_MSB(x, xf);
silc_buffer_put(dst, xf, 2);
case SILC_BUFFER_PARAM_SI32_INT:
{
unsigned char xf[4];
- int x = va_arg(ap, int);
+ int32 x = va_arg(ap, int32);
HAS_SPACE(dst, 4);
SILC_PUT32_MSB(x, xf);
silc_buffer_put(dst, xf, 4);
case SILC_BUFFER_PARAM_UI32_INT:
{
unsigned char xf[4];
- unsigned int x = va_arg(ap, unsigned int);
+ uint32 x = va_arg(ap, uint32);
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];
+ 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:
case SILC_BUFFER_PARAM_UI32_STRING_ALLOC:
{
unsigned char *x = va_arg(ap, unsigned char *);
- int tmp_len = strlen(x);
+ uint32 tmp_len = strlen(x);
HAS_SPACE(dst, tmp_len);
silc_buffer_put(dst, x, tmp_len);
silc_buffer_pull(dst, tmp_len);
case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC:
{
unsigned char *x = va_arg(ap, unsigned char *);
- unsigned int len = va_arg(ap, unsigned int);
+ uint32 len = va_arg(ap, uint32);
HAS_SPACE(dst, len);
silc_buffer_put(dst, x, len);
silc_buffer_pull(dst, len);
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
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);
}
case SILC_BUFFER_PARAM_SI16_SHORT:
{
- short *x = va_arg(ap, short *);
+ int16 *x = va_arg(ap, int16 *);
HAS_SPACE(src, 2);
if (x)
SILC_GET16_MSB(*x, src->data);
}
case SILC_BUFFER_PARAM_UI16_SHORT:
{
- unsigned short *x = va_arg(ap, unsigned short *);
+ uint16 *x = va_arg(ap, uint16 *);
HAS_SPACE(src, 2);
if (x)
SILC_GET16_MSB(*x, src->data);
}
case SILC_BUFFER_PARAM_SI32_INT:
{
- int *x = va_arg(ap, int *);
+ int32 *x = va_arg(ap, int32 *);
HAS_SPACE(src, 4);
if (x)
SILC_GET32_MSB(*x, src->data);
}
case SILC_BUFFER_PARAM_UI32_INT:
{
- unsigned int *x = va_arg(ap, unsigned int *);
+ uint32 *x = va_arg(ap, uint32 *);
HAS_SPACE(src, 4);
if (x)
SILC_GET32_MSB(*x, src->data);
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:
{
- unsigned short len2;
+ uint16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
}
case SILC_BUFFER_PARAM_UI16_STRING_ALLOC:
{
- unsigned short len2;
+ uint16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
HAS_SPACE(src, len2);
- if (x) {
+ if (x && len2) {
*x = silc_calloc(len2 + 1, sizeof(unsigned char));
memcpy(*x, src->data, len2);
}
}
case SILC_BUFFER_PARAM_UI32_STRING:
{
- unsigned int len2;
+ uint32 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 4);
SILC_GET32_MSB(len2, src->data);
}
case SILC_BUFFER_PARAM_UI32_STRING_ALLOC:
{
- unsigned int len2;
+ uint32 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 4);
SILC_GET32_MSB(len2, src->data);
silc_buffer_pull(src, 4);
HAS_SPACE(src, len2);
- if (x) {
+ if (x && len2) {
*x = silc_calloc(len2 + 1, sizeof(unsigned char));
memcpy(*x, src->data, len2);
}
}
case SILC_BUFFER_PARAM_UI16_NSTRING:
{
- unsigned short len2;
+ uint16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned short *len = va_arg(ap, unsigned short *);
+ uint16 *len = va_arg(ap, unsigned short *);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
}
case SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC:
{
- unsigned short len2;
+ uint16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned short *len = va_arg(ap, unsigned short *);
+ uint16 *len = va_arg(ap, uint16 *);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
HAS_SPACE(src, len2);
if (len)
*len = len2;
- if (x) {
+ if (x && len2) {
*x = silc_calloc(len2 + 1, sizeof(unsigned char));
memcpy(*x, src->data, len2);
}
}
case SILC_BUFFER_PARAM_UI32_NSTRING:
{
- unsigned int len2;
+ uint32 len2;
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned int *len = va_arg(ap, unsigned int *);
+ uint32 *len = va_arg(ap, uint32 *);
HAS_SPACE(src, 4);
SILC_GET32_MSB(len2, src->data);
silc_buffer_pull(src, 4);
case SILC_BUFFER_PARAM_UI_XNSTRING:
{
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned int len = va_arg(ap, unsigned int);
+ uint32 len = va_arg(ap, uint32);
HAS_SPACE(src, len);
if (len && x)
*x = src->data;
case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC:
{
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned int len = va_arg(ap, unsigned int);
+ uint32 len = va_arg(ap, uint32);
HAS_SPACE(src, len);
if (len && x) {
*x = silc_calloc(len + 1, sizeof(unsigned char));