From 4c30d368bca8b3f108a7e86a5b890e33470cdebf Mon Sep 17 00:00:00 2001 From: Ken Hornstein Date: Thu, 14 Nov 2013 11:43:33 -0500 Subject: [PATCH] Break out the unquote functionality to a separate function. --- h/prototypes.h | 17 +++++++++++++++++ sbr/Makefile.in | 3 ++- sbr/fmt_scan.c | 24 +----------------------- sbr/unquote.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 sbr/unquote.c diff --git a/h/prototypes.h b/h/prototypes.h index 848115f..42767f5 100644 --- a/h/prototypes.h +++ b/h/prototypes.h @@ -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); diff --git a/sbr/Makefile.in b/sbr/Makefile.in index 61fc96c..4d2b91b 100644 --- a/sbr/Makefile.in +++ b/sbr/Makefile.in @@ -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) diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index a8e773a..6cfc176 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -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 index 0000000..f9fa911 --- /dev/null +++ b/sbr/unquote.c @@ -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 + +/* + * 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; +} -- 1.7.10.4