static struct mail_search_arg * imap_search_header(struct mail_search_build_context *ctx) { const char *hdr_name; /* <hdr-name> <string> */ if (mail_search_parse_string(ctx->parser, &hdr_name) < 0) return NULL; if (mail_search_build_get_utf8(ctx, hdr_name, &hdr_name) < 0) return NULL; return arg_new_header(ctx, SEARCH_HEADER, t_str_ucase(hdr_name)); }
static struct mail_search_arg * arg_new_body(struct mail_search_build_context *ctx, enum mail_search_arg_type type) { struct mail_search_arg *sarg; sarg = mail_search_build_str(ctx, type); if (sarg == NULL) return NULL; if (mail_search_build_get_utf8(ctx, sarg->value.str, &sarg->value.str) < 0) return NULL; return sarg; }
static struct mail_search_arg * arg_new_header(struct mail_search_build_context *ctx, enum mail_search_arg_type type, const char *hdr_name) { struct mail_search_arg *sarg; const char *value; sarg = mail_search_build_new(ctx, type); if (mail_search_parse_string(ctx->parser, &value) < 0) return NULL; if (mail_search_build_get_utf8(ctx, value, &sarg->value.str) < 0) return NULL; sarg->hdr_field_name = p_strdup(ctx->pool, hdr_name); return sarg; }
int mail_search_build(struct mail_search_register *reg, struct mail_search_parser *parser, const char **charset, struct mail_search_args **args_r, const char **error_r) { struct mail_search_build_context ctx; struct mail_search_args *args; struct mail_search_arg *root; const char *str; int ret; *args_r = NULL; *error_r = NULL; args = mail_search_build_init(); memset(&ctx, 0, sizeof(ctx)); ctx.pool = args->pool; ctx.reg = reg; ctx.parser = parser; ctx.charset = p_strdup(ctx.pool, *charset); ret = mail_search_build_list(&ctx, &root); if (!ctx.charset_checked && ret == 0) { /* make sure we give an error message if charset is invalid */ ret = mail_search_build_get_utf8(&ctx, "", &str); } if (ret < 0) { *error_r = ctx._error != NULL ? t_strdup(ctx._error) : t_strdup(mail_search_parser_get_error(parser)); if (ctx.unknown_charset) *charset = NULL; pool_unref(&args->pool); return -1; } if (root->type == SEARCH_SUB && !root->match_not) { /* simple SUB root */ args->args = root->value.subargs; } else { args->args = root; } *args_r = args; return 0; }
static struct mail_search_arg * arg_new_body(struct mail_search_build_context *ctx, enum mail_search_arg_type type) { struct mail_search_arg *sarg; sarg = mail_search_build_str(ctx, type); if (sarg == NULL) return NULL; if (mail_search_build_get_utf8(ctx, sarg->value.str, &sarg->value.str) < 0) return NULL; if (mail_search_parse_skip_next(ctx->parser, "")) { /* optimization: BODY "" matches everything (but do this only after checking charset and key are ok) */ return mail_search_build_new(ctx, SEARCH_ALL); } return sarg; }