- 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);
+ 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 | SILC_PARAM_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_sformat(stack, x,
+ SILC_STR_DATA(src->data, len2),
+ SILC_STR_END);
+ silc_buffer_pull(src, len2);
+ }
+ break;
+ case SILC_PARAM_OFFSET:
+ {
+ int offst = va_arg(ap, int);
+ if (!offst)
+ break;
+ if (offst > 1) {
+ UNFORMAT_HAS_SPACE(src, offst);
+ silc_buffer_pull(src, offst);
+ } else {
+ silc_buffer_push(src, -(offst));