1 %pointer 2 %x NORMAL NEXTCMD COMMAND FIELD NEXTARG PARAMS SSTRING DSTRING 3 4 %o 10000 5 %a 10000 6 7 %{ 8 9 /* 10 * $Id: mc-filt.l,v 1.13 2013/12/02 01:32:53 tom Exp $ 11 * 12 * Filter to add vile "attribution" sequences to selected bits of mailcap-file. 13 */ 14 15 #include <filters.h> 16 #include <fltstack.h> 17 18 DefineFilter(mailcap); 19 20 static char *Action_attr; 21 static char *Comment_attr; 22 static char *Error_attr; 23 static char *Ident_attr; 24 static char *Number_attr; 25 static char *String_attr; 26 27 %} 28 29 BLANK [ \t] 30 31 SSTRING \'([^']|\n)*\' 32 33 NAME [[:alnum:]_\.-] 34 35 WILDCARD (\?|\*) 36 WILDNAME ({NAME}|{WILDCARD}) 37 FILENAME (([./]{WILDNAME}+)|({WILDNAME}+[./]{WILDNAME}*)|({NAME}*{WILDCARD})|\.+\/+)+ 38 39 INTEGER [-+]?([[:digit:]]+) 40 41 IDENT [[:alpha:]_]{NAME}* 42 IDENT1 \${NAME}+ 43 IDENT2 \$\{[#]?{IDENT}\} 44 IDENTX \$[\*@#\?\$!-] 45 46 MIMELEAF [[:alpha:]*]([[:alnum:]*.+-])* 47 MIMENAME {MIMELEAF}("/"{MIMELEAF})? 48 49 %% 50 51 <NORMAL>{MIMENAME} { WriteToken(Ident_attr); new_state(NEXTCMD); } 52 <NORMAL>^[#][^\r\n]* { WriteToken(Comment_attr); } 53 <NORMAL>{BLANK} { ECHO; } 54 <NORMAL>. { WriteToken(Error_attr); } 55 56 <NEXTCMD>{BLANK} { ECHO; } 57 <NEXTCMD>";" { ECHO; new_state(COMMAND); } 58 <NEXTCMD>[\r\n] { ECHO; new_state(NORMAL); } 59 60 <COMMAND>{BLANK} { ECHO; } 61 <COMMAND>{IDENT} | 62 <COMMAND>{FILENAME} { ECHO; new_state(PARAMS); } 63 <COMMAND>[\r\n] { ECHO; new_state(NORMAL); } 64 65 <FIELD>{BLANK} { ECHO; } 66 <FIELD>{IDENT} { WriteToken(get_keyword_attr(yytext)); new_state(NEXTARG); } 67 68 <NEXTARG>{BLANK} { ECHO; } 69 <NEXTARG>";" { ECHO; new_state(FIELD); } 70 <NEXTARG>"=" { ECHO; new_state(PARAMS); } 71 <NEXTARG>[\r\n] { ECHO; new_state(NORMAL); } 72 73 <PARAMS>"%"[nFts] { WriteToken(Action_attr); } 74 <PARAMS>"%{"{IDENT}"}" { WriteToken(Action_attr); } 75 76 <PARAMS>{FILENAME} | 77 <PARAMS>{IDENT} { ECHO; } 78 79 <PARAMS>{INTEGER} { WriteToken(Number_attr); } 80 81 <PARAMS>{IDENT1} | 82 <PARAMS>{IDENT2} | 83 <PARAMS>{IDENTX} { WriteToken(Ident_attr); } 84 85 <PARAMS>\\[n] { flt_bfr_embed(yytext, 1, Action_attr); flt_bfr_append(yytext + 1, yyleng - 1); } 86 <PARAMS>\\. | 87 <PARAMS>\' { PushQuote(SSTRING, String_attr); } 88 <PARAMS>\" { PushQuote(DSTRING, String_attr); } 89 90 <PARAMS>";" { ECHO; new_state(FIELD); } 91 <PARAMS>[\r\n] { ECHO; new_state(NORMAL); } 92 93 <DSTRING>\\[\n] | 94 <DSTRING>\\. { flt_bfr_append(yytext, yyleng); } 95 <DSTRING>"%"[nFts] { flt_bfr_embed(yytext, yyleng, Action_attr); } 96 <DSTRING>"%{"{IDENT}"}" { flt_bfr_embed(yytext, yyleng, Action_attr); } 97 <DSTRING>{IDENT1} | 98 <DSTRING>{IDENT2} { flt_bfr_embed(yytext, yyleng, Ident_attr); } 99 <DSTRING>[^%\n\\\"]+ { flt_bfr_append(yytext, yyleng); } 100 <DSTRING>[\n] | 101 <DSTRING>\" { PopQuote(); } 102 103 <SSTRING>\\[\n] | 104 <SSTRING>\\. { flt_bfr_append(yytext, yyleng); } 105 <SSTRING>"%"[nFts] { flt_bfr_embed(yytext, yyleng, Action_attr); } 106 <SSTRING>"%{"{IDENT}"}" { flt_bfr_embed(yytext, yyleng, Action_attr); } 107 <SSTRING>[^%\n\\\']+ { flt_bfr_append(yytext, yyleng); } 108 <SSTRING>[\n] | 109 <SSTRING>\' { PopQuote(); } 110 111 %% 112 113 #include <fltstack.h> 114 115 static void 116 init_filter(int before GCC_UNUSED) 117 { 118 (void) before; 119 } 120 121 static void 122 do_filter(FILE *inputs) 123 { 124 InitLEX(inputs); 125 126 Action_attr = class_attr(NAME_ACTION); 127 Comment_attr = class_attr(NAME_COMMENT); 128 Error_attr = class_attr(NAME_ERROR); 129 Ident_attr = class_attr(NAME_IDENT2); 130 Number_attr = class_attr(NAME_NUMBER); 131 String_attr = class_attr(NAME_LITERAL); 132 133 begin_state(NORMAL); 134 135 RunLEX(); 136 flt_bfr_error(); 137 end_state(); 138 } 139 140 #if NO_LEAKS 141 static void 142 free_filter(void) 143 { 144 USE_LEXFREE; 145 } 146 #endif 147