X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/62ef2216d2c7c1c563ea163e2a0fdacccb54e31e..36bde473fdfeb75de65fb7b1920a6fb137f32f3c:/lib/mime.c?ds=inline diff --git a/lib/mime.c b/lib/mime.c index 7ba4254..9883a3c 100644 --- a/lib/mime.c +++ b/lib/mime.c @@ -457,6 +457,8 @@ char *mime_qp(const char *s) { * @param s Header field value * @param cd Where to store result * @return 0 on success, non-0 on error + * + * See RFC 2109. */ int parse_cookie(const char *s, struct cookiedata *cd) { @@ -529,6 +531,41 @@ const struct cookie *find_cookie(const struct cookiedata *cd, return 0; } +/** @brief RFC822 quoting + * @param s String to quote + * @param force If non-0, always quote + * @return Possibly quoted string + */ +char *quote822(const char *s, int force) { + const char *t; + struct dynstr d[1]; + int c; + + if(!force) { + /* See if we need to quote */ + for(t = s; (c = (unsigned char)*t); ++t) { + if(tspecial(c) || http_separator(c) || whitespace(c)) + break; + } + if(*t) + force = 1; + } + + if(!force) + return xstrdup(s); + + dynstr_init(d); + dynstr_append(d, '"'); + for(t = s; (c = (unsigned char)*t); ++t) { + if(c == '"' || c == '\\') + dynstr_append(d, '\\'); + dynstr_append(d, c); + } + dynstr_append(d, '"'); + dynstr_terminate(d); + return d->vec; +} + /* Local Variables: c-basic-offset:2