i_zero(&ctx);
rfc822_parser_init(&ctx.parser, data, size, t_str_new(128));
- ctx.parser.nul_replacement_char = RFC822_NUL_REPLACEMENT_CHAR;
+ ctx.parser.nul_replacement_str = RFC822_NUL_REPLACEMENT_STR;
ctx.pool = pool;
ctx.str = t_str_new(128);
ctx.fill_missing = fill_missing;
string_t *str;
unsigned int i, j, count, next, next_idx;
bool ok, have_extended, broken = FALSE;
- char prev_replacement_char;
+ const char *prev_replacement_str;
int ret;
/* Temporarily replace the nul_replacement_char while we're parsing
the content-params. It'll be restored before we return. */
- prev_replacement_char = ctx->nul_replacement_char;
- ctx->nul_replacement_char = RFC822_NUL_REPLACEMENT_CHAR;
+ prev_replacement_str = ctx->nul_replacement_str;
+ ctx->nul_replacement_str = RFC822_NUL_REPLACEMENT_STR;
/* Get a list of all parameters. RFC 2231 uses key*<n>[*]=value pairs,
which we want to merge to a key[*]=value pair. Save them to a
array_append(&result, &value, 1);
}
}
- ctx->nul_replacement_char = prev_replacement_char;
+ ctx->nul_replacement_str = prev_replacement_str;
if (array_count(&rfc2231_params_arr) == 0) {
/* No RFC 2231 parameters */
switch (*ctx->data) {
case '\0':
if (ctx->last_comment != NULL &&
- ctx->nul_replacement_char != '\0') {
+ ctx->nul_replacement_str != NULL) {
str_append_data(ctx->last_comment, start,
ctx->data - start);
- str_append_c(ctx->last_comment,
- ctx->nul_replacement_char);
+ str_append(ctx->last_comment,
+ ctx->nul_replacement_str);
start = ctx->data + 1;
}
break;
for (start = ctx->data; ctx->data < ctx->end; ctx->data++) {
switch (*ctx->data) {
case '\0':
- if (ctx->nul_replacement_char != '\0') {
+ if (ctx->nul_replacement_str != NULL) {
str_append_data(str, start, ctx->data - start);
- str_append_c(str, ctx->nul_replacement_char);
+ str_append(str, ctx->nul_replacement_str);
start = ctx->data + 1;
}
break;
for (start = ctx->data++; ctx->data < ctx->end; ctx->data++) {
switch (*ctx->data) {
case '\0':
- if (ctx->nul_replacement_char != '\0') {
+ if (ctx->nul_replacement_str != NULL) {
str_append_data(str, start, ctx->data - start);
- str_append_c(str, ctx->nul_replacement_char);
+ str_append(str, ctx->nul_replacement_str);
start = ctx->data + 1;
}
break;
#define RFC822_PARSER_H
/* This can be used as a common NUL replacement character */
-#define RFC822_NUL_REPLACEMENT_CHAR 0x80
+#define RFC822_NUL_REPLACEMENT_STR "\x80"
struct rfc822_parser_context {
const unsigned char *data, *end;
string_t *last_comment;
- /* Replace NULs with this character */
- char nul_replacement_char;
+ /* Replace NUL characters with this string */
+ const char *nul_replacement_str;
};
#define IS_ATEXT(c) \
str_truncate(str, 0);
rfc822_parser_init(&parser, input, sizeof(input)-1, str);
- parser.nul_replacement_char = '!';
+ parser.nul_replacement_str = "!";
test_assert(rfc822_skip_comment(&parser) == 0);
test_assert(strcmp(str_c(str), output) == 0);
rfc822_parser_deinit(&parser);