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);
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)
/* 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;
--- /dev/null
+/*
+ * 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;
+}