updates.
[silc.git] / lib / silcutil / silcbuffmt.c
index ae5a27aecd8f65abb1ff56608de55f6666b5e4c4..cc1a4ce238ab7f604d6750df0934305fabefc11c 100644 (file)
@@ -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];
-       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);
@@ -79,7 +89,7 @@ int silc_buffer_format(SilcBuffer dst, ...)
     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);
@@ -89,7 +99,7 @@ int silc_buffer_format(SilcBuffer dst, ...)
     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);
@@ -99,20 +109,40 @@ int silc_buffer_format(SilcBuffer dst, ...)
     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);
@@ -126,7 +156,7 @@ int silc_buffer_format(SilcBuffer dst, ...)
     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);
@@ -145,15 +175,13 @@ int silc_buffer_format(SilcBuffer dst, ...)
 
  fail:
   SILC_LOG_DEBUG(("Error occured while formatting data"));
-#ifdef SILC_DEBUG
-  assert(FALSE);
-#endif
   return -1;
 
  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
@@ -164,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);
@@ -195,7 +232,7 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
@@ -204,7 +241,7 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
@@ -213,7 +250,7 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
@@ -222,16 +259,34 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
@@ -244,13 +299,13 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
        }
@@ -259,7 +314,7 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
@@ -272,13 +327,13 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
        }
@@ -287,9 +342,9 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
@@ -303,16 +358,16 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
        }
@@ -321,9 +376,9 @@ int silc_buffer_unformat(SilcBuffer src, ...)
       }
     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);
@@ -338,7 +393,7 @@ int silc_buffer_unformat(SilcBuffer src, ...)
     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;
@@ -348,7 +403,7 @@ int silc_buffer_unformat(SilcBuffer src, ...)
     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));
@@ -370,9 +425,6 @@ int silc_buffer_unformat(SilcBuffer src, ...)
 
  fail:
   SILC_LOG_DEBUG(("Error occured while unformatting buffer"));
-#ifdef SILC_DEBUG
-  assert(FALSE);
-#endif
   return -1;
 
  ok: