+ SilcBufferUnformatFunc func = NULL;
+ SilcBufferSUnformatFunc funcs = NULL;
+ void **val;
+ void *context;
+ int tmp_len;
+ if (!stack)
+ func = va_arg(ap, SilcBufferUnformatFunc);
+ else
+ funcs = va_arg(ap, SilcBufferSUnformatFunc);
+ 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);
+ if (tmp_len < 0)
+ goto fail;
+ if (tmp_len) {
+ UNFORMAT_HAS_SPACE(src, tmp_len);
+ silc_buffer_pull(src, tmp_len);
+ }
+ }
+ case SILC_PARAM_UI_XNSTRING:
+ case SILC_PARAM_DATA:
+ {
+ unsigned char **x = va_arg(ap, unsigned char **);
+ SilcUInt32 len2 = va_arg(ap, SilcUInt32);
+ UNFORMAT_HAS_SPACE(src, len2);
+ if (silc_likely(len2 && x))
+ *x = src->data;
+ silc_buffer_pull(src, len2);
+ break;
+ }
+ case SILC_PARAM_UI_XNSTRING_ALLOC:
+ case SILC_PARAM_DATA_ALLOC:
+ {
+ unsigned char **x = va_arg(ap, unsigned char **);
+ SilcUInt32 len2 = va_arg(ap, SilcUInt32);
+ UNFORMAT_HAS_SPACE(src, len2);
+ if (silc_likely(len2 && x)) {
+ *x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
+ if (*x)
+ memcpy(*x, src->data, len2);
+ }
+ silc_buffer_pull(src, len2);