Moved SILC_PARAM_* types under generic SilcParam type into the
[crypto.git] / lib / silcutil / silcbuffmt.c
index abcc65f4df6da7352987983713c9a940fc938b06..b0c5d5c5beb8dfa110eb2eef704902daa205dfed 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2006 Pekka Riikonen
+  Copyright (C) 1997 - 2007 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -32,12 +32,16 @@ do {                                                        \
 } while(0)
 
 /* Check that there is data to be unformatted */
-#define UNFORMAT_HAS_SPACE(b, req)             \
-do {                                           \
-  if (silc_unlikely(req > silc_buffer_len(b))) \
-    goto fail;                                 \
-  if (silc_unlikely((req + 1) <= 0))           \
-    goto fail;                                 \
+#define UNFORMAT_HAS_SPACE(b, req)                     \
+do {                                                   \
+  if (silc_unlikely(req > silc_buffer_len(b))) {       \
+    silc_set_errno(SILC_ERR_OVERFLOW);                 \
+    goto fail;                                         \
+  }                                                    \
+  if (silc_unlikely((req + 1) <= 0)) {                 \
+    silc_set_errno(SILC_ERR_UNDERFLOW);                        \
+    goto fail;                                         \
+  }                                                    \
 } while(0)
 
 
@@ -74,32 +78,27 @@ int silc_buffer_sformat(SilcStack stack, SilcBuffer dst, ...)
 
 int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
 {
-  SilcBufferParamType fmt;
+  SilcParam fmt;
   int flen = 0;
   SilcBool advance = FALSE;
 
   /* Parse the arguments by formatting type. */
   while (1) {
-    fmt = va_arg(ap, SilcBufferParamType);
+    fmt = va_arg(ap, SilcParam);
 
-    switch(fmt) {
+    SILC_LOG_DEBUG(("Buffer format type %x", fmt));
+
+    switch (fmt) {
     case SILC_PARAM_FUNC:
       {
-       SilcBufferFormatFunc func = NULL;
-       SilcBufferSFormatFunc funcs = NULL;
+       SilcBufferFormatFunc func;
        void *val;
        void *context;
        int tmp_len;
-       if (!stack)
-         func = va_arg(ap, SilcBufferFormatFunc);
-       else
-         funcs = va_arg(ap, SilcBufferSFormatFunc);
+       func = va_arg(ap, SilcBufferFormatFunc);
        val = va_arg(ap, void *);
        context = va_arg(ap, void *);
-       if (!stack)
-         tmp_len = func(dst, val, context);
-       else
-         tmp_len = funcs(stack, dst, val, context);
+       tmp_len = func(stack, dst, val, context);
        if (tmp_len < 0)
          goto fail;
        if (tmp_len) {
@@ -111,15 +110,15 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
     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:
+    case SILC_PARAM_UI8_STRING | SILC_PARAM_ALLOC:
+    case SILC_PARAM_UI16_STRING | SILC_PARAM_ALLOC:
+    case SILC_PARAM_UI32_STRING | SILC_PARAM_ALLOC:
       {
-       unsigned char *x = va_arg(ap, unsigned char *);
+       char *x = va_arg(ap, char *);
        SilcUInt32 tmp_len = x ? strlen(x) : 0;
        if (x && tmp_len) {
          FORMAT_HAS_SPACE(stack, dst, tmp_len);
-         silc_buffer_put(dst, x, tmp_len);
+         silc_buffer_put(dst, (unsigned char *)x, tmp_len);
          silc_buffer_pull(dst, tmp_len);
        }
        break;
@@ -127,13 +126,11 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
     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:
+    case SILC_PARAM_UICHAR:
+    case SILC_PARAM_UI8_NSTRING | SILC_PARAM_ALLOC:
+    case SILC_PARAM_UI16_NSTRING | SILC_PARAM_ALLOC:
+    case SILC_PARAM_UI32_NSTRING | SILC_PARAM_ALLOC:
+    case SILC_PARAM_UICHAR | SILC_PARAM_ALLOC:
       {
        unsigned char *x = va_arg(ap, unsigned char *);
        SilcUInt32 tmp_len = va_arg(ap, SilcUInt32);
@@ -144,7 +141,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        }
        break;
       }
-    case SILC_PARAM_UI8_CHAR:
+    case SILC_PARAM_UINT8:
       {
        unsigned char x = (unsigned char)va_arg(ap, int);
        FORMAT_HAS_SPACE(stack, dst, 1);
@@ -152,7 +149,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 1);
        break;
       }
-    case SILC_PARAM_UI16_SHORT:
+    case SILC_PARAM_UINT16:
       {
        unsigned char xf[2];
        SilcUInt16 x = (SilcUInt16)va_arg(ap, int);
@@ -162,7 +159,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 2);
        break;
       }
-    case SILC_PARAM_UI32_INT:
+    case SILC_PARAM_UINT32:
       {
        unsigned char xf[4];
        SilcUInt32 x = va_arg(ap, SilcUInt32);
@@ -172,7 +169,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 4);
        break;
       }
-    case SILC_PARAM_UI64_INT:
+    case SILC_PARAM_UINT64:
       {
        unsigned char xf[8];
        SilcUInt64 x = va_arg(ap, SilcUInt64);
@@ -182,15 +179,15 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, sizeof(SilcUInt64));
        break;
       }
-    case SILC_PARAM_SI8_CHAR:
+    case SILC_PARAM_SINT8:
       {
        char x = (char)va_arg(ap, int);
        FORMAT_HAS_SPACE(stack, dst, 1);
-       silc_buffer_put(dst, &x, 1);
+       silc_buffer_put(dst, (unsigned char *)&x, 1);
        silc_buffer_pull(dst, 1);
        break;
       }
-    case SILC_PARAM_SI16_SHORT:
+    case SILC_PARAM_SINT16:
       {
        unsigned char xf[2];
        SilcInt16 x = (SilcInt16)va_arg(ap, int);
@@ -200,7 +197,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 2);
        break;
       }
-    case SILC_PARAM_SI32_INT:
+    case SILC_PARAM_SINT32:
       {
        unsigned char xf[4];
        SilcInt32 x = va_arg(ap, SilcInt32);
@@ -210,7 +207,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        silc_buffer_pull(dst, 4);
        break;
       }
-    case SILC_PARAM_SI64_INT:
+    case SILC_PARAM_SINT64:
       {
        unsigned char xf[8];
        SilcInt64 x = va_arg(ap, SilcInt64);
@@ -221,7 +218,7 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        break;
       }
     case SILC_PARAM_BUFFER:
-    case SILC_PARAM_BUFFER_ALLOC:
+    case SILC_PARAM_BUFFER | SILC_PARAM_ALLOC:
       {
        SilcBuffer x = va_arg(ap, SilcBuffer);
        unsigned char xf[4];
@@ -241,8 +238,10 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
        if (!offst)
          break;
        if (offst > 1) {
-         if (offst > silc_buffer_len(dst))
+         if (offst > silc_buffer_len(dst)) {
+           silc_set_errno(SILC_ERR_OVERFLOW);
            goto fail;
+         }
          silc_buffer_pull(dst, offst);
          flen += offst;
        } else {
@@ -260,6 +259,8 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap)
     default:
       SILC_LOG_DEBUG(("Bad buffer formatting type `%d'. Could not "
                      "format the data.", fmt));
+      silc_set_errno_reason(SILC_ERR_INVALID_ARGUMENT,
+                           "Bad buffer formatting type %d", fmt);
       goto fail;
       break;
     }
@@ -312,33 +313,28 @@ int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...)
 
 int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
 {
-  SilcBufferParamType fmt;
+  SilcParam fmt;
   unsigned char *start_ptr = src->data;
   int len = 0;
   SilcBool advance = FALSE;
 
   /* Parse the arguments by formatting type. */
-  while(1) {
-    fmt = va_arg(ap, SilcBufferParamType);
+  while (1) {
+    fmt = va_arg(ap, SilcParam);
+
+    SILC_LOG_DEBUG(("Buffer unformat type %x", fmt));
 
-    switch(fmt) {
+    switch (fmt) {
     case SILC_PARAM_FUNC:
       {
-       SilcBufferUnformatFunc func = NULL;
-       SilcBufferSUnformatFunc funcs = NULL;
+       SilcBufferUnformatFunc func;
        void **val;
        void *context;
        int tmp_len;
-       if (!stack)
-         func = va_arg(ap, SilcBufferUnformatFunc);
-       else
-         funcs = va_arg(ap, SilcBufferSUnformatFunc);
+       func = va_arg(ap, SilcBufferUnformatFunc);
        val = va_arg(ap, void **);
        context = va_arg(ap, void *);
-       if (!stack)
-         tmp_len = func(src, val, context);
-       else
-         tmp_len = funcs(stack, src, val, context);
+       tmp_len = func(stack, src, val, context);
        if (tmp_len < 0)
          goto fail;
        if (tmp_len) {
@@ -346,8 +342,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
          silc_buffer_pull(src, tmp_len);
        }
       }
-    case SILC_PARAM_UI_XNSTRING:
-    case SILC_PARAM_DATA:
+    case SILC_PARAM_UICHAR:
       {
        unsigned char **x = va_arg(ap, unsigned char **);
        SilcUInt32 len2 = va_arg(ap, SilcUInt32);
@@ -357,8 +352,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_PARAM_UI_XNSTRING_ALLOC:
-    case SILC_PARAM_DATA_ALLOC:
+    case SILC_PARAM_UICHAR | SILC_PARAM_ALLOC:
       {
        unsigned char **x = va_arg(ap, unsigned char **);
        SilcUInt32 len2 = va_arg(ap, SilcUInt32);
@@ -370,7 +364,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_PARAM_UI8_CHAR:
+    case SILC_PARAM_UINT8:
       {
        unsigned char *x = va_arg(ap, unsigned char *);
        UNFORMAT_HAS_SPACE(src, 1);
@@ -379,7 +373,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 1);
        break;
       }
-    case SILC_PARAM_UI16_SHORT:
+    case SILC_PARAM_UINT16:
       {
        SilcUInt16 *x = va_arg(ap, SilcUInt16 *);
        UNFORMAT_HAS_SPACE(src, 2);
@@ -388,7 +382,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 2);
        break;
       }
-    case SILC_PARAM_UI32_INT:
+    case SILC_PARAM_UINT32:
       {
        SilcUInt32 *x = va_arg(ap, SilcUInt32 *);
        UNFORMAT_HAS_SPACE(src, 4);
@@ -397,7 +391,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 4);
        break;
       }
-    case SILC_PARAM_UI64_INT:
+    case SILC_PARAM_UINT64:
       {
        SilcUInt64 *x = va_arg(ap, SilcUInt64 *);
        UNFORMAT_HAS_SPACE(src, sizeof(SilcUInt64));
@@ -406,7 +400,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, sizeof(SilcUInt64));
        break;
       }
-    case SILC_PARAM_SI8_CHAR:
+    case SILC_PARAM_SINT8:
       {
        char *x = va_arg(ap, char *);
        UNFORMAT_HAS_SPACE(src, 1);
@@ -415,7 +409,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 1);
        break;
       }
-    case SILC_PARAM_SI16_SHORT:
+    case SILC_PARAM_SINT16:
       {
        SilcInt16 *x = va_arg(ap, SilcInt16 *);
        UNFORMAT_HAS_SPACE(src, 2);
@@ -424,7 +418,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 2);
        break;
       }
-    case SILC_PARAM_SI32_INT:
+    case SILC_PARAM_SINT32:
       {
        SilcInt32 *x = va_arg(ap, SilcInt32 *);
        UNFORMAT_HAS_SPACE(src, 4);
@@ -433,7 +427,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 4);
        break;
       }
-    case SILC_PARAM_SI64_INT:
+    case SILC_PARAM_SINT64:
       {
        SilcInt64 *x = va_arg(ap, SilcInt64 *);
        UNFORMAT_HAS_SPACE(src, sizeof(SilcInt64));
@@ -455,20 +449,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_PARAM_UI16_STRING:
-      {
-       SilcUInt16 len2;
-       unsigned char **x = va_arg(ap, unsigned char **);
-       UNFORMAT_HAS_SPACE(src, 2);
-       SILC_GET16_MSB(len2, src->data);
-       silc_buffer_pull(src, 2);
-       UNFORMAT_HAS_SPACE(src, len2);
-       if (silc_likely(x))
-         *x = src->data;
-       silc_buffer_pull(src, len2);
-       break;
-      }
-    case SILC_PARAM_UI8_STRING_ALLOC:
+    case SILC_PARAM_UI8_STRING | SILC_PARAM_ALLOC:
       {
        SilcUInt8 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -483,7 +464,20 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_PARAM_UI16_STRING_ALLOC:
+    case SILC_PARAM_UI16_STRING:
+      {
+       SilcUInt16 len2;
+       unsigned char **x = va_arg(ap, unsigned char **);
+       UNFORMAT_HAS_SPACE(src, 2);
+       SILC_GET16_MSB(len2, src->data);
+       silc_buffer_pull(src, 2);
+       UNFORMAT_HAS_SPACE(src, len2);
+       if (silc_likely(x))
+         *x = src->data;
+       silc_buffer_pull(src, len2);
+       break;
+      }
+    case SILC_PARAM_UI16_STRING | SILC_PARAM_ALLOC:
       {
        SilcUInt16 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -511,7 +505,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_PARAM_UI32_STRING_ALLOC:
+    case SILC_PARAM_UI32_STRING | SILC_PARAM_ALLOC:
       {
        SilcUInt32 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -542,23 +536,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_PARAM_UI16_NSTRING:
-      {
-       SilcUInt16 len2;
-       unsigned char **x = va_arg(ap, unsigned char **);
-       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 (len3)
-         *len3 = len2;
-       if (x)
-         *x = src->data;
-       silc_buffer_pull(src, len2);
-       break;
-      }
-    case SILC_PARAM_UI8_NSTRING_ALLOC:
+    case SILC_PARAM_UI8_NSTRING | SILC_PARAM_ALLOC:
       {
        SilcUInt8 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -576,7 +554,23 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
-    case SILC_PARAM_UI16_NSTRING_ALLOC:
+    case SILC_PARAM_UI16_NSTRING:
+      {
+       SilcUInt16 len2;
+       unsigned char **x = va_arg(ap, unsigned char **);
+       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 (len3)
+         *len3 = len2;
+       if (x)
+         *x = src->data;
+       silc_buffer_pull(src, len2);
+       break;
+      }
+    case SILC_PARAM_UI16_NSTRING | SILC_PARAM_ALLOC:
       {
        SilcUInt16 len2;
        unsigned char **x = va_arg(ap, unsigned char **);
@@ -610,6 +604,24 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
        break;
       }
+    case SILC_PARAM_UI32_NSTRING | SILC_PARAM_ALLOC:
+      {
+       SilcUInt32 len2;
+       unsigned char **x = va_arg(ap, unsigned char **);
+       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 (len3)
+         *len3 = len2;
+       if (silc_likely(x && len2)) {
+         *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
+         memcpy(*x, src->data, len2);
+       }
+       silc_buffer_pull(src, len2);
+       break;
+      }
     case SILC_PARAM_BUFFER:
       {
        SilcBuffer x = va_arg(ap, SilcBuffer);
@@ -622,7 +634,7 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
        silc_buffer_pull(src, len2);
       }
       break;
-    case SILC_PARAM_BUFFER_ALLOC:
+    case SILC_PARAM_BUFFER | SILC_PARAM_ALLOC:
       {
        SilcBuffer x = va_arg(ap, SilcBuffer);
        SilcUInt32 len2;
@@ -658,6 +670,8 @@ int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
     default:
       SILC_LOG_DEBUG(("Bad buffer formatting type `%d'. Could not "
                      "format the data.", fmt));
+      silc_set_errno_reason(SILC_ERR_INVALID_ARGUMENT,
+                           "Bad buffer formatting type %d", fmt);
       goto fail;
       break;
     }
@@ -747,8 +761,8 @@ int silc_buffer_sstrformat(SilcStack stack, SilcBuffer dst, ...)
       goto ok;
 
     slen = strlen(string);
-    d = silc_srealloc_ua(stack, len + 1, dst->head,
-                        sizeof(*dst->head) * (slen + len + 1));
+    d = silc_srealloc(stack, len + 1, dst->head,
+                     sizeof(*dst->head) * (slen + len + 1));
     if (silc_unlikely(!d))
       return -1;
     dst->head = d;