Blame


1 d1f529f4 2005-10-29 devnull #include <u.h>
2 d1f529f4 2005-10-29 devnull #include <libc.h>
3 d1f529f4 2005-10-29 devnull #include <bio.h>
4 d1f529f4 2005-10-29 devnull #include <regexp.h>
5 d1f529f4 2005-10-29 devnull #include "dfa.h"
6 d1f529f4 2005-10-29 devnull
7 d1f529f4 2005-10-29 devnull /***
8 d1f529f4 2005-10-29 devnull * Regular expression for matching.
9 d1f529f4 2005-10-29 devnull */
10 d1f529f4 2005-10-29 devnull
11 fa325e9b 2020-01-10 cross char *ignore[] =
12 d1f529f4 2005-10-29 devnull {
13 d1f529f4 2005-10-29 devnull /* HTML that isn't A, IMG, or FONT */
14 d1f529f4 2005-10-29 devnull /* Must have a space somewhere to avoid catching <email@address> */
15 d1f529f4 2005-10-29 devnull "<[ \n\r]*("
16 d1f529f4 2005-10-29 devnull "[^aif]|"
17 d1f529f4 2005-10-29 devnull "a[^> \t\r\n]|"
18 d1f529f4 2005-10-29 devnull "i[^mM \t\r\n]|"
19 d1f529f4 2005-10-29 devnull "im[^gG \t\r\n]|"
20 d1f529f4 2005-10-29 devnull "img[^> \t\r\n]|"
21 d1f529f4 2005-10-29 devnull "f[^oO \t\r\n]|"
22 d1f529f4 2005-10-29 devnull "fo[^Nn \t\r\n]|"
23 d1f529f4 2005-10-29 devnull "fon[^tT \t\r\n]|"
24 d1f529f4 2005-10-29 devnull "font[^> \r\t\n]"
25 d1f529f4 2005-10-29 devnull ")[^>]*[ \t\n\r][^>]*>",
26 d1f529f4 2005-10-29 devnull "<[ \n\r]*("
27 d1f529f4 2005-10-29 devnull "i|im|f|fo|fon"
28 d1f529f4 2005-10-29 devnull ")[ \t\r\n][^>]*>",
29 d1f529f4 2005-10-29 devnull
30 d1f529f4 2005-10-29 devnull /* ignore html comments */
31 d1f529f4 2005-10-29 devnull "<!--([^\\-]|-[^\\-]|--[^>]|\n)*-->",
32 d1f529f4 2005-10-29 devnull
33 d1f529f4 2005-10-29 devnull /* random mail strings */
34 d1f529f4 2005-10-29 devnull "^message-id:.*\n([ ].*\n)*",
35 d1f529f4 2005-10-29 devnull "^in-reply-to:.*\n([ ].*\n)*",
36 d1f529f4 2005-10-29 devnull "^references:.*\n([ ].*\n)*",
37 d1f529f4 2005-10-29 devnull "^date:.*\n([ ].*\n)*",
38 d1f529f4 2005-10-29 devnull "^delivery-date:.*\n([ ].*\n)*",
39 d1f529f4 2005-10-29 devnull "e?smtp id .*",
40 d1f529f4 2005-10-29 devnull "^ id.*",
41 d1f529f4 2005-10-29 devnull "boundary=.*",
42 d1f529f4 2005-10-29 devnull "name=\"",
43 d1f529f4 2005-10-29 devnull "filename=\"",
44 d1f529f4 2005-10-29 devnull "news:<[^>]+>",
45 d1f529f4 2005-10-29 devnull "^--[^ ]*$",
46 d1f529f4 2005-10-29 devnull
47 d1f529f4 2005-10-29 devnull /* base64 encoding */
48 d1f529f4 2005-10-29 devnull "^[0-9a-zA-Z+\\-=/]+$",
49 d1f529f4 2005-10-29 devnull
50 d1f529f4 2005-10-29 devnull /* uu encoding */
51 d1f529f4 2005-10-29 devnull "^[!-Z]+$",
52 d1f529f4 2005-10-29 devnull
53 d1f529f4 2005-10-29 devnull /* little things */
54 d1f529f4 2005-10-29 devnull ".",
55 cbeb0b26 2006-04-01 devnull "\n"
56 d1f529f4 2005-10-29 devnull };
57 d1f529f4 2005-10-29 devnull
58 d1f529f4 2005-10-29 devnull char *keywords[] =
59 d1f529f4 2005-10-29 devnull {
60 cbeb0b26 2006-04-01 devnull "([a-zA-Z'`$!¡-￿]|[0-9]([.,][0-9])*)+"
61 d1f529f4 2005-10-29 devnull };
62 d1f529f4 2005-10-29 devnull
63 d1f529f4 2005-10-29 devnull int debug;
64 d1f529f4 2005-10-29 devnull
65 d1f529f4 2005-10-29 devnull Dreprog*
66 d1f529f4 2005-10-29 devnull dregcomp(char *buf)
67 d1f529f4 2005-10-29 devnull {
68 d1f529f4 2005-10-29 devnull Reprog *r;
69 d1f529f4 2005-10-29 devnull Dreprog *d;
70 d1f529f4 2005-10-29 devnull
71 d1f529f4 2005-10-29 devnull if(debug)
72 d1f529f4 2005-10-29 devnull print(">>> '%s'\n", buf);
73 d1f529f4 2005-10-29 devnull
74 d1f529f4 2005-10-29 devnull r = regcomp(buf);
75 d1f529f4 2005-10-29 devnull if(r == nil)
76 d1f529f4 2005-10-29 devnull sysfatal("regcomp");
77 d1f529f4 2005-10-29 devnull d = dregcvt(r);
78 d1f529f4 2005-10-29 devnull if(d == nil)
79 d1f529f4 2005-10-29 devnull sysfatal("dregcomp");
80 d1f529f4 2005-10-29 devnull free(r);
81 d1f529f4 2005-10-29 devnull return d;
82 d1f529f4 2005-10-29 devnull }
83 d1f529f4 2005-10-29 devnull
84 d1f529f4 2005-10-29 devnull char*
85 d1f529f4 2005-10-29 devnull strcpycase(char *d, char *s)
86 d1f529f4 2005-10-29 devnull {
87 d1f529f4 2005-10-29 devnull int cc, esc;
88 d1f529f4 2005-10-29 devnull
89 d1f529f4 2005-10-29 devnull cc = 0;
90 d1f529f4 2005-10-29 devnull esc = 0;
91 d1f529f4 2005-10-29 devnull while(*s){
92 d1f529f4 2005-10-29 devnull if(*s == '[')
93 d1f529f4 2005-10-29 devnull cc++;
94 d1f529f4 2005-10-29 devnull if(*s == ']')
95 d1f529f4 2005-10-29 devnull cc--;
96 d1f529f4 2005-10-29 devnull if(!cc && 'a' <= *s && *s <= 'z'){
97 d1f529f4 2005-10-29 devnull *d++ = '[';
98 d1f529f4 2005-10-29 devnull *d++ = *s;
99 d1f529f4 2005-10-29 devnull *d++ = *s+'A'-'a';
100 d1f529f4 2005-10-29 devnull *d++ = ']';
101 d1f529f4 2005-10-29 devnull }else
102 d1f529f4 2005-10-29 devnull *d++ = *s;
103 d1f529f4 2005-10-29 devnull if(*s == '\\')
104 d1f529f4 2005-10-29 devnull esc++;
105 d1f529f4 2005-10-29 devnull else if(esc)
106 d1f529f4 2005-10-29 devnull esc--;
107 d1f529f4 2005-10-29 devnull s++;
108 d1f529f4 2005-10-29 devnull }
109 d1f529f4 2005-10-29 devnull return d;
110 d1f529f4 2005-10-29 devnull }
111 d1f529f4 2005-10-29 devnull
112 d1f529f4 2005-10-29 devnull void
113 d1f529f4 2005-10-29 devnull regerror(char *msg)
114 d1f529f4 2005-10-29 devnull {
115 d1f529f4 2005-10-29 devnull sysfatal("regerror: %s", msg);
116 d1f529f4 2005-10-29 devnull }
117 d1f529f4 2005-10-29 devnull
118 d1f529f4 2005-10-29 devnull void
119 d1f529f4 2005-10-29 devnull buildre(Dreprog *re[3])
120 d1f529f4 2005-10-29 devnull {
121 d1f529f4 2005-10-29 devnull int i;
122 d1f529f4 2005-10-29 devnull static char buf[16384], *s;
123 d1f529f4 2005-10-29 devnull
124 d1f529f4 2005-10-29 devnull re[0] = dregcomp("^From ");
125 fa325e9b 2020-01-10 cross
126 d1f529f4 2005-10-29 devnull s = buf;
127 d1f529f4 2005-10-29 devnull for(i=0; i<nelem(keywords); i++){
128 d1f529f4 2005-10-29 devnull if(i != 0)
129 d1f529f4 2005-10-29 devnull *s++ = '|';
130 d1f529f4 2005-10-29 devnull s = strcpycase(s, keywords[i]);
131 d1f529f4 2005-10-29 devnull }
132 d1f529f4 2005-10-29 devnull *s = 0;
133 d1f529f4 2005-10-29 devnull re[1] = dregcomp(buf);
134 d1f529f4 2005-10-29 devnull
135 d1f529f4 2005-10-29 devnull s = buf;
136 d1f529f4 2005-10-29 devnull for(i=0; i<nelem(ignore); i++){
137 d1f529f4 2005-10-29 devnull if(i != 0)
138 d1f529f4 2005-10-29 devnull *s++ = '|';
139 d1f529f4 2005-10-29 devnull s = strcpycase(s, ignore[i]);
140 d1f529f4 2005-10-29 devnull }
141 d1f529f4 2005-10-29 devnull *s = 0;
142 d1f529f4 2005-10-29 devnull re[2] = dregcomp(buf);
143 d1f529f4 2005-10-29 devnull }
144 d1f529f4 2005-10-29 devnull
145 d1f529f4 2005-10-29 devnull void
146 d1f529f4 2005-10-29 devnull usage(void)
147 d1f529f4 2005-10-29 devnull {
148 d1f529f4 2005-10-29 devnull fprint(2, "usage: regen [-d]\n");
149 d1f529f4 2005-10-29 devnull exits("usage");
150 d1f529f4 2005-10-29 devnull }
151 d1f529f4 2005-10-29 devnull
152 d1f529f4 2005-10-29 devnull void
153 d1f529f4 2005-10-29 devnull main(int argc, char **argv)
154 d1f529f4 2005-10-29 devnull {
155 d1f529f4 2005-10-29 devnull Dreprog *re[3];
156 d1f529f4 2005-10-29 devnull Biobuf b;
157 d1f529f4 2005-10-29 devnull
158 d1f529f4 2005-10-29 devnull ARGBEGIN{
159 d1f529f4 2005-10-29 devnull default:
160 d1f529f4 2005-10-29 devnull usage();
161 d1f529f4 2005-10-29 devnull case 'd':
162 d1f529f4 2005-10-29 devnull debug = 1;
163 d1f529f4 2005-10-29 devnull }ARGEND
164 d1f529f4 2005-10-29 devnull
165 d1f529f4 2005-10-29 devnull if(argc != 0)
166 d1f529f4 2005-10-29 devnull usage();
167 d1f529f4 2005-10-29 devnull
168 d1f529f4 2005-10-29 devnull buildre(re);
169 d1f529f4 2005-10-29 devnull Binit(&b, 1, OWRITE);
170 d1f529f4 2005-10-29 devnull Bprintdfa(&b, re[0]);
171 d1f529f4 2005-10-29 devnull Bprintdfa(&b, re[1]);
172 d1f529f4 2005-10-29 devnull Bprintdfa(&b, re[2]);
173 d1f529f4 2005-10-29 devnull exits(0);
174 d1f529f4 2005-10-29 devnull }