flen += req; \
} while(0)
+/* Check that buffer has enough room to format data in it, if not
+ allocate more. This will append, thus not replacing any existing data. */
+#define FORMAT_HAS_SPACE_APPEND(s, b, req) \
+do { \
+ if (silc_buffer_len(b) < req) \
+ if (silc_unlikely(!silc_buffer_sappend(s, b, req - silc_buffer_len(b)))) \
+ goto fail; \
+ flen += req; \
+} while(0)
+
/* Check that there is data to be unformatted */
#define UNFORMAT_HAS_SPACE(b, req) \
do { \
silc_buffer_pull(dst, tmp_len);
flen += tmp_len;
}
+ break;
}
- break;
case SILC_PARAM_REGEX:
{
SilcBool match_all = (rflags & SILC_STR_REGEX_ALL) != 0;
SilcBool match_nl = (rflags & SILC_STR_REGEX_NL) != 0;
SilcBool ret;
- unsigned char *saved_incl = NULL;
+ SilcUInt32 inclusive_pos = 0;
int matched = 0, ret_len;
va_list cp;
}
if (rflags & SILC_STR_REGEX_INCLUSIVE) {
- saved_incl = dst->tail;
+ inclusive_pos = dst->tail - match.tail;
dst->tail = match.tail;
}
goto fail;
if (rflags & SILC_STR_REGEX_INCLUSIVE)
- dst->tail = saved_incl;
+ if (!silc_buffer_pull_tail(dst, inclusive_pos))
+ goto fail;
/* Advance buffer after formatting */
flen += ret_len;
/* Skip to the next SILC_PARAM_END */
silc_buffer_sformat_vp_i(NULL, NULL, ap, FALSE);
+ break;
}
- break;
case SILC_PARAM_UI8_STRING:
case SILC_PARAM_UI16_STRING:
if (x && tmp_len) {
FORMAT_HAS_SPACE(stack, dst, tmp_len);
- silc_buffer_put(dst, (unsigned char *)x, tmp_len);
+ silc_buffer_put(dst, x, tmp_len);
+ silc_buffer_pull(dst, tmp_len);
+ }
+ break;
+ }
+
+ case SILC_PARAM_UI8_STRING | SILC_PARAM_APPEND:
+ case SILC_PARAM_UI16_STRING | SILC_PARAM_APPEND:
+ case SILC_PARAM_UI32_STRING | SILC_PARAM_APPEND:
+ {
+ char *x = va_arg(ap, char *);
+ SilcUInt32 tmp_len = x ? strlen(x) : 0;
+
+ if (!process)
+ break;
+
+ if (x && tmp_len) {
+ FORMAT_HAS_SPACE_APPEND(stack, dst, tmp_len);
+ silc_buffer_put(dst, x, tmp_len);
silc_buffer_pull(dst, tmp_len);
}
break;
SilcBool match_all = (rflags & SILC_STR_REGEX_ALL) != 0;
SilcBool match_nl = (rflags & SILC_STR_REGEX_NL) != 0;
SilcBool ret;
- unsigned char *saved_incl = NULL;
+ SilcUInt32 inclusive_pos = 0;
int matched = 0, ret_len;
va_list cp;
}
if (rflags & SILC_STR_REGEX_INCLUSIVE) {
- saved_incl = src->tail;
+ inclusive_pos = src->tail - match.tail;
src->tail = match.tail;
}
goto fail;
if (rflags & SILC_STR_REGEX_INCLUSIVE)
- src->tail = saved_incl;
+ if (!silc_buffer_pull_tail(src, inclusive_pos))
+ goto fail;
/* Advance buffer after formatting */
UNFORMAT_HAS_SPACE(src, ret_len);