Index: src/quote_fmt_parse.y =================================================================== RCS file: /cvsroot/sylpheed-claws/sylpheed-claws/src/quote_fmt_parse.y,v retrieving revision 1.22.2.5 diff -u -r1.22.2.5 quote_fmt_parse.y --- src/quote_fmt_parse.y 8 Dec 2004 13:35:03 -0000 1.22.2.5 +++ src/quote_fmt_parse.y 10 Dec 2004 21:10:42 -0000 @@ -143,6 +143,236 @@ { return isspace(ch) || ch == '.' || ch == '-'; } + +static void quote_fmt_show_date(const MsgInfo *msginfo, const gchar *format) +{ + char result[100]; + char *rptr; + char zone[6]; + struct tm lt; + const char *fptr; + const char *zptr; + + if (!msginfo->date) + return; + + /* + * ALF - GNU C's strftime() has a nice format specifier + * for time zone offset (%z). Non-standard however, so + * emulate it. + */ + +#define RLEFT (sizeof result) - (rptr - result) +#define STR_SIZE(x) (sizeof (x) - 1) + + zone[0] = 0; + + if (procheader_date_parse_to_tm(msginfo->date, <, zone)) { + /* + * break up format string in tiny bits delimited by valid %z's and + * feed it to strftime(). don't forget that '%%z' mean literal '%z'. + */ + for (rptr = result, fptr = format; fptr && *fptr && rptr < &result[sizeof result - 1];) { + int perc; + const char *p; + char *tmp; + + if (NULL != (zptr = strstr(fptr, "%z"))) { + /* + * count nr. of prepended percent chars + */ + for (perc = 0, p = zptr; p && p >= format && *p == '%'; p--, perc++) + ; + /* + * feed to strftime() + */ + tmp = g_strndup(fptr, zptr - fptr + (perc % 2 ? 0 : STR_SIZE("%z"))); + if (tmp) { + rptr += strftime(rptr, RLEFT, tmp, <); + g_free(tmp); + } + /* + * append time zone offset + */ + if (zone[0] && perc % 2) + rptr += g_snprintf(rptr, RLEFT, "%s", zone); + fptr = zptr + STR_SIZE("%z"); + } else { + rptr += strftime(rptr, RLEFT, fptr, <); + fptr = NULL; + } + } + + INSERT(result); + } +#undef STR_SIZE +#undef RLEFT +} + +static void quote_fmt_show_first_name(const MsgInfo *msginfo) +{ + guchar *p; + gchar *str; + + if (!msginfo->fromname) + return; + + p = strchr(msginfo->fromname, ','); + if (p != NULL) { + /* fromname is like "Duck, Donald" */ + p++; + while (*p && isspace(*p)) p++; + str = alloca(strlen(p) + 1); + if (str != NULL) { + strcpy(str, p); + INSERT(str); + } + } else { + /* fromname is like "Donald Duck" */ + str = alloca(strlen(msginfo->fromname) + 1); + if (str != NULL) { + strcpy(str, msginfo->fromname); + p = str; + while (*p && !isspace(*p)) p++; + *p = '\0'; + INSERT(str); + } + } +} + +static void quote_fmt_show_last_name(const MsgInfo *msginfo) +{ + gchar *p; + gchar *str; + + /* This probably won't work together very well with Middle + names and the like - thth */ + if (!msginfo->fromname) + return; + + str = alloca(strlen(msginfo->fromname) + 1); + if (str != NULL) { + strcpy(str, msginfo->fromname); + p = strchr(str, ','); + if (p != NULL) { + /* fromname is like "Duck, Donald" */ + *p = '\0'; + INSERT(str); + } else { + /* fromname is like "Donald Duck" */ + p = str; + while (*p && !isspace(*p)) p++; + if (*p) { + /* We found a space. Get first + none-space char and insert + rest of string from there. */ + while (*p && isspace(*p)) p++; + if (*p) { + INSERT(p); + } else { + /* If there is no none-space + char, just insert whole + fromname. */ + INSERT(str); + } + } else { + /* If there is no space, just + insert whole fromname. */ + INSERT(str); + } + } + } +} + +static void quote_fmt_show_sender_initial(const MsgInfo *msginfo) +{ +#define MAX_SENDER_INITIAL 20 + gchar tmp[MAX_SENDER_INITIAL]; + guchar *p; + gchar *cur; + gint len = 0; + + if (!msginfo->fromname) + return; + + p = msginfo->fromname; + cur = tmp; + while (*p) { + if (*p && isalnum(*p)) { + *cur = toupper(*p); + cur++; + len++; + if (len >= MAX_SENDER_INITIAL - 1) + break; + } else + break; + while (*p && !isseparator(*p)) p++; + while (*p && isseparator(*p)) p++; + } + *cur = '\0'; + INSERT(tmp); +} + +static void quote_fmt_show_msg(MsgInfo *msginfo, const gchar *body, + gboolean quoted, gboolean signature, + const gchar *quote_str) +{ + gchar buf[BUFFSIZE]; + FILE *fp; + + if (!(msginfo->folder || body)) + return; + + if (body) + fp = str_open_as_stream(body); + else + fp = procmime_get_first_text_content(msginfo); + + if (fp == NULL) + g_warning("Can't get text part\n"); + else { + while (fgets(buf, sizeof(buf), fp) != NULL) { + strcrchomp(buf); + + if (!signature && strncmp(buf, "-- \n", 4) == 0) + break; + + if (quoted && quote_str) + INSERT(quote_str); + + INSERT(buf); + } + fclose(fp); + } +} + +static void quote_fmt_insert_file(const gchar *filename) +{ + FILE *file; + char buffer[256]; + + if ((file = fopen(filename, "rb")) != NULL) { + while (fgets(buffer, sizeof(buffer), file)) { + INSERT(buffer); + } + fclose(file); + } + +} + +static void quote_fmt_insert_program_output(const gchar *progname) +{ + FILE *file; + char buffer[256]; + + if ((file = popen(progname, "r")) != NULL) { + while (fgets(buffer, sizeof(buffer), file)) { + INSERT(buffer); + } + fclose(file); + } +} + %} %union { @@ -221,65 +451,7 @@ } | SHOW_DATE_EXPR OPARENT string CPARENT { - /* - * ALF - GNU C's strftime() has a nice format specifier - * for time zone offset (%z). Non-standard however, so - * emulate it. - */ - if (msginfo->date) { - char result[100]; - char *rptr; - char zone[6]; - struct tm lt; - const char *fptr; - const char *zptr; - -#define RLEFT (sizeof result) - (rptr - result) -#define STR_SIZE(x) (sizeof (x) - 1) - - zone[0] = 0; - - if (procheader_date_parse_to_tm(msginfo->date, <, zone)) { - /* - * break up format string in tiny bits delimited by valid %z's and - * feed it to strftime(). don't forget that '%%z' mean literal '%z'. - */ - for (rptr = result, fptr = $3; fptr && *fptr && rptr < &result[sizeof result - 1];) { - int perc; - const char *p; - char *tmp; - - if (NULL != (zptr = strstr(fptr, "%z"))) { - /* - * count nr. of prepended percent chars - */ - for (perc = 0, p = zptr; p && p >= $3 && *p == '%'; p--, perc++) - ; - /* - * feed to strftime() - */ - tmp = g_strndup(fptr, zptr - fptr + (perc % 2 ? 0 : STR_SIZE("%z"))); - if (tmp) { - rptr += strftime(rptr, RLEFT, tmp, <); - g_free(tmp); - } - /* - * append time zone offset - */ - if (zone[0] && perc % 2) - rptr += g_snprintf(rptr, RLEFT, "%s", zone); - fptr = zptr + STR_SIZE("%z"); - } else { - rptr += strftime(rptr, RLEFT, fptr, <); - fptr = NULL; - } - } - - INSERT(result); - } -#undef STR_SIZE -#undef RLEFT - } + quote_fmt_show_date(msginfo, $3); } | SHOW_DATE { @@ -298,101 +470,15 @@ } | SHOW_FIRST_NAME { - if (msginfo->fromname) { - guchar *p; - gchar *str; - - p = strchr(msginfo->fromname, ','); - if (p != NULL) { - /* fromname is like "Duck, Donald" */ - p++; - while (*p && isspace(*p)) p++; - str = alloca(strlen(p) + 1); - if (str != NULL) { - strcpy(str, p); - INSERT(str); - } - } else { - /* fromname is like "Donald Duck" */ - str = alloca(strlen(msginfo->fromname) + 1); - if (str != NULL) { - strcpy(str, msginfo->fromname); - p = str; - while (*p && !isspace(*p)) p++; - *p = '\0'; - INSERT(str); - } - } - } + quote_fmt_show_first_name(msginfo); } | SHOW_LAST_NAME { - /* This probably won't work together very well with Middle - names and the like - thth */ - if (msginfo->fromname) { - gchar *p; - gchar *str; - - str = alloca(strlen(msginfo->fromname) + 1); - if (str != NULL) { - strcpy(str, msginfo->fromname); - p = strchr(str, ','); - if (p != NULL) { - /* fromname is like "Duck, Donald" */ - *p = '\0'; - INSERT(str); - } else { - /* fromname is like "Donald Duck" */ - p = str; - while (*p && !isspace(*p)) p++; - if (*p) { - /* We found a space. Get first - none-space char and insert - rest of string from there. */ - while (*p && isspace(*p)) p++; - if (*p) { - INSERT(p); - } else { - /* If there is no none-space - char, just insert whole - fromname. */ - INSERT(str); - } - } else { - /* If there is no space, just - insert whole fromname. */ - INSERT(str); - } - } - } - } + quote_fmt_show_last_name(msginfo); } | SHOW_SENDER_INITIAL { -#define MAX_SENDER_INITIAL 20 - if (msginfo->fromname) { - gchar tmp[MAX_SENDER_INITIAL]; - guchar *p; - gchar *cur; - gint len = 0; - - p = msginfo->fromname; - cur = tmp; - while (*p) { - if (*p && isalnum(*p)) { - *cur = toupper(*p); - cur++; - len++; - if (len >= MAX_SENDER_INITIAL - 1) - break; - } else - break; - while (*p && !isseparator(*p)) p++; - while (*p && isseparator(*p)) p++; - } - *cur = '\0'; - INSERT(tmp); - } + quote_fmt_show_sender_initial(msginfo); } | SHOW_SUBJECT { @@ -425,99 +511,19 @@ } | SHOW_MESSAGE { - if (msginfo->folder || body) { - gchar buf[BUFFSIZE]; - FILE *fp; - - if (body) - fp = str_open_as_stream(body); - else - fp = procmime_get_first_text_content(msginfo); - - if (fp == NULL) - g_warning("Can't get text part\n"); - else { - while (fgets(buf, sizeof(buf), fp) != NULL) { - strcrchomp(buf); - INSERT(buf); - } - fclose(fp); - } - } + quote_fmt_show_msg(msginfo, body, FALSE, TRUE, quote_str); } | SHOW_QUOTED_MESSAGE { - if (msginfo->folder || body) { - gchar buf[BUFFSIZE]; - FILE *fp; - - if (body) - fp = str_open_as_stream(body); - else - fp = procmime_get_first_text_content(msginfo); - - if (fp == NULL) - g_warning("Can't get text part\n"); - else { - while (fgets(buf, sizeof(buf), fp) != NULL) { - strcrchomp(buf); - if (quote_str) - INSERT(quote_str); - INSERT(buf); - } - fclose(fp); - } - } + quote_fmt_show_msg(msginfo, body, TRUE, TRUE, quote_str); } | SHOW_MESSAGE_NO_SIGNATURE { - if (msginfo->folder || body) { - gchar buf[BUFFSIZE]; - FILE *fp; - - if (body) - fp = str_open_as_stream(body); - else - fp = procmime_get_first_text_content(msginfo); - - if (fp == NULL) - g_warning("Can't get text part\n"); - else { - while (fgets(buf, sizeof(buf), fp) != NULL) { - strcrchomp(buf); - if (strncmp(buf, "-- \n", 4) == 0) - break; - INSERT(buf); - } - fclose(fp); - } - } + quote_fmt_show_msg(msginfo, body, FALSE, FALSE, quote_str); } | SHOW_QUOTED_MESSAGE_NO_SIGNATURE { - if (msginfo->folder || body) { - gchar buf[BUFFSIZE]; - FILE *fp; - - if (body) - fp = str_open_as_stream(body); - else - fp = procmime_get_first_text_content(msginfo); - - if (fp == NULL) - g_warning("Can't get text part\n"); - else { - while (fgets(buf, sizeof(buf), fp) != NULL) { - strcrchomp(buf); - if (strncmp(buf, "-- \n", 4) == 0) - break; - if (quote_str) - INSERT(quote_str); - INSERT(buf); - } - fclose(fp); - } - } + quote_fmt_show_msg(msginfo, body, TRUE, FALSE, quote_str); } | SHOW_BACKSLASH { @@ -629,29 +635,9 @@ insert: INSERT_FILE OPARENT string CPARENT { - { - FILE *file; - char buffer[256]; - - if((file = fopen($3, "rb")) != NULL) { - while(fgets(buffer, sizeof(buffer), file)) { - INSERT(buffer); - } - fclose(file); - } - } + quote_fmt_insert_file($3); } | INSERT_PROGRAMOUTPUT OPARENT string CPARENT { - { - FILE *file; - char buffer[256]; - - if((file = popen($3, "r")) != NULL) { - while(fgets(buffer, sizeof(buffer), file)) { - INSERT(buffer); - } - fclose(file); - } - } + quote_fmt_insert_program_output($3); };