]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added imap_args_to_str()
authorTimo Sirainen <tss@iki.fi>
Fri, 6 Feb 2009 18:38:54 +0000 (13:38 -0500)
committerTimo Sirainen <tss@iki.fi>
Fri, 6 Feb 2009 18:38:54 +0000 (13:38 -0500)
--HG--
branch : HEAD

src/lib-imap/imap-util.c
src/lib-imap/imap-util.h

index 6025f4a9e6aa15a0e242c79294a2c72283bc02a3..62e758d1e1f661fe724fad68f70d0f08e3c37c17 100644 (file)
@@ -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, "<too large>");
+                       break;
+               case IMAP_ARG_EOL:
+                       i_unreached();
+               }
+       }
+}
index 23b7ff8b88ed2ca2b12791a7ac8e59db8d89cd9a..bfb3e791184aeb98748a84e4d3dfa3bdad8ce607 100644 (file)
@@ -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