Break out the unquote functionality to a separate function.
authorKen Hornstein <kenh@pobox.com>
Thu, 14 Nov 2013 16:43:33 +0000 (11:43 -0500)
committerPhilipp Takacs <philipp@bureaucracy.de>
Sat, 19 Sep 2015 20:37:19 +0000 (22:37 +0200)
h/prototypes.h
sbr/Makefile.in
sbr/fmt_scan.c
sbr/unquote.c [new file with mode: 0644]

index 848115f..42767f5 100644 (file)
@@ -112,6 +112,23 @@ int uprf(char *, char *);
 int vfgets(FILE *, char **);
 char *write_charset_8bit(void);
 
+/*
+ * Remove quotes and quoted-pair sequences from RFC-5322 atoms.
+ *
+ * Currently the actual algorithm is simpler than it technically should
+ * be: any quotes are simply eaten, unless they're preceded by the escape
+ * character (\).  This seems to be sufficient for our needs for now.
+ *
+ * Arguments:
+ *
+ * input       - The input string
+ * output      - The output string; is assumed to have at least as much
+ *               room as the input string.  At worst the output string will
+ *               be the same size as the input string; it might be smaller.
+ *
+ */
+void unquote_string(const char *input, char *output);
+
 int mh_strcasecmp(const char *s1, const char *s2);
 
 
index 61fc96c..4d2b91b 100644 (file)
@@ -69,7 +69,8 @@ SRCS = addrsbr.c ambigsw.c brkstring.c  \
        seq_setprev.c seq_setunseen.c signals.c  \
        smatch.c snprintb.c strcasecmp.c  \
        strindex.c trim.c trimcpy.c uprf.c vfgets.c fmt_def.c  \
-       mf.c utils.c m_mktemp.c seq_msgstats.c
+       mf.c utils.c m_mktemp.c seq_msgstats.c \
+       unquote.c
 
 OBJS =  $(SRCS:.c=.o)
 
index a8e773a..6cfc176 100644 (file)
@@ -688,32 +688,10 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat)
                /* UNQUOTEs RFC-2822 quoted-string and quoted-pair */
                case FT_LS_UNQUOTE:
                        if (str) {
-                               int m;
                                strncpy(buffer, str, sizeof(buffer));
                                /* strncpy doesn't NUL-terminate if it fills the buffer */
                                buffer[sizeof(buffer)-1] = '\0';
-                               str = buffer;
-
-                               /* we will parse from buffer to buffer2 */
-                               n = 0; /* n is the input position in str */
-                               m = 0; /* m is the ouput position in buffer2 */
-
-                               while ( str[n] != '\0') {
-                                       switch ( str[n] ) {
-                                       case '\\':
-                                               n++;
-                                               if ( str[n] != '\0')
-                                                       buffer2[m++] = str[n++];
-                                               break;
-                                       case '"':
-                                               n++;
-                                               break;
-                                       default:
-                                               buffer2[m++] = str[n++];
-                                               break;
-                                       }
-                               }
-                               buffer2[m] = '\0';
+                               unquote_string(buffer, buffer2);
                                str = buffer2;
                        }
                        break;
diff --git a/sbr/unquote.c b/sbr/unquote.c
new file mode 100644 (file)
index 0000000..f9fa911
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * unquote.c: Handle quote removal and quoted-pair strings on
+ * RFC 2822-5322 atoms.
+ *
+ * This code is Copyright (c) 2013, by the authors of nmh.  See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
+ */
+
+#include <h/mh.h>
+
+/*
+ * Remove quotes (and handle escape strings) from RFC 5322 quoted-strings.
+ *
+ * Since we never add characters to the string, the output buffer is assumed
+ * to have at least as many characters as the input string.
+ *
+ */
+
+void
+unquote_string(const char *input, char *output)
+{
+    int n = 0; /* n is the position in the input buffer */
+    int m = 0; /* m is the position in the output buffer */
+
+    while ( input[n] != '\0') {
+       switch ( input[n] ) {
+       case '\\':
+           n++;
+           if ( input[n] != '\0')
+               output[m++] = input[n++];
+           break;
+       case '"':
+           n++;
+           break;
+       default:
+           output[m++] = input[n++];
+           break;
+       }
+    }
+
+    output[m] = '\0';
+
+    return;
+}