From: Ken Hornstein Date: Thu, 14 Nov 2013 16:43:33 +0000 (-0500) Subject: Break out the unquote functionality to a separate function. X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/7e8ff2e745cc775339c53d29658f358786f4a500?ds=sidebyside;hp=-c Break out the unquote functionality to a separate function. --- 7e8ff2e745cc775339c53d29658f358786f4a500 diff --git a/Makefile.am b/Makefile.am index 1f87ac26..439ce152 100644 --- a/Makefile.am +++ b/Makefile.am @@ -547,7 +547,8 @@ sbr_libmh_a_SOURCES = sbr/addrsbr.c sbr/ambigsw.c sbr/atooi.c sbr/arglist.c \ sbr/seq_setcur.c sbr/seq_setprev.c sbr/seq_setunseen.c \ sbr/showfile.c sbr/signals.c sbr/smatch.c \ sbr/snprintb.c sbr/ssequal.c \ - sbr/strindex.c sbr/trimcpy.c sbr/uprf.c sbr/vfgets.c \ + sbr/strindex.c sbr/trimcpy.c sbr/unquote.c \ + sbr/uprf.c sbr/vfgets.c \ sbr/fmt_def.c sbr/mf.c sbr/utils.c sbr/ctype-checked.c \ sbr/m_mktemp.c sbr/getansreadline.c sbr/vector.c \ config/config.c config/version.c diff --git a/h/prototypes.h b/h/prototypes.h index 57e51d7b..6db99958 100644 --- a/h/prototypes.h +++ b/h/prototypes.h @@ -212,6 +212,23 @@ int ssequal (char *, char *); int stringdex (char *, char *); char *trimcpy (char *); int unputenv (char *); + +/* + * 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 uprf (char *, char *); int vfgets (FILE *, char **); char *write_charset_8bit (void); diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index d0bb16df..408b1093 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -868,32 +868,10 @@ fmt_scan (struct format *format, char *scanl, size_t max, 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 00000000..f9fa9112 --- /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; +}