mail-search-register-human.c revision a8c5a86d183db25a57bf193c06b41e092ec2e151
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2010-2014 Dovecot authors, see the included COPYING file */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "lib.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "ioloop.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "array.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "str.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "unichar.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "settings-parser.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "imap-date.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "mail-search-register.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "mail-search-parser.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include "mail-search-build.h"
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen#include <time.h>
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch#include <ctype.h>
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct mail_search_register *mail_search_register_human;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_search_arg *
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschhuman_search_or(struct mail_search_build_context *ctx)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_search_arg *sarg;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* this changes the parent arg to be an OR block instead of AND block */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ctx->parent->type = SEARCH_OR;
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen if (mail_search_build_key(ctx, ctx->parent, &sarg) < 0)
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen return NULL;
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen return sarg;
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen}
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainenstatic struct mail_search_arg *
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boscharg_new_human_date(struct mail_search_build_context *ctx,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch enum mail_search_arg_type type,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch enum mail_search_date_type date_type)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct mail_search_arg *sarg;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen const char *value, *error;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct tm tm;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int secs;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned long unixtime;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch sarg = mail_search_build_new(ctx, type);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (mail_search_parse_string(ctx->parser, &value) < 0)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return NULL;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* a) yyyy-mm-dd
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen b) imap date
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch c) unix timestamp
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen d) interval (e.g. n days) */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (i_isdigit(value[0]) && i_isdigit(value[1]) &&
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_isdigit(value[2]) && i_isdigit(value[3]) && value[4] == '-' &&
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch i_isdigit(value[5]) && i_isdigit(value[6]) && value[7] == '-' &&
597db47e06df5ac9dbf80c336383b921fec9d373Timo Sirainen i_isdigit(value[8]) && i_isdigit(value[9]) && value[10] == '\0') {
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen memset(&tm, 0, sizeof(tm));
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen tm.tm_year = (value[0]-'0') * 1000 + (value[1]-'0') * 100 +
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch (value[2]-'0') * 10 + (value[3]-'0') - 1900;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch tm.tm_mon = (value[5]-'0') * 10 + (value[6]-'0') - 1;
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen tm.tm_mday = (value[8]-'0') * 10 + (value[9]-'0');
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen sarg->value.time = mktime(&tm);
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen } else if (imap_parse_date(value, &sarg->value.time)) {
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen /* imap date */
7be8ba0c0462887826e5ee6da6a27964d30383b5Timo Sirainen } else if (str_to_ulong(value, &unixtime) == 0) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch sarg->value.time = unixtime;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch } else if (settings_get_time(value, &secs, &error) == 0) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch sarg->value.time = ioloop_time - secs;
d295cff1b640240cd198b9c8e963c9116ab95510Timo Sirainen } else {
d295cff1b640240cd198b9c8e963c9116ab95510Timo Sirainen sarg->value.time = (time_t)-1;
935a2434cd674e9cd17eabb296f84d1d891a23aeTimo Sirainen }
935a2434cd674e9cd17eabb296f84d1d891a23aeTimo Sirainen sarg->value.search_flags = MAIL_SEARCH_ARG_FLAG_USE_TZ;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (sarg->value.time == (time_t)-1) {
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen ctx->_error = p_strconcat(ctx->pool,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen "Invalid search date parameter: ", value, NULL);
9a5980c7bb836f69a63082f4699c30596ea4ee74Timo Sirainen return NULL;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen }
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen sarg->value.date_type = date_type;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen return sarg;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen}
9a5980c7bb836f69a63082f4699c30596ea4ee74Timo Sirainen
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen#define CALLBACK_DATE(_func, _type, _date_type) \
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstatic struct mail_search_arg *\
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschhuman_search_##_func(struct mail_search_build_context *ctx) \
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{ \
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return arg_new_human_date(ctx, _type, _date_type); \
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(before, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(on, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_RECEIVED)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(since, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_RECEIVED)
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(sentbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SENT)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(senton, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SENT)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(sentsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SENT)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(savedbefore, SEARCH_BEFORE, MAIL_SEARCH_DATE_TYPE_SAVED)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(savedon, SEARCH_ON, MAIL_SEARCH_DATE_TYPE_SAVED)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan BoschCALLBACK_DATE(savedsince, SEARCH_SINCE, MAIL_SEARCH_DATE_TYPE_SAVED)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_search_arg *
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boscharg_new_human_size(struct mail_search_build_context *ctx,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch enum mail_search_arg_type type)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_search_arg *sarg;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char *value, *error;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch sarg = mail_search_build_new(ctx, type);
204ee6ed414f5e4eeb6f6c10763b55daf56f11acJosef 'Jeff' Sipek if (mail_search_parse_string(ctx->parser, &value) < 0)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return NULL;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (settings_get_size(value, &sarg->value.size, &error) < 0) {
54bd0fec0be357266e299466a582f3c9269884e9Timo Sirainen ctx->_error = p_strdup(ctx->pool, error);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return NULL;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch }
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return sarg;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_search_arg *
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschhuman_search_larger(struct mail_search_build_context *ctx)
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return arg_new_human_size(ctx, SEARCH_LARGER);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_search_arg *
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschhuman_search_smaller(struct mail_search_build_context *ctx)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return arg_new_human_size(ctx, SEARCH_SMALLER);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_search_arg *
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainenhuman_search_guid(struct mail_search_build_context *ctx)
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return mail_search_build_str(ctx, SEARCH_GUID);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_search_arg *
1a3254b83ba00315cfc47d3c6e99e837914594cfTimo Sirainenhuman_search_mailbox(struct mail_search_build_context *ctx)
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen{
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen struct mail_search_arg *sarg;
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen sarg = mail_search_build_str(ctx, SEARCH_MAILBOX);
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen if (sarg == NULL)
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen return NULL;
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen if (strchr(sarg->value.str, '*') != NULL ||
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen strchr(sarg->value.str, '%') != NULL)
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen sarg->type = SEARCH_MAILBOX_GLOB;
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen if (!uni_utf8_str_is_valid(sarg->value.str)) {
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen ctx->_error = p_strconcat(ctx->pool,
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen "Mailbox name not valid UTF-8: ",
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen sarg->value.str, NULL);
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen return NULL;
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen }
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen return sarg;
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen}
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainenstatic struct mail_search_arg *
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainenhuman_search_mailbox_guid(struct mail_search_build_context *ctx)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen return mail_search_build_str(ctx, SEARCH_MAILBOX_GUID);
1a3254b83ba00315cfc47d3c6e99e837914594cfTimo Sirainen}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const struct mail_search_register_arg human_register_args[] = {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "OR", human_search_or },
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* dates */
3ab672903a7ed98263b89180261079870c964831Timo Sirainen { "BEFORE", human_search_before },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "ON", human_search_on },
3ab672903a7ed98263b89180261079870c964831Timo Sirainen { "SINCE", human_search_since },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "SENTBEFORE", human_search_sentbefore },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "SENTON", human_search_senton },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "SENTSINCE", human_search_sentsince },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "SAVEDBEFORE", human_search_savedbefore },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "SAVEDON", human_search_savedon },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "SAVEDSINCE", human_search_savedsince },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "X-SAVEDBEFORE", human_search_savedbefore },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "X-SAVEDON", human_search_savedon },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "X-SAVEDSINCE", human_search_savedsince },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* sizes */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "LARGER", human_search_larger },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "SMALLER", human_search_smaller },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* Other Dovecot extensions: */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "GUID", human_search_guid },
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch { "MAILBOX", human_search_mailbox },
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen { "MAILBOX-GUID", human_search_mailbox_guid }
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen};
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_search_register *
3ab672903a7ed98263b89180261079870c964831Timo Sirainenmail_search_register_init_human(struct mail_search_register *imap_register)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch{
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mail_search_register *reg;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen mail_search_register_fallback_t *fallback;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ARRAY(struct mail_search_register_arg) copy_args;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen const struct mail_search_register_arg *human_args, *imap_args;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen unsigned int i, j, human_count, imap_count;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen int ret;
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
3ab672903a7ed98263b89180261079870c964831Timo Sirainen reg = mail_search_register_init();
3ab672903a7ed98263b89180261079870c964831Timo Sirainen mail_search_register_add(reg, human_register_args,
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen N_ELEMENTS(human_register_args));
3ab672903a7ed98263b89180261079870c964831Timo Sirainen
3ab672903a7ed98263b89180261079870c964831Timo Sirainen /* find and register args in imap that don't exist in human */
3ab672903a7ed98263b89180261079870c964831Timo Sirainen imap_args = mail_search_register_get(imap_register, &imap_count);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen human_args = mail_search_register_get(reg, &human_count);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen t_array_init(&copy_args, imap_count);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen for (i = j = 0; i < imap_count && j < human_count; ) {
3ab672903a7ed98263b89180261079870c964831Timo Sirainen ret = strcmp(imap_args[i].key, human_args[j].key);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen if (ret < 0) {
3ab672903a7ed98263b89180261079870c964831Timo Sirainen array_append(&copy_args, &imap_args[i], 1);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen i++;
c67f6d09c1aa9d8bfdce4167da8ac009fd2917ceTimo Sirainen } else if (ret > 0) {
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch j++;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen } else {
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen i++; j++;
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen }
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen }
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen for (; i < imap_count; i++)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch array_append(&copy_args, &imap_args[i], 1);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
bcd286622779a93f809b11993db0550f8c7cc9b5Timo Sirainen imap_args = array_get(&copy_args, &imap_count);
bcd286622779a93f809b11993db0550f8c7cc9b5Timo Sirainen mail_search_register_add(reg, imap_args, imap_count);
bcd286622779a93f809b11993db0550f8c7cc9b5Timo Sirainen
bcd286622779a93f809b11993db0550f8c7cc9b5Timo Sirainen if (mail_search_register_get_fallback(imap_register, &fallback))
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen mail_search_register_fallback(reg, fallback);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return reg;
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen}
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct mail_search_register *mail_search_register_get_human(void)
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen{
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen if (mail_search_register_human == NULL) {
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen struct mail_search_register *imap_reg =
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen mail_search_register_get_imap();
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen mail_search_register_human =
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen mail_search_register_init_human(imap_reg);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen }
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen return mail_search_register_human;
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen}
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen