Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 1997 - 2006 Pekka Riikonen
+ Copyright (C) 1997 - 2007 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Check that buffer has enough room to format data in it, if not
allocate more. */
-#define FORMAT_HAS_SPACE(s, b, req) \
-do { \
- if (!silc_buffer_senlarge(s, b, req)) \
- goto fail; \
- flen += req; \
+#define FORMAT_HAS_SPACE(s, b, req) \
+do { \
+ if (silc_unlikely(!silc_buffer_senlarge(s, b, req))) \
+ goto fail; \
+ flen += req; \
} while(0)
/* Check that there is data to be unformatted */
#define UNFORMAT_HAS_SPACE(b, req) \
do { \
- if (req > silc_buffer_len(b)) \
+ if (silc_unlikely(req > silc_buffer_len(b))) \
goto fail; \
- if ((req + 1) <= 0) \
+ if (silc_unlikely((req + 1) <= 0)) \
goto fail; \
} while(0)
case SILC_PARAM_UI32_STRING_ALLOC:
{
unsigned char *x = va_arg(ap, unsigned char *);
- SilcUInt32 tmp_len = strlen(x);
- FORMAT_HAS_SPACE(stack, dst, tmp_len);
- silc_buffer_put(dst, x, tmp_len);
- silc_buffer_pull(dst, tmp_len);
+ 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);
+ }
break;
}
case SILC_PARAM_UI8_NSTRING:
unsigned char **x = va_arg(ap, unsigned char **);
SilcUInt32 len2 = va_arg(ap, SilcUInt32);
UNFORMAT_HAS_SPACE(src, len2);
- if (len2 && x)
+ if (silc_likely(len2 && x))
*x = src->data;
silc_buffer_pull(src, len2);
break;
unsigned char **x = va_arg(ap, unsigned char **);
SilcUInt32 len2 = va_arg(ap, SilcUInt32);
UNFORMAT_HAS_SPACE(src, len2);
- if (len2 && x) {
+ if (silc_likely(len2 && x)) {
*x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
- memcpy(*x, src->data, len2);
+ if (*x)
+ memcpy(*x, src->data, len2);
}
silc_buffer_pull(src, len2);
break;
{
unsigned char *x = va_arg(ap, unsigned char *);
UNFORMAT_HAS_SPACE(src, 1);
- if (x)
+ if (silc_likely(x))
*x = src->data[0];
silc_buffer_pull(src, 1);
break;
{
SilcUInt16 *x = va_arg(ap, SilcUInt16 *);
UNFORMAT_HAS_SPACE(src, 2);
- if (x)
+ if (silc_likely(x))
SILC_GET16_MSB(*x, src->data);
silc_buffer_pull(src, 2);
break;
{
SilcUInt32 *x = va_arg(ap, SilcUInt32 *);
UNFORMAT_HAS_SPACE(src, 4);
- if (x)
+ if (silc_likely(x))
SILC_GET32_MSB(*x, src->data);
silc_buffer_pull(src, 4);
break;
{
SilcUInt64 *x = va_arg(ap, SilcUInt64 *);
UNFORMAT_HAS_SPACE(src, sizeof(SilcUInt64));
- if (x)
+ if (silc_likely(x))
SILC_GET64_MSB(*x, src->data);
silc_buffer_pull(src, sizeof(SilcUInt64));
break;
{
char *x = va_arg(ap, char *);
UNFORMAT_HAS_SPACE(src, 1);
- if (x)
+ if (silc_likely(x))
*x = src->data[0];
silc_buffer_pull(src, 1);
break;
{
SilcInt16 *x = va_arg(ap, SilcInt16 *);
UNFORMAT_HAS_SPACE(src, 2);
- if (x)
+ if (silc_likely(x))
SILC_GET16_MSB(*x, src->data);
silc_buffer_pull(src, 2);
break;
{
SilcInt32 *x = va_arg(ap, SilcInt32 *);
UNFORMAT_HAS_SPACE(src, 4);
- if (x)
+ if (silc_likely(x))
SILC_GET32_MSB(*x, src->data);
silc_buffer_pull(src, 4);
break;
{
SilcInt64 *x = va_arg(ap, SilcInt64 *);
UNFORMAT_HAS_SPACE(src, sizeof(SilcInt64));
- if (x)
+ if (silc_likely(x))
SILC_GET64_MSB(*x, src->data);
silc_buffer_pull(src, sizeof(SilcInt64));
break;
len2 = (SilcUInt8)src->data[0];
silc_buffer_pull(src, 1);
UNFORMAT_HAS_SPACE(src, len2);
- if (x)
+ if (silc_likely(x))
*x = src->data;
silc_buffer_pull(src, len2);
break;
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
UNFORMAT_HAS_SPACE(src, len2);
- if (x)
+ if (silc_likely(x))
*x = src->data;
silc_buffer_pull(src, len2);
break;
len2 = (SilcUInt8)src->data[0];
silc_buffer_pull(src, 1);
UNFORMAT_HAS_SPACE(src, len2);
- if (x && len2) {
+ if (silc_likely(x && len2)) {
*x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
- memcpy(*x, src->data, len2);
+ if (*x)
+ memcpy(*x, src->data, len2);
}
silc_buffer_pull(src, len2);
break;
SILC_GET16_MSB(len2, src->data);
silc_buffer_pull(src, 2);
UNFORMAT_HAS_SPACE(src, len2);
- if (x && len2) {
+ if (silc_likely(x && len2)) {
*x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
- memcpy(*x, src->data, len2);
+ if (*x)
+ memcpy(*x, src->data, len2);
}
silc_buffer_pull(src, len2);
break;
SILC_GET32_MSB(len2, src->data);
silc_buffer_pull(src, 4);
UNFORMAT_HAS_SPACE(src, len2);
- if (x)
+ if (silc_likely(x))
*x = src->data;
silc_buffer_pull(src, len2);
break;
SILC_GET32_MSB(len2, src->data);
silc_buffer_pull(src, 4);
UNFORMAT_HAS_SPACE(src, len2);
- if (x && len2) {
+ if (silc_likely(x && len2)) {
*x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
- memcpy(*x, src->data, len2);
+ if (*x)
+ memcpy(*x, src->data, len2);
}
silc_buffer_pull(src, len2);
break;
*len3 = len2;
if (x && len2) {
*x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
- memcpy(*x, src->data, len2);
+ if (*x)
+ memcpy(*x, src->data, len2);
}
silc_buffer_pull(src, len2);
break;
*len3 = len2;
if (x && len2) {
*x = silc_scalloc(stack, len2 + 1, sizeof(unsigned char));
- memcpy(*x, src->data, len2);
+ if (*x)
+ memcpy(*x, src->data, len2);
}
silc_buffer_pull(src, len2);
break;
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);
+ if (silc_buffer_sformat(stack, x,
+ SILC_STR_DATA(src->data, len2),
+ SILC_STR_END) < 0)
+ goto fail;
silc_buffer_pull(src, len2);
}
break;
slen = strlen(string);
d = silc_realloc(dst->head, sizeof(*dst->head) * (slen + len + 1));
- if (!d)
+ if (silc_unlikely(!d))
return -1;
dst->head = d;
memcpy(dst->head + len, string, slen);
goto ok;
slen = strlen(string);
- d = silc_srealloc_ua(stack, len + 1, dst->head,
- sizeof(*dst->head) * (slen + len + 1));
- if (!d)
+ d = silc_srealloc(stack, len + 1, dst->head,
+ sizeof(*dst->head) * (slen + len + 1));
+ if (silc_unlikely(!d))
return -1;
dst->head = d;
memcpy(dst->head + len, string, slen);