Added SilcStack aware buffer unformatting.
authorPekka Riikonen <priikone@silcnet.org>
Wed, 1 Nov 2006 17:52:04 +0000 (17:52 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 1 Nov 2006 17:52:04 +0000 (17:52 +0000)
lib/silcutil/silcbuffmt.c
lib/silcutil/silcbuffmt.h

index 1ec22d00705206bcb4c521b865df8d1a908eadd3..f24a3dcabd69054866dba607ba26f2371c9ec876 100644 (file)
@@ -262,13 +262,30 @@ int silc_buffer_unformat(SilcBuffer src, ...)
   int ret;
 
   va_start(ap, src);
-  ret = silc_buffer_unformat_vp(src, ap);
+  ret = silc_buffer_sunformat_vp(NULL, src, ap);
   va_end(ap);
 
   return ret;
 }
 
 int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
+{
+  return silc_buffer_sunformat_vp(NULL, src, ap);
+}
+
+int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...)
+{
+  va_list ap;
+  int ret;
+
+  va_start(ap, src);
+  ret = silc_buffer_sunformat_vp(stack, src, ap);
+  va_end(ap);
+
+  return ret;
+}
+
+int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap)
 {
   SilcBufferParamType fmt;
   unsigned char *start_ptr = src->data;
@@ -399,7 +416,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 1);
        UNFORMAT_HAS_SPACE(src, len2);
        if (x && len2) {
-         *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+         *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
        }
        silc_buffer_pull(src, len2);
@@ -414,7 +431,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 2);
        UNFORMAT_HAS_SPACE(src, len2);
        if (x && len2) {
-         *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+         *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
        }
        silc_buffer_pull(src, len2);
@@ -442,7 +459,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        silc_buffer_pull(src, 4);
        UNFORMAT_HAS_SPACE(src, len2);
        if (x && len2) {
-         *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+         *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
        }
        silc_buffer_pull(src, len2);
@@ -492,7 +509,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        if (len3)
          *len3 = len2;
        if (x && len2) {
-         *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+         *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
        }
        silc_buffer_pull(src, len2);
@@ -510,7 +527,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        if (len3)
          *len3 = len2;
        if (x && len2) {
-         *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+         *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
        }
        silc_buffer_pull(src, len2);
@@ -550,7 +567,7 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        SilcUInt32 len2 = va_arg(ap, SilcUInt32);
        UNFORMAT_HAS_SPACE(src, len2);
        if (len2 && x) {
-         *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+         *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
          memcpy(*x, src->data, len2);
        }
        silc_buffer_pull(src, len2);
@@ -576,9 +593,9 @@ int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
        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_sformat(stack, x,
+                           SILC_STR_DATA(src->data, len2),
+                           SILC_STR_END);
        silc_buffer_pull(src, len2);
       }
       break;
index 9fbdfe0aa3f777e9725434ab3339f90475910551..4c2a4d69f3e011fb128b0ca3bf0a9efe3bae0e8e 100644 (file)
  * into specified data types.  It is especially useful to format packets,
  * protocol payloads and such.
  *
+ * As the SilcBuffer API is not thread-safe these routines may not be used
+ * in multithreaded environment with a same SilcBuffer context without
+ * concurrency control.
+ *
  ***/
 
 #ifndef SILCBUFFMT_H
@@ -145,6 +149,20 @@ int silc_buffer_sformat_vp(SilcStack stack, SilcBuffer dst, va_list ap);
  ***/
 int silc_buffer_unformat(SilcBuffer src, ...);
 
+/****f* silcutil/SilcBufferFormatAPI/silc_buffer_sunformat
+ *
+ * SYNOPSIS
+ *
+ *    int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...);
+ *
+ * DESCRIPTION
+ *
+ *    Same as silc_buffer_unformat but uses `stack' to allocate the memory.
+ *    if `stack' is NULL reverts back to silc_buffer_format call.
+ *
+ ***/
+int silc_buffer_sunformat(SilcStack stack, SilcBuffer src, ...);
+
 /****f* silcutil/SilcBufferFormatAPI/silc_buffer_unformat_vp
  *
  * SYNOPSIS
@@ -159,6 +177,20 @@ int silc_buffer_unformat(SilcBuffer src, ...);
  ***/
 int silc_buffer_unformat_vp(SilcBuffer src, va_list ap);
 
+/****f* silcutil/SilcBufferFormatAPI/silc_buffer_sunformat_vp
+ *
+ * SYNOPSIS
+ *
+ *    int silc_buffer_sunformat_vp(SilcBuffer src, va_list vp);
+ *
+ * DESCRIPTION
+ *
+ *    Same as silc_buffer_unformat_vp but uses `stack' to allocate the
+ *    memory.  if `stack' is NULL reverts back to silc_buffer_format_vp call.
+ *
+ ***/
+int silc_buffer_sunformat_vp(SilcStack stack, SilcBuffer src, va_list ap);
+
 /****f* silcutil/SilcBufferFormatAPI/silc_buffer_strformat
  *
  * SYNOPSIS