Added SILC_STR_BUFFER to format SilcBuffer.
authorPekka Riikonen <priikone@silcnet.org>
Sun, 22 Oct 2006 10:35:10 +0000 (10:35 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 22 Oct 2006 10:35:10 +0000 (10:35 +0000)
lib/silcutil/silcbuffmt.c
lib/silcutil/silcbuffmt.h

index 902d28055c3ad01e7acabfd5db5b7fb4678757be..1ec22d00705206bcb4c521b865df8d1a908eadd3 100644 (file)
@@ -85,7 +85,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
     fmt = va_arg(ap, SilcBufferParamType);
 
     switch(fmt) {
-    case SILC_BUFFER_PARAM_OFFSET:
+    case SILC_PARAM_OFFSET:
       {
        int offst = va_arg(ap, int);
        if (!offst)
@@ -101,7 +101,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        }
        break;
       }
-    case SILC_BUFFER_PARAM_SI8_CHAR:
+    case SILC_PARAM_SI8_CHAR:
       {
        char x = (char)va_arg(ap, int);
        FORMAT_HAS_SPACE(stack, dst, 1);
@@ -109,7 +109,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 1);
        break;
       }
-    case SILC_BUFFER_PARAM_UI8_CHAR:
+    case SILC_PARAM_UI8_CHAR:
       {
        unsigned char x = (unsigned char)va_arg(ap, int);
        FORMAT_HAS_SPACE(stack, dst, 1);
@@ -117,7 +117,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 1);
        break;
       }
-    case SILC_BUFFER_PARAM_SI16_SHORT:
+    case SILC_PARAM_SI16_SHORT:
       {
        unsigned char xf[2];
        SilcInt16 x = (SilcInt16)va_arg(ap, int);
@@ -127,7 +127,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI16_SHORT:
+    case SILC_PARAM_UI16_SHORT:
       {
        unsigned char xf[2];
        SilcUInt16 x = (SilcUInt16)va_arg(ap, int);
@@ -137,7 +137,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 2);
        break;
       }
-    case SILC_BUFFER_PARAM_SI32_INT:
+    case SILC_PARAM_SI32_INT:
       {
        unsigned char xf[4];
        SilcInt32 x = va_arg(ap, SilcInt32);
@@ -147,7 +147,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 4);
        break;
       }
-    case SILC_BUFFER_PARAM_UI32_INT:
+    case SILC_PARAM_UI32_INT:
       {
        unsigned char xf[4];
        SilcUInt32 x = va_arg(ap, SilcUInt32);
@@ -157,7 +157,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 4);
        break;
       }
-    case SILC_BUFFER_PARAM_SI64_INT:
+    case SILC_PARAM_SI64_INT:
       {
        unsigned char xf[8];
        SilcInt64 x = va_arg(ap, SilcInt64);
@@ -167,7 +167,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, sizeof(SilcInt64));
        break;
       }
-    case SILC_BUFFER_PARAM_UI64_INT:
+    case SILC_PARAM_UI64_INT:
       {
        unsigned char xf[8];
        SilcUInt64 x = va_arg(ap, SilcUInt64);
@@ -177,12 +177,12 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, sizeof(SilcUInt64));
        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:
+    case SILC_PARAM_UI8_STRING:
+    case SILC_PARAM_UI16_STRING:
+    case SILC_PARAM_UI32_STRING:
+    case SILC_PARAM_UI8_STRING_ALLOC:
+    case SILC_PARAM_UI16_STRING_ALLOC:
+    case SILC_PARAM_UI32_STRING_ALLOC:
       {
        unsigned char *x = va_arg(ap, unsigned char *);
        SilcUInt32 tmp_len = strlen(x);
@@ -191,16 +191,16 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        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_DATA:
-    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:
-    case SILC_BUFFER_PARAM_DATA_ALLOC:
+    case SILC_PARAM_UI8_NSTRING:
+    case SILC_PARAM_UI16_NSTRING:
+    case SILC_PARAM_UI32_NSTRING:
+    case SILC_PARAM_UI_XNSTRING:
+    case SILC_PARAM_DATA:
+    case SILC_PARAM_UI8_NSTRING_ALLOC:
+    case SILC_PARAM_UI16_NSTRING_ALLOC:
+    case SILC_PARAM_UI32_NSTRING_ALLOC:
+    case SILC_PARAM_UI_XNSTRING_ALLOC:
+    case SILC_PARAM_DATA_ALLOC:
       {
        unsigned char *x = va_arg(ap, unsigned char *);
        SilcUInt32 tmp_len = va_arg(ap, SilcUInt32);
@@ -211,10 +211,25 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        }
        break;
       }
-    case SILC_BUFFER_PARAM_END:
+    case SILC_PARAM_BUFFER:
+    case SILC_PARAM_BUFFER_ALLOC:
+      {
+       SilcBuffer x = va_arg(ap, SilcBuffer);
+       unsigned char xf[4];
+       if (x && silc_buffer_len(x)) {
+         FORMAT_HAS_SPACE(stack, dst, silc_buffer_len(x) + 4);
+         SILC_PUT32_MSB(silc_buffer_len(x), xf);
+         silc_buffer_put(dst, xf, 4);
+         silc_buffer_pull(dst, 4);
+         silc_buffer_put(dst, silc_buffer_data(x), silc_buffer_len(x));
+         silc_buffer_pull(dst, silc_buffer_len(x));
+       }
+      }
+      break;
+    case SILC_PARAM_END:
       goto ok;
       break;
-    case SILC_BUFFER_PARAM_ADVANCE:
+    case SILC_PARAM_ADVANCE:
       advance = TRUE;
       break;
     default:
@@ -264,7 +279,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
     fmt = va_arg(ap, SilcBufferParamType);
 
     switch(fmt) {
-    case SILC_BUFFER_PARAM_OFFSET:
+    case SILC_PARAM_OFFSET:
       {
        int offst = va_arg(ap, int);
        if (!offst)
@@ -277,7 +292,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        }
        break;
       }
-    case SILC_BUFFER_PARAM_SI8_CHAR:
+    case SILC_PARAM_SI8_CHAR:
       {
        char *x = va_arg(ap, char *);
        UNFORMAT_HAS_SPACE(src, 1);
@@ -286,7 +301,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 1);
        break;
       }
-    case SILC_BUFFER_PARAM_UI8_CHAR:
+    case SILC_PARAM_UI8_CHAR:
       {
        unsigned char *x = va_arg(ap, unsigned char *);
        UNFORMAT_HAS_SPACE(src, 1);
@@ -295,7 +310,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 1);
        break;
       }
-    case SILC_BUFFER_PARAM_SI16_SHORT:
+    case SILC_PARAM_SI16_SHORT:
       {
        SilcInt16 *x = va_arg(ap, SilcInt16 *);
        UNFORMAT_HAS_SPACE(src, 2);
@@ -304,7 +319,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI16_SHORT:
+    case SILC_PARAM_UI16_SHORT:
       {
        SilcUInt16 *x = va_arg(ap, SilcUInt16 *);
        UNFORMAT_HAS_SPACE(src, 2);
@@ -313,7 +328,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 2);
        break;
       }
-    case SILC_BUFFER_PARAM_SI32_INT:
+    case SILC_PARAM_SI32_INT:
       {
        SilcInt32 *x = va_arg(ap, SilcInt32 *);
        UNFORMAT_HAS_SPACE(src, 4);
@@ -322,7 +337,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 4);
        break;
       }
-    case SILC_BUFFER_PARAM_UI32_INT:
+    case SILC_PARAM_UI32_INT:
       {
        SilcUInt32 *x = va_arg(ap, SilcUInt32 *);
        UNFORMAT_HAS_SPACE(src, 4);
@@ -331,7 +346,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 4);
        break;
       }
-    case SILC_BUFFER_PARAM_SI64_INT:
+    case SILC_PARAM_SI64_INT:
       {
        SilcInt64 *x = va_arg(ap, SilcInt64 *);
        UNFORMAT_HAS_SPACE(src, sizeof(SilcInt64));
@@ -340,7 +355,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, sizeof(SilcInt64));
        break;
       }
-    case SILC_BUFFER_PARAM_UI64_INT:
+    case SILC_PARAM_UI64_INT:
       {
        SilcUInt64 *x = va_arg(ap, SilcUInt64 *);
        UNFORMAT_HAS_SPACE(src, sizeof(SilcUInt64));
@@ -349,7 +364,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, sizeof(SilcUInt64));
        break;
       }
-    case SILC_BUFFER_PARAM_UI8_STRING:
+    case SILC_PARAM_UI8_STRING:
       {
        SilcUInt8 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -362,7 +377,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI16_STRING:
+    case SILC_PARAM_UI16_STRING:
       {
        SilcUInt16 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -375,7 +390,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI8_STRING_ALLOC:
+    case SILC_PARAM_UI8_STRING_ALLOC:
       {
        SilcUInt8 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -390,7 +405,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI16_STRING_ALLOC:
+    case SILC_PARAM_UI16_STRING_ALLOC:
       {
        SilcUInt16 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -405,7 +420,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI32_STRING:
+    case SILC_PARAM_UI32_STRING:
       {
        SilcUInt32 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -418,7 +433,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI32_STRING_ALLOC:
+    case SILC_PARAM_UI32_STRING_ALLOC:
       {
        SilcUInt32 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -433,49 +448,49 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI8_NSTRING:
+    case SILC_PARAM_UI8_NSTRING:
       {
        SilcUInt8 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
-       SilcUInt8 *len = va_arg(ap, SilcUInt8 *);
+       SilcUInt8 *len3 = va_arg(ap, SilcUInt8 *);
        UNFORMAT_HAS_SPACE(src, 1);
        len2 = (SilcUInt8)src->data[0];
        silc_buffer_pull(src, 1);
        UNFORMAT_HAS_SPACE(src, len2);
-       if (len)
-         *len = len2;
+       if (len3)
+         *len3 = len2;
        if (x)
          *x = src->data;
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI16_NSTRING:
+    case SILC_PARAM_UI16_NSTRING:
       {
        SilcUInt16 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
-       SilcUInt16 *len = va_arg(ap, SilcUInt16 *);
+       SilcUInt16 *len3 = va_arg(ap, SilcUInt16 *);
        UNFORMAT_HAS_SPACE(src, 2);
        SILC_GET16_MSB(len2, src->data);
        silc_buffer_pull(src, 2);
        UNFORMAT_HAS_SPACE(src, len2);
-       if (len)
-         *len = len2;
+       if (len3)
+         *len3 = len2;
        if (x)
          *x = src->data;
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC:
+    case SILC_PARAM_UI8_NSTRING_ALLOC:
       {
        SilcUInt8 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
-       SilcUInt8 *len = va_arg(ap, SilcUInt8 *);
+       SilcUInt8 *len3 = va_arg(ap, SilcUInt8 *);
        UNFORMAT_HAS_SPACE(src, 1);
        len2 = (SilcUInt8)src->data[0];
        silc_buffer_pull(src, 1);
        UNFORMAT_HAS_SPACE(src, len2);
-       if (len)
-         *len = len2;
+       if (len3)
+         *len3 = len2;
        if (x && len2) {
          *x = silc_calloc(len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
@@ -483,17 +498,17 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC:
+    case SILC_PARAM_UI16_NSTRING_ALLOC:
       {
        SilcUInt16 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
-       SilcUInt16 *len = va_arg(ap, SilcUInt16 *);
+       SilcUInt16 *len3 = va_arg(ap, SilcUInt16 *);
        UNFORMAT_HAS_SPACE(src, 2);
        SILC_GET16_MSB(len2, src->data);
        silc_buffer_pull(src, 2);
        UNFORMAT_HAS_SPACE(src, len2);
-       if (len)
-         *len = len2;
+       if (len3)
+         *len3 = len2;
        if (x && len2) {
          *x = silc_calloc(len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
@@ -501,50 +516,76 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI32_NSTRING:
+    case SILC_PARAM_UI32_NSTRING:
       {
        SilcUInt32 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
-       SilcUInt32 *len = va_arg(ap, SilcUInt32 *);
+       SilcUInt32 *len3 = va_arg(ap, SilcUInt32 *);
        UNFORMAT_HAS_SPACE(src, 4);
        SILC_GET32_MSB(len2, src->data);
        silc_buffer_pull(src, 4);
        UNFORMAT_HAS_SPACE(src, len2);
-       if (len)
-         *len = len2;
+       if (len3)
+         *len3 = len2;
        if (x)
          *x = src->data;
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI_XNSTRING:
-    case SILC_BUFFER_PARAM_DATA:
+    case SILC_PARAM_UI_XNSTRING:
+    case SILC_PARAM_DATA:
       {
        unsigned char **x = va_arg(ap, unsigned char **);
-       SilcUInt32 len = va_arg(ap, SilcUInt32);
-       UNFORMAT_HAS_SPACE(src, len);
-       if (len && x)
+       SilcUInt32 len2 = va_arg(ap, SilcUInt32);
+       UNFORMAT_HAS_SPACE(src, len2);
+       if (len2 && x)
          *x = src->data;
-       silc_buffer_pull(src, len);
+       silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC:
-    case SILC_BUFFER_PARAM_DATA_ALLOC:
+    case SILC_PARAM_UI_XNSTRING_ALLOC:
+    case SILC_PARAM_DATA_ALLOC:
       {
        unsigned char **x = va_arg(ap, unsigned char **);
-       SilcUInt32 len = va_arg(ap, SilcUInt32);
-       UNFORMAT_HAS_SPACE(src, len);
-       if (len && x) {
-         *x = silc_calloc(len + 1, sizeof(unsigned char));
-         memcpy(*x, src->data, len);
+       SilcUInt32 len2 = va_arg(ap, SilcUInt32);
+       UNFORMAT_HAS_SPACE(src, len2);
+       if (len2 && x) {
+         *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+         memcpy(*x, src->data, len2);
        }
-       silc_buffer_pull(src, len);
+       silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_BUFFER_PARAM_END:
+    case SILC_PARAM_BUFFER:
+      {
+       SilcBuffer x = va_arg(ap, SilcBuffer);
+       SilcUInt32 len2;
+       UNFORMAT_HAS_SPACE(src, 4);
+       SILC_GET32_MSB(len2, src->data);
+       silc_buffer_pull(src, 4);
+       UNFORMAT_HAS_SPACE(src, len2);
+       silc_buffer_set(x, src->data, len2);
+       silc_buffer_pull(src, len2);
+      }
+      break;
+    case SILC_PARAM_BUFFER_ALLOC:
+      {
+       SilcBuffer x = va_arg(ap, SilcBuffer);
+       SilcUInt32 len2;
+       UNFORMAT_HAS_SPACE(src, 4);
+       SILC_GET32_MSB(len2, src->data);
+       silc_buffer_pull(src, 4);
+       UNFORMAT_HAS_SPACE(src, len2);
+       silc_buffer_format(x,
+                          SILC_STR_DATA(src->data, len2),
+                          SILC_STR_END);
+       silc_buffer_pull(src, len2);
+      }
+      break;
+    case SILC_PARAM_END:
       goto ok;
       break;
-    case SILC_BUFFER_PARAM_ADVANCE:
+    case SILC_PARAM_ADVANCE:
       break;
     default:
       SILC_LOG_DEBUG(("Bad buffer formatting type `%d'. Could not "
@@ -588,7 +629,7 @@ int silc_buffer_strformat(SilcBuffer dst, ...)
 
     if (!string)
       continue;
-    if (string == (char *)SILC_BUFFER_PARAM_END)
+    if (string == (char *)SILC_PARAM_END)
       goto ok;
 
     slen = strlen(string);
@@ -632,7 +673,7 @@ int silc_buffer_sstrformat(SilcStack stack, SilcBuffer dst, ...)
 
     if (!string)
       continue;
-    if (string == (char *)SILC_BUFFER_PARAM_END)
+    if (string == (char *)SILC_PARAM_END)
       goto ok;
 
     slen = strlen(string);
index 271137bf19e38341050aa4e54135b51c6fe4aa11..9fbdfe0aa3f777e9725434ab3339f90475910551 100644 (file)
@@ -202,58 +202,58 @@ int silc_buffer_strformat(SilcBuffer dst, ...);
  ***/
 int silc_buffer_sstrformat(SilcStack stack, SilcBuffer dst, ...);
 
-/* Macros for expanding parameters into variable function argument list.
-   These are passed to silc_buffer_format and silc_buffer_unformat
-   functions. */
-
-/* Buffer parameter types.
-
-   _SI_ = signed
-   _UI_ = unsigned
-
-  Any XXX_STRING_ALLOC types will allocate space for the data and
-  memcpy the data to the pointer sent as argument (in unformatting).
-
-  Any XXX_STRING will not allocate or copy any data.  Instead it
-  will set the pointer to the data.  Note that the data pointer
-  returned (in unformatting) must not be freed.
-
-*/
+/****d* silcutil/SilcBufferFormatAPI/SilcBufferParamType
+ *
+ * NAME
+ *
+ *    typedef enum { ... } SilcBufferParamType;
+ *
+ * DESCRIPTION
+ *
+ *    Buffer parameter types.  These are not needed when formatting or
+ *    unformatting buffers.  Use the macros such as SILC_STR_UI_CHAR and
+ *    others instead.  These types may be used when describing what a
+ *    buffer looks like, and how it may be formatted and unformatted.
+ *
+ * SOURCE
+ */
 typedef enum {
-  SILC_BUFFER_PARAM_SI8_CHAR,
-  SILC_BUFFER_PARAM_UI8_CHAR,
-
-  SILC_BUFFER_PARAM_SI16_SHORT,
-  SILC_BUFFER_PARAM_UI16_SHORT,
-
-  SILC_BUFFER_PARAM_SI32_INT,
-  SILC_BUFFER_PARAM_UI32_INT,
-
-  SILC_BUFFER_PARAM_SI64_INT,
-  SILC_BUFFER_PARAM_UI64_INT,
-
-  SILC_BUFFER_PARAM_UI8_STRING,         /* No copy */
-  SILC_BUFFER_PARAM_UI8_STRING_ALLOC,  /* Alloc + memcpy */
-  SILC_BUFFER_PARAM_UI16_STRING,        /* No copy */
-  SILC_BUFFER_PARAM_UI16_STRING_ALLOC, /* Alloc + memcpy */
-  SILC_BUFFER_PARAM_UI32_STRING,       /* No copy */
-  SILC_BUFFER_PARAM_UI32_STRING_ALLOC, /* Alloc + memcpy */
-  SILC_BUFFER_PARAM_UI8_NSTRING,       /* No copy */
-  SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC, /* Alloc + memcpy */
-  SILC_BUFFER_PARAM_UI16_NSTRING,      /* No copy */
-  SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC,        /* Alloc + memcpy */
-  SILC_BUFFER_PARAM_UI32_NSTRING,      /* No copy */
-  SILC_BUFFER_PARAM_UI32_NSTRING_ALLOC,        /* Alloc + memcpy */
-  SILC_BUFFER_PARAM_UI_XNSTRING,       /* No copy */
-  SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC, /* Alloc + memcpy */
-  SILC_BUFFER_PARAM_DATA,              /* No copy */
-  SILC_BUFFER_PARAM_DATA_ALLOC,                /* Alloc + memcpy */
-
-  SILC_BUFFER_PARAM_OFFSET,
-  SILC_BUFFER_PARAM_ADVANCE,
-
-  SILC_BUFFER_PARAM_END
+  SILC_PARAM_SI8_CHAR,            /* Signed 8-bit char */
+  SILC_PARAM_UI8_CHAR,            /* Unsigned 8-bit char */
+  SILC_PARAM_SI16_SHORT,          /* Signed 16-bit int */
+  SILC_PARAM_UI16_SHORT,          /* Unsigned 16-bit int */
+  SILC_PARAM_SI32_INT,            /* Signed 32-bit int */
+  SILC_PARAM_UI32_INT,            /* Unsigned 32-bit int */
+  SILC_PARAM_SI64_INT,            /* Signed 64-bit int */
+  SILC_PARAM_UI64_INT,            /* Unsigned 64-bit int */
+  SILC_PARAM_UI8_STRING,          /* String (max len 8-bits)*/
+  SILC_PARAM_UI16_STRING,         /* String (max len 16-bits) */
+  SILC_PARAM_UI32_STRING,         /* String (max len 32-bits) */
+  SILC_PARAM_BUFFER,              /* SilcBuffer */
+
+  /* Internal types */
+  SILC_PARAM_DATA,                /* Binary data */
+  SILC_PARAM_UI8_NSTRING,         /* String (max len 8-bits) */
+  SILC_PARAM_UI16_NSTRING,        /* String (max len 16-bits) */
+  SILC_PARAM_UI32_NSTRING,        /* String (max len 32-bits) */
+  SILC_PARAM_UI8_STRING_ALLOC,    /* Alloc + memcpy */
+  SILC_PARAM_UI16_STRING_ALLOC,           /* Alloc + memcpy */
+  SILC_PARAM_UI32_STRING_ALLOC,           /* Alloc + memcpy */
+  SILC_PARAM_UI8_NSTRING_ALLOC,           /* Alloc + memcpy */
+  SILC_PARAM_UI16_NSTRING_ALLOC,   /* Alloc + memcpy */
+  SILC_PARAM_UI32_NSTRING_ALLOC,   /* Alloc + memcpy */
+  SILC_PARAM_DATA_ALLOC,          /* Alloc + memcpy */
+  SILC_PARAM_BUFFER_ALLOC,        /* Alloc + memcpy */
+
+  SILC_PARAM_OFFSET,
+  SILC_PARAM_ADVANCE,
+
+  SILC_PARAM_UI_XNSTRING,
+  SILC_PARAM_UI_XNSTRING_ALLOC,
+
+  SILC_PARAM_END
 } SilcBufferParamType;
+/***/
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_*_CHAR
  *
@@ -272,8 +272,8 @@ typedef enum {
  *                   SILC_STR_UI_CHAR(unsigned char *)
  *
  ***/
-#define SILC_STR_SI_CHAR(x) SILC_BUFFER_PARAM_SI8_CHAR, (x)
-#define SILC_STR_UI_CHAR(x) SILC_BUFFER_PARAM_UI8_CHAR, (x)
+#define SILC_STR_SI_CHAR(x) SILC_PARAM_SI8_CHAR, (x)
+#define SILC_STR_UI_CHAR(x) SILC_PARAM_UI8_CHAR, (x)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_*_SHORT
  *
@@ -284,7 +284,7 @@ typedef enum {
  *
  * DESCRIPTION
  *
- *    Signed/SilcUInt16.
+ *    SilcInt16/SilcUInt16.
  *
  *    Formatting:    SILC_STR_SI_SHORT(short)
  *                   SILC_STR_UI_SHORT(SilcUInt16)
@@ -292,8 +292,8 @@ typedef enum {
  *                   SILC_STR_UI_SHORT(SilcUInt16 *)
  *
  ***/
-#define SILC_STR_SI_SHORT(x) SILC_BUFFER_PARAM_SI16_SHORT, (x)
-#define SILC_STR_UI_SHORT(x) SILC_BUFFER_PARAM_UI16_SHORT, (x)
+#define SILC_STR_SI_SHORT(x) SILC_PARAM_SI16_SHORT, (x)
+#define SILC_STR_UI_SHORT(x) SILC_PARAM_UI16_SHORT, (x)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_*_INT
  *
@@ -304,7 +304,7 @@ typedef enum {
  *
  * DESCRIPTION
  *
- *    Signed/SilcUInt32.
+ *    SilcInt32/SilcUInt32.
  *
  *    Formatting:    SILC_STR_SI_INT(int)
  *                   SILC_STR_UI_INT(SilcUInt32)
@@ -312,8 +312,8 @@ typedef enum {
  *                   SILC_STR_UI_INT(SilcUInt32 *)
  *
  ***/
-#define SILC_STR_SI_INT(x) SILC_BUFFER_PARAM_SI32_INT, (x)
-#define SILC_STR_UI_INT(x) SILC_BUFFER_PARAM_UI32_INT, (x)
+#define SILC_STR_SI_INT(x) SILC_PARAM_SI32_INT, (x)
+#define SILC_STR_UI_INT(x) SILC_PARAM_UI32_INT, (x)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_*_INT64
  *
@@ -324,7 +324,7 @@ typedef enum {
  *
  * DESCRIPTION
  *
- *    Signed/SilcUInt64.
+ *    SilcInt64/SilcUInt64.
  *
  *     Formatting:    SILC_STR_SI_INT64(int)
  *                    SILC_STR_UI_INT64(SilcUInt32)
@@ -332,8 +332,8 @@ typedef enum {
  *                    SILC_STR_UI_INT64(SilcUInt32 *)
  *
  ***/
-#define SILC_STR_SI_INT64(x) SILC_BUFFER_PARAM_SI64_INT, (x)
-#define SILC_STR_UI_INT64(x) SILC_BUFFER_PARAM_UI64_INT, (x)
+#define SILC_STR_SI_INT64(x) SILC_PARAM_SI64_INT, (x)
+#define SILC_STR_UI_INT64(x) SILC_PARAM_UI64_INT, (x)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_*_STRING
  *
@@ -378,12 +378,12 @@ typedef enum {
  *    as argument in unformatting.
  *
  ***/
-#define SILC_STR_UI8_STRING(x) SILC_BUFFER_PARAM_UI8_STRING, (x)
-#define SILC_STR_UI8_STRING_ALLOC(x) SILC_BUFFER_PARAM_UI8_STRING_ALLOC, (x)
-#define SILC_STR_UI16_STRING(x) SILC_BUFFER_PARAM_UI16_STRING, (x)
-#define SILC_STR_UI16_STRING_ALLOC(x) SILC_BUFFER_PARAM_UI16_STRING_ALLOC, (x)
-#define SILC_STR_UI32_STRING(x) SILC_BUFFER_PARAM_UI32_STRING, (x)
-#define SILC_STR_UI32_STRING_ALLOC(x) SILC_BUFFER_PARAM_UI32_STRING_ALLOC, (x)
+#define SILC_STR_UI8_STRING(x) SILC_PARAM_UI8_STRING, (x)
+#define SILC_STR_UI8_STRING_ALLOC(x) SILC_PARAM_UI8_STRING_ALLOC, (x)
+#define SILC_STR_UI16_STRING(x) SILC_PARAM_UI16_STRING, (x)
+#define SILC_STR_UI16_STRING_ALLOC(x) SILC_PARAM_UI16_STRING_ALLOC, (x)
+#define SILC_STR_UI32_STRING(x) SILC_PARAM_UI32_STRING, (x)
+#define SILC_STR_UI32_STRING_ALLOC(x) SILC_PARAM_UI32_STRING_ALLOC, (x)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_*_NSTRING
  *
@@ -428,15 +428,15 @@ typedef enum {
  *    as argument in unformatting.
  *
  ***/
-#define SILC_STR_UI8_NSTRING(x, l) SILC_BUFFER_PARAM_UI8_NSTRING, (x), (l)
+#define SILC_STR_UI8_NSTRING(x, l) SILC_PARAM_UI8_NSTRING, (x), (l)
 #define SILC_STR_UI8_NSTRING_ALLOC(x, l) \
-  SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC, (x), (l)
-#define SILC_STR_UI16_NSTRING(x, l) SILC_BUFFER_PARAM_UI16_NSTRING, (x), (l)
+  SILC_PARAM_UI8_NSTRING_ALLOC, (x), (l)
+#define SILC_STR_UI16_NSTRING(x, l) SILC_PARAM_UI16_NSTRING, (x), (l)
 #define SILC_STR_UI16_NSTRING_ALLOC(x, l) \
-  SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC, (x), (l)
-#define SILC_STR_UI32_NSTRING(x, l) SILC_BUFFER_PARAM_UI32_NSTRING, (x), (l)
+  SILC_PARAM_UI16_NSTRING_ALLOC, (x), (l)
+#define SILC_STR_UI32_NSTRING(x, l) SILC_PARAM_UI32_NSTRING, (x), (l)
 #define SILC_STR_UI32_NSTRING_ALLOC(x, l) \
-  SILC_BUFFER_PARAM_UI32_NSTRING_ALLOC, (x), (l)
+  SILC_PARAM_UI32_NSTRING_ALLOC, (x), (l)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_DATA
  *
@@ -447,7 +447,7 @@ typedef enum {
  *
  * DESCRIPTION
  *
- *    Binary data formatting.  Second argument is the lenght of the data.
+ *    Binary data formatting.  Second argument is the length of the data.
  *
  *    Formatting:    SILC_STR_DATA(unsigned char *, SilcUInt32)
  *    Unformatting:  SILC_STR_DATA(unsigned char **, SilcUInt32)
@@ -459,14 +459,37 @@ typedef enum {
  *    as argument in unformatting.
  *
  ***/
-#define SILC_STR_DATA(x, l) SILC_BUFFER_PARAM_DATA, (x), (l)
-#define SILC_STR_DATA_ALLOC(x, l) \
-  SILC_BUFFER_PARAM_DATA_ALLOC, (x), (l)
+#define SILC_STR_DATA(x, l) SILC_PARAM_DATA, (x), (l)
+#define SILC_STR_DATA_ALLOC(x, l) SILC_PARAM_DATA_ALLOC, (x), (l)
 
 /* Deprecated */
-#define SILC_STR_UI_XNSTRING(x, l) SILC_BUFFER_PARAM_UI_XNSTRING, (x), (l)
-#define SILC_STR_UI_XNSTRING_ALLOC(x, l) \
-  SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC, (x), (l)
+#define SILC_STR_UI_XNSTRING(x, l) SILC_PARAM_UI_XNSTRING, (x), (l)
+#define SILC_STR_UI_XNSTRING_ALLOC(x, l) SILC_PARAM_UI_XNSTRING_ALLOC, (x), (l)
+
+/****d* silcutil/SilcBufferFormatAPI/SILC_STR_BUFFER
+ *
+ * NAME
+ *
+ *    #define SILC_STR_BUFFER() ...
+ *    #define SILC_STR_BUFFER_ALLOC() ...
+ *
+ * DESCRIPTION
+ *
+ *    SilcBuffer formatting.
+ *
+ *    Formatting:    SILC_STR_DATA(SilcBuffer)
+ *    Unformatting:  SILC_STR_DATA(SilcBuffer)
+ *
+ *    This type can be used to format and unformat SilcBuffer.  The lenght
+ *    of the buffer will be automatically encoded into the buffer as a 32-bit
+ *    integer.  In unformatting the SilcBuffer context must be pre-allocated.
+ *
+ *    _ALLOC routines automatically allocates memory inside SilcBuffer in
+ *    unformatting.
+ *
+ ***/
+#define SILC_STR_BUFFER(x) SILC_BUFFER_DATA, (x)
+#define SILC_STR_BUFFER_ALLOC(x) SILC_PARAM_BUFFER_ALLOC, (x)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_OFFSET
  *
@@ -491,7 +514,7 @@ typedef enum {
  *    can be used in formatting and unformatting at the same time.
  *
  ***/
-#define SILC_STR_OFFSET(x) SILC_BUFFER_PARAM_OFFSET, (x)
+#define SILC_STR_OFFSET(x) SILC_PARAM_OFFSET, (x)
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_ADVANCE
  *
@@ -523,7 +546,7 @@ typedef enum {
  *    silc_buffer_push(buffer, silc_buffer_truelen(buffer));
  *
  ***/
-#define SILC_STR_ADVANCE SILC_BUFFER_PARAM_ADVANCE
+#define SILC_STR_ADVANCE SILC_PARAM_ADVANCE
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STR_END
  *
@@ -537,7 +560,7 @@ typedef enum {
  *    argument list or error will occur.
  *
  ***/
-#define SILC_STR_END SILC_BUFFER_PARAM_END
+#define SILC_STR_END SILC_PARAM_END
 
 /****d* silcutil/SilcBufferFormatAPI/SILC_STRFMT_END
  *