From: Timo Sirainen Date: Fri, 6 Feb 2009 18:38:54 +0000 (-0500) Subject: Added imap_args_to_str() X-Git-Tag: 1.2.beta1~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b9e75defc480cb1292b39bbc5cc1f0e07877420a;p=thirdparty%2Fdovecot%2Fcore.git Added imap_args_to_str() --HG-- branch : HEAD --- diff --git a/src/lib-imap/imap-util.c b/src/lib-imap/imap-util.c index 6025f4a9e6..62e758d1e1 100644 --- a/src/lib-imap/imap-util.c +++ b/src/lib-imap/imap-util.c @@ -3,7 +3,9 @@ #include "lib.h" #include "array.h" #include "str.h" +#include "strescape.h" #include "mail-types.h" +#include "imap-parser.h" #include "imap-util.h" void imap_write_flags(string_t *dest, enum mail_flags flags, @@ -52,3 +54,51 @@ void imap_write_seq_range(string_t *dest, const ARRAY_TYPE(seq_range) *array) str_printfa(dest, ":%u", range[i].seq2); } } + +void imap_args_to_str(string_t *dest, const struct imap_arg *args) +{ + const ARRAY_TYPE(imap_arg_list) *list; + bool first = TRUE; + + for (; args->type != IMAP_ARG_EOL; args++) { + if (first) + first = FALSE; + else + str_append_c(dest, ' '); + + switch (args->type) { + case IMAP_ARG_NIL: + str_append(dest, "NIL"); + break; + case IMAP_ARG_ATOM: + str_append(dest, IMAP_ARG_STR(args)); + break; + case IMAP_ARG_STRING: + str_append_c(dest, '"'); + str_append(dest, str_escape(IMAP_ARG_STR(args))); + str_append_c(dest, '"'); + break; + case IMAP_ARG_LITERAL: { + const char *strarg = IMAP_ARG_STR(args); + str_printfa(dest, "{%"PRIuSIZE_T"}\r\n", + strlen(strarg)); + str_append(dest, strarg); + break; + } + case IMAP_ARG_LIST: + str_append_c(dest, '('); + list = IMAP_ARG_LIST(args); + imap_args_to_str(dest, array_idx(list, 0)); + str_append_c(dest, ')'); + break; + case IMAP_ARG_LITERAL_SIZE: + case IMAP_ARG_LITERAL_SIZE_NONSYNC: + str_printfa(dest, "{%"PRIuUOFF_T"}\r\n", + IMAP_ARG_LITERAL_SIZE(args)); + str_append(dest, ""); + break; + case IMAP_ARG_EOL: + i_unreached(); + } + } +} diff --git a/src/lib-imap/imap-util.h b/src/lib-imap/imap-util.h index 23b7ff8b88..bfb3e79118 100644 --- a/src/lib-imap/imap-util.h +++ b/src/lib-imap/imap-util.h @@ -4,6 +4,7 @@ #include "seq-range-array.h" enum mail_flags; +struct imap_arg; /* Write flags as a space separated string. */ void imap_write_flags(string_t *dest, enum mail_flags flags, @@ -11,5 +12,7 @@ void imap_write_flags(string_t *dest, enum mail_flags flags, /* Write sequence range as IMAP sequence-set */ void imap_write_seq_range(string_t *dest, const ARRAY_TYPE(seq_range) *array); +/* Write IMAP args to given string. The string is mainly useful for humans. */ +void imap_args_to_str(string_t *dest, const struct imap_arg *args); #endif