{
SilcBufferParamType fmt;
int flen = 0;
+ SilcBool advance = FALSE;
/* Parse the arguments by formatting type. */
while (1) {
case SILC_BUFFER_PARAM_UI16_NSTRING:
case SILC_BUFFER_PARAM_UI32_NSTRING:
case SILC_BUFFER_PARAM_UI_XNSTRING:
+ case SILC_BUFFER_PARAM_DATA:
case SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC:
case SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC:
case SILC_BUFFER_PARAM_UI32_NSTRING_ALLOC:
case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC:
+ case SILC_BUFFER_PARAM_DATA_ALLOC:
{
unsigned char *x = va_arg(ap, unsigned char *);
SilcUInt32 tmp_len = va_arg(ap, SilcUInt32);
case SILC_BUFFER_PARAM_END:
goto ok;
break;
+ case SILC_BUFFER_PARAM_ADVANCE:
+ advance = TRUE;
+ break;
default:
SILC_LOG_DEBUG(("Bad buffer formatting type `%d'. Could not "
"format the data.", fmt));
fail:
SILC_LOG_DEBUG(("Error occured while formatting data"));
- silc_buffer_push(dst, flen);
+ if (!advance)
+ silc_buffer_push(dst, flen);
return -1;
ok:
/* Push the buffer back to where it belongs. */
- silc_buffer_push(dst, flen);
+ if (!advance)
+ silc_buffer_push(dst, flen);
return flen;
}
break;
}
case SILC_BUFFER_PARAM_UI_XNSTRING:
+ case SILC_BUFFER_PARAM_DATA:
{
unsigned char **x = va_arg(ap, unsigned char **);
SilcUInt32 len = va_arg(ap, SilcUInt32);
break;
}
case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC:
+ case SILC_BUFFER_PARAM_DATA_ALLOC:
{
unsigned char **x = va_arg(ap, unsigned char **);
SilcUInt32 len = va_arg(ap, SilcUInt32);
case SILC_BUFFER_PARAM_END:
goto ok;
break;
+ case SILC_BUFFER_PARAM_ADVANCE:
+ break;
default:
SILC_LOG_DEBUG(("Bad buffer formatting type `%d'. Could not "
"format the data.", fmt));
int silc_buffer_strformat(SilcBuffer dst, ...)
{
int len = silc_buffer_truelen(dst);
+ int hlen = silc_buffer_headlen(dst);
va_list va;
va_start(va, dst);
ok:
dst->end = dst->head + len;
- dst->data = dst->head;
+ dst->data = dst->head + hlen;
dst->tail = dst->end;
va_end(va);