changeset 21979:93b58b983718

lib-imap: Add imap_write_arg() to write only a single arg
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 24 Apr 2017 12:50:10 +0300
parents 225072babbce
children 53b40f5b0626
files src/lib-imap/imap-util.c src/lib-imap/imap-util.h
diffstat 2 files changed, 42 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-imap/imap-util.c	Sun Apr 23 19:57:11 2017 +0300
+++ b/src/lib-imap/imap-util.c	Mon Apr 24 12:50:10 2017 +0300
@@ -74,6 +74,43 @@
 	}
 }
 
+void imap_write_arg(string_t *dest, const struct imap_arg *arg)
+{
+	switch (arg->type) {
+	case IMAP_ARG_NIL:
+		str_append(dest, "NIL");
+		break;
+	case IMAP_ARG_ATOM:
+		str_append(dest, imap_arg_as_astring(arg));
+		break;
+	case IMAP_ARG_STRING:
+		str_append_c(dest, '"');
+		str_append(dest, str_escape(imap_arg_as_astring(arg)));
+		str_append_c(dest, '"');
+		break;
+	case IMAP_ARG_LITERAL: {
+		const char *strarg = imap_arg_as_astring(arg);
+		str_printfa(dest, "{%"PRIuSIZE_T"}\r\n",
+			    strlen(strarg));
+		str_append(dest, strarg);
+		break;
+	}
+	case IMAP_ARG_LIST:
+		str_append_c(dest, '(');
+		imap_write_args(dest, imap_arg_as_list(arg));
+		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_as_literal_size(arg));
+		str_append(dest, "<too large>");
+		break;
+	case IMAP_ARG_EOL:
+		i_unreached();
+	}
+}
+
 void imap_write_args(string_t *dest, const struct imap_arg *args)
 {
 	bool first = TRUE;
@@ -83,40 +120,7 @@
 			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_as_astring(args));
-			break;
-		case IMAP_ARG_STRING:
-			str_append_c(dest, '"');
-			str_append(dest, str_escape(imap_arg_as_astring(args)));
-			str_append_c(dest, '"');
-			break;
-		case IMAP_ARG_LITERAL: {
-			const char *strarg = imap_arg_as_astring(args);
-			str_printfa(dest, "{%"PRIuSIZE_T"}\r\n",
-				    strlen(strarg));
-			str_append(dest, strarg);
-			break;
-		}
-		case IMAP_ARG_LIST:
-			str_append_c(dest, '(');
-			imap_write_args(dest, imap_arg_as_list(args));
-			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_as_literal_size(args));
-			str_append(dest, "<too large>");
-			break;
-		case IMAP_ARG_EOL:
-			i_unreached();
-		}
+		imap_write_arg(dest, args);
 	}
 }
 
--- a/src/lib-imap/imap-util.h	Sun Apr 23 19:57:11 2017 +0300
+++ b/src/lib-imap/imap-util.h	Mon Apr 24 12:50:10 2017 +0300
@@ -14,7 +14,10 @@
 
 /* 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. */
+/* Write IMAP arg to the given string. Because IMAP_ARG_LITERAL_SIZE* have no
+   content, they're written as "{size}\r\n<too large>". */
+void imap_write_arg(string_t *dest, const struct imap_arg *arg);
+/* Same as imap_write_arg(), but write all the args until EOL. */
 void imap_write_args(string_t *dest, const struct imap_arg *args);
 /* Write IMAP args in a human-readable format to given string (e.g. for
    logging). The output is a single valid UTF-8 line without control