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