38
38
* forward declarations, up here so forward datatypes etc. are defined early
39
39
*/
40
40
/* === regcomp.c === */
41
- static void moresubs (struct vars * ,int );
42
- static int freev (struct vars * ,int );
43
- static void makesearch (struct vars * ,struct nfa * );
44
- static struct subre * parse (struct vars * ,int ,int ,struct state * ,struct state * );
45
- static struct subre * parsebranch (struct vars * ,int ,int ,struct state * ,struct state * ,int );
46
- static struct subre * parseqatom (struct vars * ,int ,int ,struct state * ,struct state * ,struct subre * );
47
- static void nonword (struct vars * ,int ,struct state * ,struct state * );
48
- static void word (struct vars * ,int ,struct state * ,struct state * );
49
- static void charclass (struct vars * ,enum char_classes ,
50
- struct state * ,struct state * );
51
- static void charclasscomplement (struct vars * ,enum char_classes ,
52
- struct state * ,struct state * );
53
- static int scannum (struct vars * );
54
- static void repeat (struct vars * ,struct state * ,struct state * ,int ,int );
55
- static void bracket (struct vars * ,struct state * ,struct state * );
56
- static void cbracket (struct vars * ,struct state * ,struct state * );
57
- static void brackpart (struct vars * ,struct state * ,struct state * ,bool * );
58
- static const chr * scanplain (struct vars * );
59
- static void onechr (struct vars * ,chr ,struct state * ,struct state * );
60
- static void optimizebracket (struct vars * ,struct state * ,struct state * );
61
- static void wordchrs (struct vars * );
62
- static void processlacon (struct vars * ,struct state * ,struct state * ,int ,
63
- struct state * ,struct state * );
64
- static struct subre * subre (struct vars * ,int ,int ,struct state * ,struct state * );
65
- static void freesubre (struct vars * ,struct subre * );
66
- static void freesubreandsiblings (struct vars * ,struct subre * );
67
- static void freesrnode (struct vars * ,struct subre * );
68
- static void removecaptures (struct vars * ,struct subre * );
69
- static int numst (struct subre * ,int );
70
- static void markst (struct subre * );
71
- static void cleanst (struct vars * );
72
- static long nfatree (struct vars * ,struct subre * ,FILE * );
73
- static long nfanode (struct vars * ,struct subre * ,int ,FILE * );
74
- static int newlacon (struct vars * ,struct state * ,struct state * ,int );
75
- static void freelacons (struct subre * ,int );
76
- static void rfree (regex_t * );
41
+ static void moresubs (struct vars * v ,int wanted );
42
+ static int freev (struct vars * v ,int err );
43
+ static void makesearch (struct vars * v ,struct nfa * nfa );
44
+ static struct subre * parse (struct vars * v ,int stopper ,int type ,
45
+ struct state * init ,struct state * final );
46
+ static struct subre * parsebranch (struct vars * v ,int stopper ,int type ,
47
+ struct state * left ,struct state * right ,
48
+ int partial );
49
+ static struct subre * parseqatom (struct vars * v ,int stopper ,int type ,
50
+ struct state * lp ,struct state * rp ,
51
+ struct subre * top );
52
+ static void nonword (struct vars * v ,int dir ,struct state * lp ,
53
+ struct state * rp );
54
+ static void word (struct vars * v ,int dir ,struct state * lp ,struct state * rp );
55
+ static void charclass (struct vars * v ,enum char_classes cls ,struct state * lp ,
56
+ struct state * rp );
57
+ static void charclasscomplement (struct vars * v ,enum char_classes cls ,
58
+ struct state * lp ,struct state * rp );
59
+ static int scannum (struct vars * v );
60
+ static void repeat (struct vars * v ,struct state * lp ,struct state * rp ,
61
+ int m ,int n );
62
+ static void bracket (struct vars * v ,struct state * lp ,struct state * rp );
63
+ static void cbracket (struct vars * v ,struct state * lp ,struct state * rp );
64
+ static void brackpart (struct vars * v ,struct state * lp ,struct state * rp ,
65
+ bool * have_cclassc );
66
+ static const chr * scanplain (struct vars * v );
67
+ static void onechr (struct vars * v ,chr c ,struct state * lp ,struct state * rp );
68
+ static void optimizebracket (struct vars * v ,struct state * lp ,struct state * rp );
69
+ static void wordchrs (struct vars * v );
70
+ static void processlacon (struct vars * v ,struct state * begin ,
71
+ struct state * end ,int latype ,
72
+ struct state * lp ,struct state * rp );
73
+ static struct subre * subre (struct vars * v ,int op ,int flags ,
74
+ struct state * begin ,struct state * end );
75
+ static void freesubre (struct vars * v ,struct subre * sr );
76
+ static void freesubreandsiblings (struct vars * v ,struct subre * sr );
77
+ static void freesrnode (struct vars * v ,struct subre * sr );
78
+ static void removecaptures (struct vars * v ,struct subre * t );
79
+ static int numst (struct subre * t ,int start );
80
+ static void markst (struct subre * t );
81
+ static void cleanst (struct vars * v );
82
+ static long nfatree (struct vars * v ,struct subre * t ,FILE * f );
83
+ static long nfanode (struct vars * v ,struct subre * t ,
84
+ int converttosearch ,FILE * f );
85
+ static int newlacon (struct vars * v ,struct state * begin ,struct state * end ,
86
+ int latype );
87
+ static void freelacons (struct subre * subs ,int n );
88
+ static void rfree (regex_t * re );
77
89
static int rcancelrequested (void );
78
90
static int rstacktoodeep (void );
79
91
80
92
#ifdef REG_DEBUG
81
- static void dump (regex_t * ,FILE * );
82
- static void dumpst (struct subre * ,FILE * ,int );
83
- static void stdump (struct subre * ,FILE * ,int );
84
- static const char * stid (struct subre * ,char * ,size_t );
93
+ static void dump (regex_t * re ,FILE * f );
94
+ static void dumpst (struct subre * t ,FILE * f ,int nfapresent );
95
+ static void stdump (struct subre * t ,FILE * f ,int nfapresent );
96
+ static const char * stid (struct subre * t ,char * buf ,size_t bufsize );
85
97
#endif
86
98
/* === regc_lex.c === */
87
- static void lexstart (struct vars * );
88
- static void prefixes (struct vars * );
89
- static int next (struct vars * );
90
- static int lexescape (struct vars * );
91
- static chr lexdigits (struct vars * ,int ,int ,int );
92
- static int brenext (struct vars * ,chr );
93
- static void skip (struct vars * );
99
+ static void lexstart (struct vars * v );
100
+ static void prefixes (struct vars * v );
101
+ static int next (struct vars * v );
102
+ static int lexescape (struct vars * v );
103
+ static chr lexdigits (struct vars * v ,int base ,int minlen ,int maxlen );
104
+ static int brenext (struct vars * v ,chr c );
105
+ static void skip (struct vars * v );
94
106
static chr newline (void );
95
- static chr chrnamed (struct vars * ,const chr * ,const chr * ,chr );
107
+ static chr chrnamed (struct vars * v ,const chr * startp ,const chr * endp ,
108
+ chr lastresort );
96
109
97
110
/* === regc_color.c === */
98
- static void initcm (struct vars * ,struct colormap * );
99
- static void freecm (struct colormap * );
100
- static color maxcolor (struct colormap * );
101
- static color newcolor (struct colormap * );
102
- static void freecolor (struct colormap * ,color );
103
- static color pseudocolor (struct colormap * );
104
- static color subcolor (struct colormap * ,chr );
105
- static color subcolorhi (struct colormap * ,color * );
106
- static color newsub (struct colormap * ,color );
107
- static int newhicolorrow (struct colormap * ,int );
108
- static void newhicolorcols (struct colormap * );
109
- static void subcolorcvec (struct vars * ,struct cvec * ,struct state * ,struct state * );
110
- static void subcoloronechr (struct vars * ,chr ,struct state * ,struct state * ,color * );
111
- static void subcoloronerange (struct vars * ,chr ,chr ,struct state * ,struct state * ,color * );
112
- static void subcoloronerow (struct vars * ,int ,struct state * ,struct state * ,color * );
113
- static void okcolors (struct nfa * ,struct colormap * );
114
- static void colorchain (struct colormap * ,struct arc * );
115
- static void uncolorchain (struct colormap * ,struct arc * );
116
- static void rainbow (struct nfa * ,struct colormap * ,int ,color ,struct state * ,struct state * );
117
- static void colorcomplement (struct nfa * ,struct colormap * ,int ,struct state * ,struct state * ,struct state * );
111
+ static void initcm (struct vars * v ,struct colormap * cm );
112
+ static void freecm (struct colormap * cm );
113
+ static color maxcolor (struct colormap * cm );
114
+ static color newcolor (struct colormap * cm );
115
+ static void freecolor (struct colormap * cm ,color co );
116
+ static color pseudocolor (struct colormap * cm );
117
+ static color subcolor (struct colormap * cm ,chr c );
118
+ static color subcolorhi (struct colormap * cm ,color * pco );
119
+ static color newsub (struct colormap * cm ,color co );
120
+ static int newhicolorrow (struct colormap * cm ,int oldrow );
121
+ static void newhicolorcols (struct colormap * cm );
122
+ static void subcolorcvec (struct vars * v ,struct cvec * cv ,struct state * lp ,
123
+ struct state * rp );
124
+ static void subcoloronechr (struct vars * v ,chr ch ,struct state * lp ,
125
+ struct state * rp ,color * lastsubcolor );
126
+ static void subcoloronerange (struct vars * v ,chr from ,chr to ,
127
+ struct state * lp ,struct state * rp ,
128
+ color * lastsubcolor );
129
+ static void subcoloronerow (struct vars * v ,int rownum ,struct state * lp ,
130
+ struct state * rp ,color * lastsubcolor );
131
+ static void okcolors (struct nfa * nfa ,struct colormap * cm );
132
+ static void colorchain (struct colormap * cm ,struct arc * a );
133
+ static void uncolorchain (struct colormap * cm ,struct arc * a );
134
+ static void rainbow (struct nfa * nfa ,struct colormap * cm ,int type ,color but ,
135
+ struct state * from ,struct state * to );
136
+ static void colorcomplement (struct nfa * nfa ,struct colormap * cm ,int type ,
137
+ struct state * of ,struct state * from ,
138
+ struct state * to );
118
139
119
140
#ifdef REG_DEBUG
120
- static void dumpcolors (struct colormap * ,FILE * );
121
- static void dumpchr (chr ,FILE * );
141
+ static void dumpcolors (struct colormap * cm ,FILE * f );
142
+ static void dumpchr (chr c ,FILE * f );
122
143
#endif
123
144
/* === regc_nfa.c === */
124
- static struct nfa * newnfa (struct vars * ,struct colormap * ,struct nfa * );
125
- static void freenfa (struct nfa * );
126
- static struct state * newstate (struct nfa * );
127
- static struct state * newfstate (struct nfa * ,int flag );
128
- static void dropstate (struct nfa * ,struct state * );
129
- static void freestate (struct nfa * ,struct state * );
130
- static void newarc (struct nfa * ,int ,color ,struct state * ,struct state * );
131
- static void createarc (struct nfa * ,int ,color ,struct state * ,struct state * );
132
- static struct arc * allocarc (struct nfa * );
133
- static void freearc (struct nfa * ,struct arc * );
134
- static void changearcsource (struct arc * ,struct state * );
135
- static void changearctarget (struct arc * ,struct state * );
136
- static int hasnonemptyout (struct state * );
137
- static struct arc * findarc (struct state * ,int ,color );
138
- static void cparc (struct nfa * ,struct arc * ,struct state * ,struct state * );
139
- static void sortins (struct nfa * ,struct state * );
140
- static int sortins_cmp (const void * ,const void * );
141
- static void sortouts (struct nfa * ,struct state * );
142
- static int sortouts_cmp (const void * ,const void * );
143
- static void moveins (struct nfa * ,struct state * ,struct state * );
144
- static void copyins (struct nfa * ,struct state * ,struct state * );
145
- static void mergeins (struct nfa * ,struct state * ,struct arc * * ,int );
146
- static void moveouts (struct nfa * ,struct state * ,struct state * );
147
- static void copyouts (struct nfa * ,struct state * ,struct state * );
148
- static void cloneouts (struct nfa * ,struct state * ,struct state * ,struct state * ,int );
149
- static void delsub (struct nfa * ,struct state * ,struct state * );
150
- static void deltraverse (struct nfa * ,struct state * ,struct state * );
151
- static void dupnfa (struct nfa * ,struct state * ,struct state * ,struct state * ,struct state * );
152
- static void duptraverse (struct nfa * ,struct state * ,struct state * );
153
- static void removeconstraints (struct nfa * ,struct state * ,struct state * );
154
- static void removetraverse (struct nfa * ,struct state * );
155
- static void cleartraverse (struct nfa * ,struct state * );
156
- static struct state * single_color_transition (struct state * ,struct state * );
157
- static void specialcolors (struct nfa * );
158
- static long optimize (struct nfa * ,FILE * );
159
- static void pullback (struct nfa * ,FILE * );
160
- static int pull (struct nfa * ,struct arc * ,struct state * * );
161
- static void pushfwd (struct nfa * ,FILE * );
162
- static int push (struct nfa * ,struct arc * ,struct state * * );
145
+ static struct nfa * newnfa (struct vars * v ,struct colormap * cm ,
146
+ struct nfa * parent );
147
+ static void freenfa (struct nfa * nfa );
148
+ static struct state * newstate (struct nfa * nfa );
149
+ static struct state * newfstate (struct nfa * nfa ,int flag );
150
+ static void dropstate (struct nfa * nfa ,struct state * s );
151
+ static void freestate (struct nfa * nfa ,struct state * s );
152
+ static void newarc (struct nfa * nfa ,int t ,color co ,
153
+ struct state * from ,struct state * to );
154
+ static void createarc (struct nfa * nfa ,int t ,color co ,
155
+ struct state * from ,struct state * to );
156
+ static struct arc * allocarc (struct nfa * nfa );
157
+ static void freearc (struct nfa * nfa ,struct arc * victim );
158
+ static void changearcsource (struct arc * a ,struct state * newfrom );
159
+ static void changearctarget (struct arc * a ,struct state * newto );
160
+ static int hasnonemptyout (struct state * s );
161
+ static struct arc * findarc (struct state * s ,int type ,color co );
162
+ static void cparc (struct nfa * nfa ,struct arc * oa ,
163
+ struct state * from ,struct state * to );
164
+ static void sortins (struct nfa * nfa ,struct state * s );
165
+ static int sortins_cmp (const void * a ,const void * b );
166
+ static void sortouts (struct nfa * nfa ,struct state * s );
167
+ static int sortouts_cmp (const void * a ,const void * b );
168
+ static void moveins (struct nfa * nfa ,struct state * oldState ,
169
+ struct state * newState );
170
+ static void copyins (struct nfa * nfa ,struct state * oldState ,
171
+ struct state * newState );
172
+ static void mergeins (struct nfa * nfa ,struct state * s ,
173
+ struct arc * * arcarray ,int arccount );
174
+ static void moveouts (struct nfa * nfa ,struct state * oldState ,
175
+ struct state * newState );
176
+ static void copyouts (struct nfa * nfa ,struct state * oldState ,
177
+ struct state * newState );
178
+ static void cloneouts (struct nfa * nfa ,struct state * old ,struct state * from ,
179
+ struct state * to ,int type );
180
+ static void delsub (struct nfa * nfa ,struct state * lp ,struct state * rp );
181
+ static void deltraverse (struct nfa * nfa ,struct state * leftend ,
182
+ struct state * s );
183
+ static void dupnfa (struct nfa * nfa ,struct state * start ,struct state * stop ,
184
+ struct state * from ,struct state * to );
185
+ static void duptraverse (struct nfa * nfa ,struct state * s ,struct state * stmp );
186
+ static void removeconstraints (struct nfa * nfa ,struct state * start ,struct state * stop );
187
+ static void removetraverse (struct nfa * nfa ,struct state * s );
188
+ static void cleartraverse (struct nfa * nfa ,struct state * s );
189
+ static struct state * single_color_transition (struct state * s1 ,
190
+ struct state * s2 );
191
+ static void specialcolors (struct nfa * nfa );
192
+ static long optimize (struct nfa * nfa ,FILE * f );
193
+ static void pullback (struct nfa * nfa ,FILE * f );
194
+ static int pull (struct nfa * nfa ,struct arc * con ,
195
+ struct state * * intermediates );
196
+ static void pushfwd (struct nfa * nfa ,FILE * f );
197
+ static int push (struct nfa * nfa ,struct arc * con ,
198
+ struct state * * intermediates );
163
199
164
200
#define INCOMPATIBLE 1/* destroys arc */
165
201
#define SATISFIED 2/* constraint satisfied */
166
202
#define COMPATIBLE 3/* compatible but not satisfied yet */
167
203
#define REPLACEARC 4/* replace arc's color with constraint color */
168
204
static int combine (struct nfa * nfa ,struct arc * con ,struct arc * a );
169
- static void fixempties (struct nfa * ,FILE * );
170
- static struct state * emptyreachable (struct nfa * ,struct state * ,
171
- struct state * ,struct arc * * );
172
- static int isconstraintarc (struct arc * );
173
- static int hasconstraintout (struct state * );
174
- static void fixconstraintloops (struct nfa * ,FILE * );
175
- static int findconstraintloop (struct nfa * ,struct state * );
176
- static void breakconstraintloop (struct nfa * ,struct state * );
177
- static void clonesuccessorstates (struct nfa * ,struct state * ,struct state * ,
178
- struct state * ,struct arc * ,
179
- char * ,char * ,int );
180
- static void cleanup (struct nfa * );
181
- static void markreachable (struct nfa * ,struct state * ,struct state * ,struct state * );
182
- static void markcanreach (struct nfa * ,struct state * ,struct state * ,struct state * );
183
- static long analyze (struct nfa * );
184
- static void checkmatchall (struct nfa * );
185
- static bool checkmatchall_recurse (struct nfa * ,struct state * ,bool * * );
186
- static bool check_out_colors_match (struct state * ,color ,color );
187
- static bool check_in_colors_match (struct state * ,color ,color );
188
- static void compact (struct nfa * ,struct cnfa * );
189
- static void carcsort (struct carc * ,size_t );
190
- static int carc_cmp (const void * ,const void * );
191
- static void freecnfa (struct cnfa * );
192
- static void dumpnfa (struct nfa * ,FILE * );
205
+ static void fixempties (struct nfa * nfa ,FILE * f );
206
+ static struct state * emptyreachable (struct nfa * nfa ,struct state * s ,
207
+ struct state * lastfound ,
208
+ struct arc * * inarcsorig );
209
+ static int isconstraintarc (struct arc * a );
210
+ static int hasconstraintout (struct state * s );
211
+ static void fixconstraintloops (struct nfa * nfa ,FILE * f );
212
+ static int findconstraintloop (struct nfa * nfa ,struct state * s );
213
+ static void breakconstraintloop (struct nfa * nfa ,struct state * sinitial );
214
+ static void clonesuccessorstates (struct nfa * nfa ,struct state * ssource ,
215
+ struct state * sclone ,
216
+ struct state * spredecessor ,
217
+ struct arc * refarc ,char * curdonemap ,
218
+ char * outerdonemap ,int nstates );
219
+ static void cleanup (struct nfa * nfa );
220
+ static void markreachable (struct nfa * nfa ,struct state * s ,
221
+ struct state * okay ,struct state * mark );
222
+ static void markcanreach (struct nfa * nfa ,struct state * s ,struct state * okay ,
223
+ struct state * mark );
224
+ static long analyze (struct nfa * nfa );
225
+ static void checkmatchall (struct nfa * nfa );
226
+ static bool checkmatchall_recurse (struct nfa * nfa ,struct state * s ,
227
+ bool * * haspaths );
228
+ static bool check_out_colors_match (struct state * s ,color co1 ,color co2 );
229
+ static bool check_in_colors_match (struct state * s ,color co1 ,color co2 );
230
+ static void compact (struct nfa * nfa ,struct cnfa * cnfa );
231
+ static void carcsort (struct carc * first ,size_t n );
232
+ static int carc_cmp (const void * a ,const void * b );
233
+ static void freecnfa (struct cnfa * cnfa );
234
+ static void dumpnfa (struct nfa * nfa ,FILE * f );
193
235
194
236
#ifdef REG_DEBUG
195
237
static void dumpstate (struct state * ,FILE * );
@@ -199,12 +241,12 @@ static void dumpcnfa(struct cnfa *, FILE *);
199
241
static void dumpcstate (int ,struct cnfa * ,FILE * );
200
242
#endif
201
243
/* === regc_cvec.c === */
202
- static struct cvec * newcvec (int ,int );
203
- static struct cvec * clearcvec (struct cvec * );
204
- static void addchr (struct cvec * ,chr );
205
- static void addrange (struct cvec * ,chr ,chr );
206
- static struct cvec * getcvec (struct vars * ,int ,int );
207
- static void freecvec (struct cvec * );
244
+ static struct cvec * newcvec (int nchrs ,int nranges );
245
+ static struct cvec * clearcvec (struct cvec * cv );
246
+ static void addchr (struct cvec * cv ,chr c );
247
+ static void addrange (struct cvec * cv ,chr from ,chr to );
248
+ static struct cvec * getcvec (struct vars * v ,int nchrs ,int nranges );
249
+ static void freecvec (struct cvec * cv );
208
250
209
251
/* === regc_pg_locale.c === */
210
252
static int pg_wc_isdigit (pg_wchar c );
@@ -221,16 +263,18 @@ static pg_wchar pg_wc_toupper(pg_wchar c);
221
263
static pg_wchar pg_wc_tolower (pg_wchar c );
222
264
223
265
/* === regc_locale.c === */
224
- static chr element (struct vars * ,const chr * ,const chr * );
225
- static struct cvec * range (struct vars * ,chr ,chr ,int );
226
- static int before (chr ,chr );
227
- static struct cvec * eclass (struct vars * ,chr ,int );
228
- static enum char_classes lookupcclass (struct vars * ,const chr * ,const chr * );
229
- static struct cvec * cclasscvec (struct vars * ,enum char_classes ,int );
230
- static int cclass_column_index (struct colormap * ,chr );
231
- static struct cvec * allcases (struct vars * ,chr );
232
- static int cmp (const chr * ,const chr * ,size_t );
233
- static int casecmp (const chr * ,const chr * ,size_t );
266
+ static chr element (struct vars * v ,const chr * startp ,const chr * endp );
267
+ static struct cvec * range (struct vars * v ,chr a ,chr b ,int cases );
268
+ static int before (chr x ,chr y );
269
+ static struct cvec * eclass (struct vars * v ,chr c ,int cases );
270
+ static enum char_classes lookupcclass (struct vars * v ,const chr * startp ,
271
+ const chr * endp );
272
+ static struct cvec * cclasscvec (struct vars * v ,enum char_classes cclasscode ,
273
+ int cases );
274
+ static int cclass_column_index (struct colormap * cm ,chr c );
275
+ static struct cvec * allcases (struct vars * v ,chr c );
276
+ static int cmp (const chr * x ,const chr * y ,size_t len );
277
+ static int casecmp (const chr * x ,const chr * y ,size_t len );
234
278
235
279
236
280
/* internal variables, bundled for easy passing around */