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;
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);
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);
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);
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);
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);
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);
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;
* 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
***/
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
***/
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