From: Sergey Vlasov Date: Tue, 5 Jun 2001 16:37:28 +0000 (+0000) Subject: Created autoconf/automake rules for the quote format parser. X-Git-Tag: VERSION_0_5_0~104 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=1bb240ae558e620a6601783d0b722165303e9f38 Created autoconf/automake rules for the quote format parser. --- diff --git a/src/quote_fmt_lex.l b/src/quote_fmt_lex.l new file mode 100644 index 000000000..09bf36613 --- /dev/null +++ b/src/quote_fmt_lex.l @@ -0,0 +1,44 @@ +%{ +#include "quote_fmt_lex.h" +#include "quote_fmt_parse.h" +%} + +%option prefix="quote_fmt" +%option outfile="lex.yy.c" + +%% + +"%d" /* date */ return SHOW_DATE; +"%f" /* From */ return SHOW_FROM; +"%N" /* Full name */ return SHOW_FULLNAME; +"%F" /* firt name */ return SHOW_FIRST_NAME; +"%I" /* initial of sender */ return SHOW_SENDER_INITIAL; +"%s" /* subject */ return SHOW_SUBJECT; +"%t" /* to */ return SHOW_TO; +"%c" /* cc */ return SHOW_CC; +"%n" /* newsgroups */ return SHOW_NEWSGROUPS; +"%i" /* message-id */ return SHOW_MESSAGEID; +"%r" /* references */ return SHOW_REFERENCES; +"%M" /* message */ return SHOW_MESSAGE; +"%Q" /* quoted message */ return SHOW_QUOTED_MESSAGE; +"%%" /* % */ return SHOW_PERCENT; +"\\\\" /* \ */ return SHOW_BACKSLASH; +"\\t" /* tab */ return SHOW_TAB; +"\\n" /* retour à la ligne */ return SHOW_EOL; +"\\?" /* ? */ return SHOW_QUESTION_MARK; +"\\(" return SHOW_OPARENT; +"\\)" return SHOW_CPARENT; +"?d" /* query date */ return QUERY_DATE; +"?f" /* query from */ return QUERY_FROM; +"?N"|"?F"|"?I" /* query from name */ return QUERY_FULLNAME; +"?s" /* query subject */ return QUERY_SUBJECT; +"?t" /* query to */ return QUERY_TO; +"?c" /* query cc */ return QUERY_CC; +"?n" /* query newsgroups */ return QUERY_NEWSGROUPS; +"?i" /* query message-id */ return QUERY_MESSAGEID; +"?r" /* query references */ return QUERY_REFERENCES; +"(" return OPARENT; +")" return CPARENT; +. { yylval.chr = yytext[0]; return CHARACTER; } + +%% diff --git a/src/quote_fmt_parse.y b/src/quote_fmt_parse.y new file mode 100644 index 000000000..2fff53140 --- /dev/null +++ b/src/quote_fmt_parse.y @@ -0,0 +1,383 @@ +%{ + +#include "defs.h" + +#include +#include +#include + +#include "procmsg.h" +#include "procmime.h" +#include "utils.h" +#include "intl.h" + +#include "quote_fmt_lex.h" + +/* decl */ +/* +flex quote_fmt.l +bison -p quote_fmt quote_fmt.y +*/ + +static MsgInfo * msginfo = NULL; +static gboolean * visible = NULL; +static gint maxsize = 0; +static gint stacksize = 0; + +static gchar * buffer = NULL; +static gint bufmax = 0; +static gint bufsize = 0; +static gchar * quote_str = NULL; +static gint error = 0; + +static void add_visibility(gboolean val) +{ + stacksize ++; + if (maxsize < stacksize) { + maxsize += 128; + visible = g_realloc(visible, maxsize * sizeof(gboolean)); + if (visible == NULL) + maxsize = 0; + } + + visible[stacksize - 1] = val; +} + +static void remove_visibility() +{ + stacksize --; +} + + +static void add_buffer(gchar * s) +{ + gint len = strlen(s); + + if (bufsize + len + 1 > bufmax) { + if (bufmax == 0) + bufmax = 128; + while (bufsize + len + 1 > bufmax) + bufmax *= 2; + buffer = g_realloc(buffer, bufmax); + } + strcpy(buffer + bufsize, s); + bufsize += len; +} + +static void flush_buffer() +{ + if (buffer != NULL) + *buffer = 0; + bufsize = 0; +} + +gchar * quote_fmt_get_buffer() +{ + if (error != 0) + return NULL; + else + return buffer; +} + +#define INSERT(buf) \ + if (stacksize != 0 && visible[stacksize - 1]) \ + add_buffer(buf) + +#define INSERT_CHARACTER(chr) \ + if (stacksize != 0 && visible[stacksize - 1]) { \ + gchar tmp[2]; \ + tmp[0] = (chr); \ + tmp[1] = '\0'; \ + add_buffer(tmp); \ + } + +void quote_fmt_init(MsgInfo * info, gchar * my_quote_str) +{ + quote_str = my_quote_str; + msginfo = info; + stacksize = 0; + add_visibility(TRUE); + if (buffer != NULL) + *buffer = 0; + bufsize = 0; + error = 0; +} + +void quote_fmterror(char * str) +{ + g_warning(_("Error %s\n"), str); + error = 1; +} + +int quote_fmtwrap(void) +{ + return 1; +} + +static int isseparator(char ch) +{ + return isspace(ch) || ch == '.' || ch == '-'; +} +%} + +%union { + char chr; +} + +%token SHOW_NEWSGROUPS +%token SHOW_DATE SHOW_FROM SHOW_FULLNAME SHOW_FIRST_NAME +%token SHOW_SENDER_INITIAL SHOW_SUBJECT SHOW_TO SHOW_MESSAGEID +%token SHOW_PERCENT SHOW_CC SHOW_REFERENCES SHOW_MESSAGE +%token SHOW_QUOTED_MESSAGE SHOW_BACKSLASH SHOW_TAB +%token SHOW_EOL SHOW_QUESTION_MARK SHOW_OPARENT SHOW_CPARENT +%token QUERY_DATE QUERY_FROM +%token QUERY_FULLNAME QUERY_SUBJECT QUERY_TO QUERY_NEWSGROUPS +%token QUERY_MESSAGEID QUERY_CC QUERY_REFERENCES +%token OPARENT CPARENT +%token CHARACTER + +%start quote_fmt + +%token CHARACTER +%type character + +%% + +quote_fmt: + character_or_special_or_query_list; + +character_or_special_or_query_list: + character_or_special_or_query character_or_special_or_query_list + | character_or_special_or_query ; + +character_or_special_or_query: + special ; + | character + { + INSERT_CHARACTER($1); + } + | query ; + + +character: + CHARACTER + ; + +special: + SHOW_NEWSGROUPS + { + if (msginfo->newsgroups) + INSERT(msginfo->newsgroups); + } + | SHOW_DATE + { + if (msginfo->date) + INSERT(msginfo->date); + } + | SHOW_FROM + { + if (msginfo->from) + INSERT(msginfo->from); + } + | SHOW_FULLNAME + { + if (msginfo->fromname) + INSERT(msginfo->fromname); + } + | SHOW_FIRST_NAME + { + if (msginfo->fromname) { + gchar * p; + gchar * str; + + str = alloca(strlen(msginfo->fromname) + 1); + if (str != NULL) { + strcpy(str, msginfo->fromname); + p = str; + while (*p && !isspace(*p)) p++; + *p = '\0'; + INSERT(str); + } + } + } + | SHOW_SENDER_INITIAL + { +#define MAX_SENDER_INITIAL 20 + if (msginfo->fromname) { + gchar tmp[MAX_SENDER_INITIAL]; + gchar * 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); + } + } + | SHOW_SUBJECT + { + if (msginfo->subject) + INSERT(msginfo->subject); + } + | SHOW_TO + { + if (msginfo->to) + INSERT(msginfo->to); + } + | SHOW_MESSAGEID + { + if (msginfo->msgid) + INSERT(msginfo->msgid); + } + | SHOW_PERCENT + { + INSERT("%"); + } + | SHOW_CC + { + if (msginfo->cc) + INSERT(msginfo->cc); + } + | SHOW_REFERENCES + { + if (msginfo->references) + INSERT(msginfo->references); + } + | SHOW_MESSAGE + { + gchar buf[BUFFSIZE]; + FILE * fp; + + if ((fp = procmime_get_text_part(msginfo)) == NULL) + g_warning(_("Can't get text part\n")); + while (fgets(buf, sizeof(buf), fp) != NULL) { + INSERT(buf); + } + fclose(fp); + } + | SHOW_QUOTED_MESSAGE + { + gchar buf[BUFFSIZE]; + FILE * fp; + + if ((fp = procmime_get_text_part(msginfo)) == NULL) + g_warning(_("Can't get text part\n")); + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (quote_str) + INSERT(quote_str); + INSERT(buf); + } + fclose(fp); + } + | SHOW_BACKSLASH + { + INSERT("\\"); + } + | SHOW_TAB + { + INSERT("\t"); + } + | SHOW_EOL + { + INSERT("\n"); + } + | SHOW_QUESTION_MARK + { + INSERT("?"); + } + | SHOW_OPARENT + { + INSERT("("); + } + | SHOW_CPARENT + { + INSERT(")"); + }; + +query: + QUERY_DATE + { + add_visibility(msginfo->date != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_FROM + { + add_visibility(msginfo->from != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_FULLNAME + { + add_visibility(msginfo->fromname != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_SUBJECT + { + add_visibility(msginfo->subject != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_TO + { + add_visibility(msginfo->to != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_NEWSGROUPS + { + add_visibility(msginfo->newsgroups != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_MESSAGEID + { + add_visibility(msginfo->msgid != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_CC + { + add_visibility(msginfo->cc != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + } + | QUERY_REFERENCES + { + add_visibility(msginfo->references != NULL); + } + OPARENT quote_fmt CPARENT + { + remove_visibility(); + };