- char x = (char)va_arg(ap, int);
- FORMAT_HAS_SPACE(dst, 1);
- silc_buffer_put(dst, &x, 1);
- silc_buffer_pull(dst, 1);
+ SilcBufferFormatFunc func = NULL;
+ SilcBufferSFormatFunc funcs = NULL;
+ void *val;
+ void *context;
+ int tmp_len;
+ if (!stack)
+ func = va_arg(ap, SilcBufferFormatFunc);
+ else
+ funcs = va_arg(ap, SilcBufferSFormatFunc);
+ val = va_arg(ap, void *);
+ context = va_arg(ap, void *);
+ if (!stack)
+ tmp_len = func(dst, val, context);
+ else
+ tmp_len = funcs(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_ALLOC:
+ case SILC_PARAM_UI16_STRING_ALLOC:
+ case SILC_PARAM_UI32_STRING_ALLOC:
+ {
+ unsigned char *x = va_arg(ap, unsigned char *);
+ SilcUInt32 tmp_len = x ? strlen(x) : 0;
+ if (x && tmp_len) {
+ FORMAT_HAS_SPACE(stack, dst, tmp_len);
+ silc_buffer_put(dst, x, tmp_len);
+ silc_buffer_pull(dst, tmp_len);
+ }