int silc_buffer_format(SilcBuffer dst, ...)
{
va_list ap;
- SilcBufferParamType fmt;
- unsigned char *start_ptr = dst->data;
+ int ret;
va_start(ap, dst);
+ ret = silc_buffer_format_vp(dst, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+int silc_buffer_format_vp(SilcBuffer dst, va_list ap)
+{
+ SilcBufferParamType fmt;
+ unsigned char *start_ptr = dst->data;
+ int len;
/* Parse the arguments by formatting type. */
while(1) {
case SILC_BUFFER_PARAM_SI16_SHORT:
{
unsigned char xf[2];
- short x = (short)va_arg(ap, int);
+ SilcInt16 x = (SilcInt16)va_arg(ap, int);
HAS_SPACE(dst, 2);
SILC_PUT16_MSB(x, xf);
silc_buffer_put(dst, xf, 2);
case SILC_BUFFER_PARAM_UI16_SHORT:
{
unsigned char xf[2];
- unsigned short x = (unsigned short)va_arg(ap, int);
+ SilcUInt16 x = (SilcUInt16)va_arg(ap, int);
HAS_SPACE(dst, 2);
SILC_PUT16_MSB(x, xf);
silc_buffer_put(dst, xf, 2);
case SILC_BUFFER_PARAM_SI32_INT:
{
unsigned char xf[4];
- int x = va_arg(ap, int);
+ SilcInt32 x = va_arg(ap, SilcInt32);
HAS_SPACE(dst, 4);
SILC_PUT32_MSB(x, xf);
silc_buffer_put(dst, xf, 4);
case SILC_BUFFER_PARAM_UI32_INT:
{
unsigned char xf[4];
- unsigned int x = va_arg(ap, unsigned int);
+ SilcUInt32 x = va_arg(ap, SilcUInt32);
HAS_SPACE(dst, 4);
SILC_PUT32_MSB(x, xf);
silc_buffer_put(dst, xf, 4);
silc_buffer_pull(dst, 4);
break;
}
+ case SILC_BUFFER_PARAM_SI64_INT:
+ {
+ unsigned char xf[8];
+ SilcInt64 x = va_arg(ap, SilcInt64);
+ HAS_SPACE(dst, 8);
+ SILC_PUT64_MSB(x, xf);
+ silc_buffer_put(dst, xf, 8);
+ silc_buffer_pull(dst, 8);
+ break;
+ }
+ case SILC_BUFFER_PARAM_UI64_INT:
+ {
+ unsigned char xf[8];
+ SilcUInt64 x = va_arg(ap, SilcUInt64);
+ HAS_SPACE(dst, 8);
+ SILC_PUT64_MSB(x, xf);
+ silc_buffer_put(dst, xf, 8);
+ silc_buffer_pull(dst, 8);
+ break;
+ }
+ case SILC_BUFFER_PARAM_UI8_STRING:
case SILC_BUFFER_PARAM_UI16_STRING:
case SILC_BUFFER_PARAM_UI32_STRING:
+ case SILC_BUFFER_PARAM_UI8_STRING_ALLOC:
case SILC_BUFFER_PARAM_UI16_STRING_ALLOC:
case SILC_BUFFER_PARAM_UI32_STRING_ALLOC:
{
unsigned char *x = va_arg(ap, unsigned char *);
- int tmp_len = strlen(x);
+ SilcUInt32 tmp_len = strlen(x);
HAS_SPACE(dst, tmp_len);
silc_buffer_put(dst, x, tmp_len);
silc_buffer_pull(dst, tmp_len);
break;
}
+ case SILC_BUFFER_PARAM_UI8_NSTRING:
case SILC_BUFFER_PARAM_UI16_NSTRING:
case SILC_BUFFER_PARAM_UI32_NSTRING:
case SILC_BUFFER_PARAM_UI_XNSTRING:
+ 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:
{
unsigned char *x = va_arg(ap, unsigned char *);
- unsigned int len = va_arg(ap, unsigned int);
+ SilcUInt32 len = va_arg(ap, SilcUInt32);
HAS_SPACE(dst, len);
silc_buffer_put(dst, x, len);
silc_buffer_pull(dst, len);
ok:
/* Push the buffer back to where it belongs. */
- silc_buffer_push(dst, dst->data - start_ptr);
- return dst->len;
+ len = dst->data - start_ptr;
+ silc_buffer_push(dst, len);
+ return len;
}
/* Unformats the buffer sent as argument. The unformatted data is returned
int silc_buffer_unformat(SilcBuffer src, ...)
{
va_list ap;
+ int ret;
+
+ va_start(ap, src);
+ ret = silc_buffer_unformat_vp(src, ap);
+ va_end(ap);
+
+ return ret;
+}
+
+int silc_buffer_unformat_vp(SilcBuffer src, va_list ap)
+{
SilcBufferParamType fmt;
unsigned char *start_ptr = src->data;
int len = 0;
- va_start(ap, src);
-
/* Parse the arguments by formatting type. */
while(1) {
fmt = va_arg(ap, SilcBufferParamType);
}
case SILC_BUFFER_PARAM_SI16_SHORT:
{
- short *x = va_arg(ap, short *);
+ SilcInt16 *x = va_arg(ap, SilcInt16 *);
HAS_SPACE(src, 2);
if (x)
SILC_GET16_MSB(*x, src->data);
}
case SILC_BUFFER_PARAM_UI16_SHORT:
{
- unsigned short *x = va_arg(ap, unsigned short *);
+ SilcUInt16 *x = va_arg(ap, SilcUInt16 *);
HAS_SPACE(src, 2);
if (x)
SILC_GET16_MSB(*x, src->data);
}
case SILC_BUFFER_PARAM_SI32_INT:
{
- int *x = va_arg(ap, int *);
+ SilcInt32 *x = va_arg(ap, SilcInt32 *);
HAS_SPACE(src, 4);
if (x)
SILC_GET32_MSB(*x, src->data);
}
case SILC_BUFFER_PARAM_UI32_INT:
{
- unsigned int *x = va_arg(ap, unsigned int *);
+ SilcUInt32 *x = va_arg(ap, SilcUInt32 *);
HAS_SPACE(src, 4);
if (x)
SILC_GET32_MSB(*x, src->data);
silc_buffer_pull(src, 4);
break;
}
+ case SILC_BUFFER_PARAM_SI64_INT:
+ {
+ SilcInt64 *x = va_arg(ap, SilcInt64 *);
+ HAS_SPACE(src, 8);
+ if (x)
+ SILC_GET64_MSB(*x, src->data);
+ silc_buffer_pull(src, 8);
+ break;
+ }
+ case SILC_BUFFER_PARAM_UI64_INT:
+ {
+ SilcUInt64 *x = va_arg(ap, SilcUInt64 *);
+ HAS_SPACE(src, 8);
+ if (x)
+ SILC_GET64_MSB(*x, src->data);
+ silc_buffer_pull(src, 8);
+ break;
+ }
+ case SILC_BUFFER_PARAM_UI8_STRING:
+ {
+ SilcUInt8 len2;
+ unsigned char **x = va_arg(ap, unsigned char **);
+ HAS_SPACE(src, 1);
+ len2 = (SilcUInt8)src->data[0];
+ silc_buffer_pull(src, 1);
+ HAS_SPACE(src, len2);
+ if (x)
+ *x = src->data;
+ silc_buffer_pull(src, len2);
+ break;
+ }
case SILC_BUFFER_PARAM_UI16_STRING:
{
- unsigned short len2;
+ SilcUInt16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, len2);
break;
}
+ case SILC_BUFFER_PARAM_UI8_STRING_ALLOC:
+ {
+ SilcUInt8 len2;
+ unsigned char **x = va_arg(ap, unsigned char **);
+ HAS_SPACE(src, 1);
+ len2 = (SilcUInt8)src->data[0];
+ silc_buffer_pull(src, 1);
+ HAS_SPACE(src, len2);
+ if (x && len2) {
+ *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+ memcpy(*x, src->data, len2);
+ }
+ silc_buffer_pull(src, len2);
+ break;
+ }
case SILC_BUFFER_PARAM_UI16_STRING_ALLOC:
{
- unsigned short len2;
+ SilcUInt16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
HAS_SPACE(src, len2);
- if (x) {
+ if (x && len2) {
*x = silc_calloc(len2 + 1, sizeof(unsigned char));
memcpy(*x, src->data, len2);
}
}
case SILC_BUFFER_PARAM_UI32_STRING:
{
- unsigned int len2;
+ SilcUInt32 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 4);
SILC_GET32_MSB(len2, src->data);
}
case SILC_BUFFER_PARAM_UI32_STRING_ALLOC:
{
- unsigned int len2;
+ SilcUInt32 len2;
unsigned char **x = va_arg(ap, unsigned char **);
HAS_SPACE(src, 4);
SILC_GET32_MSB(len2, src->data);
silc_buffer_pull(src, 4);
HAS_SPACE(src, len2);
- if (x) {
+ if (x && len2) {
*x = silc_calloc(len2 + 1, sizeof(unsigned char));
memcpy(*x, src->data, len2);
}
silc_buffer_pull(src, len2);
break;
}
+ case SILC_BUFFER_PARAM_UI8_NSTRING:
+ {
+ SilcUInt8 len2;
+ unsigned char **x = va_arg(ap, unsigned char **);
+ SilcUInt8 *len = va_arg(ap, SilcUInt8 *);
+ HAS_SPACE(src, 1);
+ len2 = (SilcUInt8)src->data[0];
+ silc_buffer_pull(src, 1);
+ HAS_SPACE(src, len2);
+ if (len)
+ *len = len2;
+ if (x)
+ *x = src->data;
+ silc_buffer_pull(src, len2);
+ break;
+ }
case SILC_BUFFER_PARAM_UI16_NSTRING:
{
- unsigned short len2;
+ SilcUInt16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned short *len = va_arg(ap, unsigned short *);
+ SilcUInt16 *len = va_arg(ap, SilcUInt16 *);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
silc_buffer_pull(src, len2);
break;
}
+ case SILC_BUFFER_PARAM_UI8_NSTRING_ALLOC:
+ {
+ SilcUInt8 len2;
+ unsigned char **x = va_arg(ap, unsigned char **);
+ SilcUInt8 *len = va_arg(ap, SilcUInt8 *);
+ HAS_SPACE(src, 1);
+ len2 = (SilcUInt8)src->data[0];
+ silc_buffer_pull(src, 1);
+ HAS_SPACE(src, len2);
+ if (len)
+ *len = len2;
+ if (x && len2) {
+ *x = silc_calloc(len2 + 1, sizeof(unsigned char));
+ memcpy(*x, src->data, len2);
+ }
+ silc_buffer_pull(src, len2);
+ break;
+ }
case SILC_BUFFER_PARAM_UI16_NSTRING_ALLOC:
{
- unsigned short len2;
+ SilcUInt16 len2;
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned short *len = va_arg(ap, unsigned short *);
+ SilcUInt16 *len = va_arg(ap, SilcUInt16 *);
HAS_SPACE(src, 2);
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
HAS_SPACE(src, len2);
if (len)
*len = len2;
- if (x) {
+ if (x && len2) {
*x = silc_calloc(len2 + 1, sizeof(unsigned char));
memcpy(*x, src->data, len2);
}
}
case SILC_BUFFER_PARAM_UI32_NSTRING:
{
- unsigned int len2;
+ SilcUInt32 len2;
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned int *len = va_arg(ap, unsigned int *);
+ SilcUInt32 *len = va_arg(ap, SilcUInt32 *);
HAS_SPACE(src, 4);
SILC_GET32_MSB(len2, src->data);
silc_buffer_pull(src, 4);
case SILC_BUFFER_PARAM_UI_XNSTRING:
{
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned int len = va_arg(ap, unsigned int);
+ SilcUInt32 len = va_arg(ap, SilcUInt32);
HAS_SPACE(src, len);
if (len && x)
*x = src->data;
case SILC_BUFFER_PARAM_UI_XNSTRING_ALLOC:
{
unsigned char **x = va_arg(ap, unsigned char **);
- unsigned int len = va_arg(ap, unsigned int);
+ SilcUInt32 len = va_arg(ap, SilcUInt32);
HAS_SPACE(src, len);
if (len && x) {
*x = silc_calloc(len + 1, sizeof(unsigned char));