+ SilcBufferFormatFunc func;
+ void *val;
+ void *context;
+ int tmp_len;
+ func = va_arg(ap, SilcBufferFormatFunc);
+ val = va_arg(ap, void *);
+ context = va_arg(ap, void *);
+ tmp_len = func(stack, dst, val, context);
+ if (tmp_len < 0)
+ goto fail;
+ if (tmp_len) {
+ silc_buffer_pull(dst, tmp_len);
+ flen += tmp_len;
+ }
+ }
+ break;
+ case SILC_PARAM_UI8_STRING:
+ case SILC_PARAM_UI16_STRING:
+ case SILC_PARAM_UI32_STRING:
+ case SILC_PARAM_UI8_STRING | SILC_PARAM_ALLOC:
+ case SILC_PARAM_UI16_STRING | SILC_PARAM_ALLOC:
+ case SILC_PARAM_UI32_STRING | SILC_PARAM_ALLOC:
+ {
+ 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, (unsigned char *)x, tmp_len);
+ silc_buffer_pull(dst, tmp_len);
+ }
+ break;
+ }
+ case SILC_PARAM_UI8_NSTRING:
+ case SILC_PARAM_UI16_NSTRING:
+ case SILC_PARAM_UI32_NSTRING:
+ 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);
+ if (x && tmp_len) {
+ FORMAT_HAS_SPACE(stack, dst, tmp_len);
+ silc_buffer_put(dst, x, tmp_len);
+ silc_buffer_pull(dst, tmp_len);
+ }