aboutsummaryrefslogtreecommitdiff
path: root/libsylph
diff options
context:
space:
mode:
Diffstat (limited to 'libsylph')
-rw-r--r--libsylph/codeconv.c21
-rw-r--r--libsylph/utils.c23
2 files changed, 32 insertions, 12 deletions
diff --git a/libsylph/codeconv.c b/libsylph/codeconv.c
index 6a16513c..605849d9 100644
--- a/libsylph/codeconv.c
+++ b/libsylph/codeconv.c
@@ -2175,6 +2175,8 @@ void conv_encode_header(gchar *dest, gint len, const gchar *src,
left = MAX_LINELEN - header_len;
while (*srcp) {
+ gboolean in_quote = FALSE;
+
LBREAK_IF_REQUIRED(left <= 0, TRUE);
while (g_ascii_isspace(*srcp)) {
@@ -2219,13 +2221,18 @@ void conv_encode_header(gchar *dest, gint len, const gchar *src,
gboolean cont = FALSE;
while (*p != '\0') {
- if (g_ascii_isspace(*p) &&
- !is_next_nonascii(p + 1))
- break;
- /* don't include parentheses in encoded
- strings */
- if (addr_field && (*p == '(' || *p == ')'))
- break;
+ if (*p == '"')
+ in_quote ^= TRUE;
+ else if (!in_quote) {
+ if (g_ascii_isspace(*p) &&
+ !is_next_nonascii(p + 1))
+ break;
+ /* don't include parentheses in encoded
+ strings */
+ if (addr_field &&
+ (*p == '(' || *p == ')'))
+ break;
+ }
mb_len = g_utf8_skip[*(guchar *)p];
diff --git a/libsylph/utils.c b/libsylph/utils.c
index 663d121f..f8f5d005 100644
--- a/libsylph/utils.c
+++ b/libsylph/utils.c
@@ -468,13 +468,19 @@ gint str_find_format_times(const gchar *haystack, gchar ch)
gboolean is_next_nonascii(const gchar *s)
{
const gchar *p;
+ gboolean in_quote = FALSE;
/* skip head space */
for (p = s; *p != '\0' && g_ascii_isspace(*p); p++)
;
- for (; *p != '\0' && !g_ascii_isspace(*p); p++) {
- if (*(guchar *)p > 127 || *(guchar *)p < 32)
+ while (*p != '\0') {
+ if (!in_quote && g_ascii_isspace(*p))
+ break;
+ if (*p == '"')
+ in_quote ^= TRUE;
+ else if (*(guchar *)p > 127 || *(guchar *)p < 32)
return TRUE;
+ ++p;
}
return FALSE;
@@ -482,12 +488,19 @@ gboolean is_next_nonascii(const gchar *s)
gint get_next_word_len(const gchar *s)
{
+ const gchar *p = s;
gint len = 0;
+ gboolean in_quote = FALSE;
- for (; *s != '\0' && !g_ascii_isspace(*s); s++, len++)
- ;
+ while (*p != '\0') {
+ if (!in_quote && g_ascii_isspace(*p))
+ break;
+ if (*p == '"')
+ in_quote ^= TRUE;
+ ++p;
+ }
- return len;
+ return p - s;
}
/* compare subjects */