LLVM: lib/Support/regcomp.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
39#include <ctype.h>
40#include <limits.h>
41#include <stdint.h>
42#include <stdio.h>
43#include <stdlib.h>
45#include <sys/types.h>
46
49
50#include "llvm/Config/config.h"
52
53
59 {"alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
600123456789",
61 ""},
62 {"alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", ""},
63 {"blank", " \t", ""},
64 {"cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
65\25\26\27\30\31\32\33\34\35\36\37\177",
66 ""},
67 {"digit", "0123456789", ""},
68 {"graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
690123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
70 ""},
71 {"lower", "abcdefghijklmnopqrstuvwxyz", ""},
72 {"print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
730123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
74 ""},
75 {"punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", ""},
76 {"space", "\t\n\v\f\r ", ""},
77 {"upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", ""},
78 {"xdigit", "0123456789ABCDEFabcdef", ""},
79 {NULL, 0, ""}};
80
81
85} cnames[] = {{"NUL", '\0'},
86 {"SOH", '\001'},
87 {"STX", '\002'},
88 {"ETX", '\003'},
89 {"EOT", '\004'},
90 {"ENQ", '\005'},
91 {"ACK", '\006'},
92 {"BEL", '\007'},
93 {"alert", '\007'},
94 {"BS", '\010'},
95 {"backspace", '\b'},
96 {"HT", '\011'},
97 {"tab", '\t'},
98 {"LF", '\012'},
99 {"newline", '\n'},
100 {"VT", '\013'},
101 {"vertical-tab", '\v'},
102 {"FF", '\014'},
103 {"form-feed", '\f'},
104 {"CR", '\015'},
105 {"carriage-return", '\r'},
106 {"SO", '\016'},
107 {"SI", '\017'},
108 {"DLE", '\020'},
109 {"DC1", '\021'},
110 {"DC2", '\022'},
111 {"DC3", '\023'},
112 {"DC4", '\024'},
113 {"NAK", '\025'},
114 {"SYN", '\026'},
115 {"ETB", '\027'},
116 {"CAN", '\030'},
117 {"EM", '\031'},
118 {"SUB", '\032'},
119 {"ESC", '\033'},
120 {"IS4", '\034'},
121 {"FS", '\034'},
122 {"IS3", '\035'},
123 {"GS", '\035'},
124 {"IS2", '\036'},
125 {"RS", '\036'},
126 {"IS1", '\037'},
127 {"US", '\037'},
128 {"space", ' '},
129 {"exclamation-mark", '!'},
130 {"quotation-mark", '"'},
131 {"number-sign", '#'},
132 {"dollar-sign", '$'},
133 {"percent-sign", '%'},
134 {"ampersand", '&'},
135 {"apostrophe", '\''},
136 {"left-parenthesis", '('},
137 {"right-parenthesis", ')'},
138 {"asterisk", '*'},
139 {"plus-sign", '+'},
140 {"comma", ','},
141 {"hyphen", '-'},
142 {"hyphen-minus", '-'},
143 {"period", '.'},
144 {"full-stop", '.'},
145 {"slash", '/'},
146 {"solidus", '/'},
147 {"zero", '0'},
148 {"one", '1'},
149 {"two", '2'},
150 {"three", '3'},
151 {"four", '4'},
152 {"five", '5'},
153 {"six", '6'},
154 {"seven", '7'},
155 {"eight", '8'},
156 {"nine", '9'},
157 {"colon", ':'},
158 {"semicolon", ';'},
159 {"less-than-sign", '<'},
160 {"equals-sign", '='},
161 {"greater-than-sign", '>'},
162 {"question-mark", '?'},
163 {"commercial-at", '@'},
164 {"left-square-bracket", '['},
165 {"backslash", '\\'},
166 {"reverse-solidus", '\\'},
167 {"right-square-bracket", ']'},
168 {"circumflex", '^'},
169 {"circumflex-accent", '^'},
170 {"underscore", '_'},
171 {"low-line", '_'},
172 {"grave-accent", '`'},
173 {"left-brace", '{'},
174 {"left-curly-bracket", '{'},
175 {"vertical-line", '|'},
176 {"right-brace", '}'},
177 {"right-curly-bracket", '}'},
178 {"tilde", '~'},
179 {"DEL", '\177'},
180 {NULL, 0}};
181
182
183
184
185
199
200static void p_ere(struct parse *, int);
203static void p_bre(struct parse *, int, int);
223static void mcadd(struct parse *, cset *, const char *);
237
239
240
241
242
243
244#define PEEK() (*p->next)
245#define PEEK2() (*(p->next + 1))
246#define MORE() (p->end - p->next > 0)
247#define MORE2() (p->end - p->next > 1)
248#define SEE(c) (MORE() && PEEK() == (c))
249#define SEETWO(a, b) (MORE2() && PEEK() == (a) && PEEK2() == (b))
250#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0)
251#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
252#define NEXT() (p->next++)
253#define NEXT2() (p->next += 2)
254#define NEXTn(n) (p->next += (n))
255#define GETNEXT() (*p->next++)
256#define SETERROR(e) seterr(p, (e))
257#define REQUIRE(co, e) (void)((co) || SETERROR(e))
258#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e))
259#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e))
260#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e))
261#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
262#define INSERT(op, pos) doinsert(p, (sop)(op), HERE() - (pos) + 1, pos)
263#define AHEAD(pos) dofwd(p, pos, HERE() - (pos))
264#define ASTERN(sop, pos) EMIT(sop, HERE() - pos)
265#define HERE() (p->slen)
266#define THERE() (p->slen - 1)
267#define THERETHERE() (p->slen - 2)
268#define DROP(n) (p->slen -= (n))
269
270#ifdef _POSIX2_RE_DUP_MAX
271#define DUPMAX _POSIX2_RE_DUP_MAX
272#else
273#define DUPMAX 255
274#endif
275#define REGINFINITY (DUPMAX + 1)
276
277#ifndef NDEBUG
278static int never = 0;
279#else
280#define never 0
281#endif
282
283
284
285
286int
290 struct parse *p = &pa;
291 int i;
292 size_t len;
293#ifdef REDEBUG
294#define GOODFLAGS(f) (f)
295#else
296#define GOODFLAGS(f) ((f) & ~REG_DUMP)
297#endif
298
302
304 if (preg->re_endp < pattern)
306 len = preg->re_endp - pattern;
307 } else {
308 len = strlen(pattern);
309 }
310
311
313 (NC - 1) * sizeof(cat_t));
314 if (g == NULL)
316 p->ssize = len / (size_t)2 * (size_t)3 + (size_t)1;
317 p->strip = (sop *)calloc(p->ssize, sizeof(sop));
318 p->slen = 0;
319 if (p->strip == NULL) {
320 free((char *)g);
322 }
323
324
325 p->g = g;
326 p->next = pattern;
327 p->end = p->next + len;
328 p->error = 0;
329 p->ncsalloc = 0;
330 for (i = 0; i < NPAREN; i++) {
331 p->pbegin[i] = 0;
332 p->pend[i] = 0;
333 }
335 g->sets = NULL;
336 g->setbits = NULL;
337 g->ncsets = 0;
339 g->iflags = 0;
340 g->nbol = 0;
341 g->neol = 0;
342 g->must = NULL;
343 g->mlen = 0;
344 g->nsub = 0;
345 g->ncategories = 1;
346 g->categories = &g->catspace[-(CHAR_MIN)];
347 (void)memset((char *)g->catspace, 0, NC * sizeof(cat_t));
348 g->backrefs = 0;
349
350
357 else
361
362
371#ifndef REDEBUG
372
375#endif
376
377
378 if (p->error != 0)
380 return (p->error);
381}
382
383
384
385
387 int stop)
388{
389 char c;
390 sopno prevback = 0;
391 sopno prevfwd = 0;
393 int first = 1;
394
395 for (;;) {
396
397 conc = HERE();
398 while (MORE() && (c = PEEK()) != '|' && c != stop)
401
402 if (('|'))
403 break;
404
405 if (first) {
407 prevfwd = conc;
408 prevback = conc;
409 first = 0;
410 }
412 prevback = THERE();
413 AHEAD(prevfwd);
414 prevfwd = HERE();
416 }
417
418 if (!first) {
421 }
422
424}
425
426
427
428
430 char c;
432 int count;
433 int count2;
434 int backrefnum;
436 int wascaret = 0;
437
440
441 pos = HERE();
442 switch (c) {
443 case '(':
445 p->g->nsub++;
446 subno = p->g->nsub;
448 p->pbegin[subno] = HERE();
450 if ((')'))
452 if (subno < NPAREN) {
453 p->pend[subno] = HERE();
454 assert(p->pend[subno] != 0);
455 }
458 break;
459#ifndef POSIX_MISTAKE
460 case ')':
461
462
463
464
465
466
467
469 break;
470#endif
471 case '^':
473 p->g->iflags |= USEBOL;
474 p->g->nbol++;
475 wascaret = 1;
476 break;
477 case '$':
479 p->g->iflags |= USEEOL;
480 p->g->neol++;
481 break;
482 case '|':
484 break;
485 case '*':
486 case '+':
487 case '?':
489 break;
490 case '.':
493 else
495 break;
496 case '[':
498 break;
499 case '\\':
502 if (c >= '1' && c <= '9') {
503
504
505
506
507
508 backrefnum = c - '0';
509 if (p->pend[backrefnum] == 0) {
511 break;
512 }
513
514
515
516
517 assert(backrefnum <= p->g->nsub);
519 assert(p->pbegin[backrefnum] != 0);
522 (void)dupl(p, p->pbegin[backrefnum] + 1, p->pend[backrefnum]);
524 p->g->backrefs = 1;
525 } else {
526
527
529 }
530 break;
531 case '{':
534 default:
536 break;
537 }
538
540 return;
542
543 if (!(c == '*' || c == '+' || c == '?' ||
545 return;
547
549 switch (c) {
550 case '*':
551
556 break;
557 case '+':
560 break;
561 case '?':
562
565 AHEAD(pos);
569 break;
570 case '{':
572 if (EAT(',')) {
573 if (isdigit((uch)PEEK())) {
576 } else
578 } else
579 count2 = count;
580 repeat(p, pos, count, count2);
581 if (('}')) {
582 while (MORE() && PEEK() != '}')
586 }
587 break;
588 }
589
591 return;
593 if (!(c == '*' || c == '+' || c == '?' ||
595 return;
597}
598
599
600
601
607
608
609
610
611
612
613
614
615
616
617
618static void p_bre(struct parse *p, int end1,
619 int end2)
620{
622 int first = 1;
623 int wasdollar = 0;
624
625 if (EAT('^')) {
627 p->g->iflags |= USEBOL;
628 p->g->nbol++;
629 }
630 while (MORE() && (end1, end2)) {
632 first = 0;
633 }
634 if (wasdollar) {
637 p->g->iflags |= USEEOL;
638 p->g->neol++;
639 }
640
642}
643
644
645
646
647static int
649 int starordinary)
650{
651 int c;
652 int count;
653 int count2;
655 int i;
657#define BACKSL (1 << CHAR_BIT)
658
659 pos = HERE();
660
663 if (c == '\\') {
666 }
667 switch (c) {
668 case '.':
671 else
673 break;
674 case '[':
676 break;
679 break;
681 p->g->nsub++;
682 subno = p->g->nsub;
684 p->pbegin[subno] = HERE();
686
688 p_bre(p, '\\', ')');
689 if (subno < NPAREN) {
690 p->pend[subno] = HERE();
691 assert(p->pend[subno] != 0);
692 }
695 break;
696 case BACKSL | ')':
699 break;
711 if (p->pend[i] != 0) {
714 assert(p->pbegin[i] != 0);
717 (void)dupl(p, p->pbegin[i] + 1, p->pend[i]);
719 } else {
721 }
722 p->g->backrefs = 1;
723 break;
724 case '*':
727 default:
729 break;
730 }
731
732 if (EAT('*')) {
733
738 } else if (EATTWO('\\', '{')) {
740 if (EAT(',')) {
744 } else
746 } else
747 count2 = count;
748 repeat(p, pos, count, count2);
749 if (('\\', '}')) {
754 }
755 } else if (c == '$')
756 return (1);
757
758 return (0);
759}
760
761
762
763
764static int
766 int count = 0;
767 int ndigits = 0;
768
770 count = count * 10 + (GETNEXT() - '0');
771 ndigits++;
772 }
773
775 return (count);
776}
777
778
779
780
781
782
783
786 int invert = 0;
787
788
789 if (p->end - p->next > 5) {
790 if (strncmp(p->next, "[:<:]]", 6) == 0) {
793 return;
794 }
795 if (strncmp(p->next, "[:>:]]", 6) == 0) {
798 return;
799 }
800 }
801
802 if ((cs = allocset(p)) == NULL) {
803
804 return;
805 }
806
807 if (EAT('^'))
808 invert++;
809 if (EAT(']'))
811 else if (EAT('-'))
815 if (EAT('-'))
818
819 if (p->error != 0) {
821 return;
822 }
823
825 int i;
826 int ci;
827
828 for (i = p->g->csetsize - 1; i >= 0; i--)
829 if (CHIN(cs, i) && isalpha(i)) {
831 if (ci != i)
833 }
834 if (cs->multis != NULL)
836 }
837 if (invert) {
838 int i;
839
840 for (i = p->g->csetsize - 1; i >= 0; i--)
841 if (CHIN(cs, i))
843 else
847 if (cs->multis != NULL)
849 }
850
852
853 if (nch(p, cs) == 1) {
856 } else {
858 }
859}
860
861
862
863
865 char c;
866 char start, finish;
867 int i;
868
869
870 switch ((MORE()) ? PEEK() : '\0') {
871 case '[':
873 break;
874 case '-':
876 return;
877 break;
878 default:
879 c = '\0';
880 break;
881 }
882
883 switch (c) {
884 case ':':
892 break;
893 case '=':
901 break;
902 default:
903
906
908 if (EAT('-'))
909 finish = '-';
910 else
912 } else {
913 finish = start;
914 }
915
917 for (i = start; i <= finish; i++)
919 break;
920 }
921}
922
923
924
925
927 const char *sp = p->next;
929 size_t len;
930 const char *u;
931 char c;
932
935 len = p->next - sp;
937 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
938 break;
939 if (cp->name == NULL) {
940
942 return;
943 }
944
946 while ((c = *u++) != '\0')
948 for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
950}
951
952
953
954
955
956
963
964
965
966
967static char
969 char value;
970
972 if (('[', '.'))
974
975
978 return (value);
979}
980
981
982
983
984static char
986{
987 const char *sp = p->next;
988 struct cname *cp;
989 size_t len;
990
993 if (()) {
995 return (0);
996 }
997 len = p->next - sp;
998 for (cp = cnames; cp->name != NULL; cp++)
999 if (strncmp(cp->name, sp, len) == 0 && strlen(cp->name) == len)
1000 return (cp->code);
1001 if (len == 1)
1002 return (*sp);
1004 return (0);
1005}
1006
1007
1008
1009
1010static char
1012 ch = (uch)ch;
1013 assert(isalpha(ch));
1014 if (isupper(ch))
1015 return ((uch)tolower(ch));
1016 else if (islower(ch))
1017 return ((uch)toupper(ch));
1018 else
1019 return (ch);
1020}
1021
1022
1023
1024
1025
1026
1028 const char *oldnext = p->next;
1029 const char *oldend = p->end;
1030 char bracket[3];
1031
1032 ch = (uch)ch;
1033 assert(othercase(ch) != ch);
1034 p->next = bracket;
1035 p->end = bracket + 2;
1036 bracket[0] = ch;
1037 bracket[1] = ']';
1038 bracket[2] = '\0';
1040 assert(p->next == bracket + 2);
1041 p->next = oldnext;
1042 p->end = oldend;
1043}
1044
1045
1046
1047
1049 cat_t *cap = p->g->categories;
1050
1053 else {
1055 if (cap[ch] == 0)
1056 cap[ch] = p->g->ncategories++;
1057 }
1058}
1059
1060
1061
1062
1063
1064
1066 const char *oldnext = p->next;
1067 const char *oldend = p->end;
1068 static const char bracket[4] = {'^', '\n', ']', '\0'};
1069
1070 p->next = bracket;
1071 p->end = bracket + 3;
1073 assert(p->next == bracket + 3);
1074 p->next = oldnext;
1075 p->end = oldend;
1076}
1077
1078
1079
1080
1082 sopno start,
1083 int from,
1084 int to)
1085{
1087#define N 2
1088#define INF 3
1089#define REP(f, t) ((f) * 8 + (t))
1090#define MAP(n) (((n) <= 1) ? (n) : ((n) == REGINFINITY) ? INF : N)
1092
1093 if (p->error != 0)
1094 return;
1095
1097
1098 switch (REP(MAP(from), MAP(to))) {
1099 case REP(0, 0):
1100 DROP(finish - start);
1101 break;
1102 case REP(0, 1):
1105
1107 repeat(p, start + 1, 1, to);
1109 AHEAD(start);
1113 break;
1114 case REP(1, 1):
1115
1116 break;
1118
1125 copy = dupl(p, start + 1, finish + 1);
1126 assert(copy == finish + 4);
1127 repeat(p, copy, 1, to - 1);
1128 break;
1132 break;
1134 copy = dupl(p, start, finish);
1135 repeat(p, copy, from - 1, to - 1);
1136 break;
1138 copy = dupl(p, start, finish);
1139 repeat(p, copy, from - 1, to);
1140 break;
1141 default:
1143 break;
1144 }
1145}
1146
1147
1148
1149
1150static int
1152 if (p->error == 0)
1153 p->error = e;
1154 p->next = nuls;
1155 p->end = nuls;
1156 return (0);
1157}
1158
1159
1160
1161
1163 int no = p->g->ncsets++;
1164 size_t nc;
1165 size_t nbytes;
1167 size_t css = (size_t)p->g->csetsize;
1168 int i;
1169
1170 if (no >= p->ncsalloc) {
1171 void *ptr;
1172
1173 p->ncsalloc += CHAR_BIT;
1174 nc = p->ncsalloc;
1175 if (nc > SIZE_MAX / sizeof(cset))
1176 goto nomem;
1177 assert(nc % CHAR_BIT == 0);
1178 nbytes = nc / CHAR_BIT * css;
1179
1180 ptr = (cset *)realloc((char *)p->g->sets, nc * sizeof(cset));
1181 if (ptr == NULL)
1182 goto nomem;
1183 p->g->sets = ptr;
1184
1185 ptr = (uch *)realloc((char *)p->g->setbits, nbytes);
1186 if (ptr == NULL)
1187 goto nomem;
1188 p->g->setbits = ptr;
1189
1190 for (i = 0; i < no; i++)
1191 p->g->sets[i].ptr = p->g->setbits + css * (i / CHAR_BIT);
1192
1193 (void)memset((char *)p->g->setbits + (nbytes - css), 0, css);
1194 }
1195
1196 if (p->g->sets == NULL || p->g->setbits == NULL)
1197 goto nomem;
1198
1199 cs = &p->g->sets[no];
1200 cs->ptr = p->g->setbits + css * ((no) / CHAR_BIT);
1201 cs->mask = 1 << ((no) % CHAR_BIT);
1202 cs->hash = 0;
1205
1206 return (cs);
1207nomem:
1208 free(p->g->sets);
1209 p->g->sets = NULL;
1210 free(p->g->setbits);
1211 p->g->setbits = NULL;
1212
1214
1215 return (NULL);
1216}
1217
1218
1219
1220
1222 size_t i;
1223 cset *top = &p->g->sets[p->g->ncsets];
1224 size_t css = (size_t)p->g->csetsize;
1225
1226 for (i = 0; i < css; i++)
1228 if (cs == top - 1)
1229 p->g->ncsets--;
1230}
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241static int
1244 size_t i;
1245 cset *top = &p->g->sets[p->g->ncsets];
1247 size_t css = (size_t)p->g->csetsize;
1248
1249
1250 for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
1251 if (cs2->hash == h && cs2 != cs) {
1252
1253 for (i = 0; i < css; i++)
1254 if (!(cs2, i) != !
(cs, i))
1255 break;
1256 if (i == css)
1257 break;
1258 }
1259
1260 if (cs2 < top) {
1262 cs = cs2;
1263 }
1264
1265 return ((int)(cs - p->g->sets));
1266}
1267
1268
1269
1270
1271static int
1273 size_t i;
1274 size_t css = (size_t)p->g->csetsize;
1275
1276 for (i = 0; i < css; i++)
1277 if (CHIN(cs, i))
1278 return ((char)i);
1280 return (0);
1281}
1282
1283
1284
1285
1287 size_t i;
1288 size_t css = (size_t)p->g->csetsize;
1289 int n = 0;
1290
1291 for (i = 0; i < css; i++)
1292 if (CHIN(cs, i))
1293 n++;
1294 return (n);
1295}
1296
1297
1298
1299
1301 size_t oldend = cs->smultis;
1302 void *np;
1303
1304 cs->smultis += strlen(cp) + 1;
1306 if (np == NULL) {
1311 return;
1312 }
1314
1316}
1317
1318
1319
1320
1321
1322
1323
1324
1328
1329
1330
1331
1332
1333
1334
1335
1339
1340
1341
1342
1343static int
1345 uch *col;
1346 int i;
1347 int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT;
1348 unsigned uc = (uch)c;
1349
1350 for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
1351 if (col[uc] != 0)
1352 return (1);
1353 return (0);
1354}
1355
1356
1357
1358
1359static int
1361 uch *col;
1362 int i;
1363 int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT;
1364 unsigned uc1 = (uch)c1;
1365 unsigned uc2 = (uch)c2;
1366
1367 for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
1368 if (col[uc1] != col[uc2])
1369 return (0);
1370 return (1);
1371}
1372
1373
1374
1375
1377 cat_t *cats = g->categories;
1378 int c;
1379 int c2;
1381
1382
1383 if (p->error != 0)
1384 return;
1385
1386 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
1387 if (cats[c] == 0 && isinsets(g, c)) {
1388 cat = g->ncategories++;
1389 cats[c] = cat;
1390 for (c2 = c + 1; c2 <= CHAR_MAX; c2++)
1391 if (cats[c2] == 0 && samesets(g, c, c2))
1392 cats[c2] = cat;
1393 }
1394}
1395
1396
1397
1398
1399static sopno
1401 sopno finish)
1402{
1404 sopno len = finish - start;
1405
1406 assert(finish >= start);
1407 if (len == 0)
1408 return (ret);
1409 enlarge(p, p->ssize + len);
1410 assert(p->ssize >= p->slen + len);
1411 (void)memmove((char *)(p->strip + p->slen), (char *)(p->strip + start),
1412 (size_t)len * sizeof(sop));
1413 p->slen += len;
1414 return (ret);
1415}
1416
1417
1418
1419
1420
1421
1422
1423
1425
1426 if (p->error != 0)
1427 return;
1428
1429
1431
1432
1433 if (p->slen >= p->ssize)
1434 enlarge(p, (p->ssize + 1) / 2 * 3);
1435 assert(p->slen < p->ssize);
1436
1437
1438 p->strip[p->slen++] = SOP(op, opnd);
1439}
1440
1441
1442
1443
1447 int i;
1448
1449
1450 if (p->error != 0)
1451 return;
1452
1453 sn = HERE();
1456 s = p->strip[sn];
1457
1458
1460 for (i = 1; i < NPAREN; i++) {
1461 if (p->pbegin[i] >= pos) {
1462 p->pbegin[i]++;
1463 }
1464 if (p->pend[i] >= pos) {
1465 p->pend[i]++;
1466 }
1467 }
1468
1469 memmove((char *)&p->strip[pos + 1], (char *)&p->strip[pos],
1470 (HERE() - pos - 1) * sizeof(sop));
1471 p->strip[pos] = s;
1472}
1473
1474
1475
1476
1478
1479 if (p->error != 0)
1480 return;
1481
1483 p->strip[pos] = OP(p->strip[pos]) | value;
1484}
1485
1486
1487
1488
1490 sop *sp;
1491
1492 if (p->ssize >= size)
1493 return;
1494
1495 if ((uintptr_t)size > SIZE_MAX / sizeof(sop)) {
1497 return;
1498 }
1499
1500 sp = (sop *)realloc(p->strip, size * sizeof(sop));
1501 if (sp == NULL) {
1503 return;
1504 }
1505 p->strip = sp;
1506 p->ssize = size;
1507}
1508
1509
1510
1511
1513 g->nstates = p->slen;
1514 if ((uintptr_t)p->slen > SIZE_MAX / sizeof(sop)) {
1515 g->strip = p->strip;
1517 return;
1518 }
1519
1520 g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop));
1521 if (g->strip == NULL) {
1523 g->strip = p->strip;
1524 }
1525}
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1537 sop *scan;
1538 sop *start = 0;
1539 sop *newstart = 0;
1542 char *cp;
1544
1545
1546 if (p->error != 0)
1547 return;
1548
1549
1550 newlen = 0;
1551 scan = g->strip + 1;
1552 do {
1553 s = *scan++;
1554 switch (OP(s)) {
1555 case OCHAR:
1556 if (newlen == 0)
1557 newstart = scan - 1;
1558 newlen++;
1559 break;
1560 case OPLUS_:
1563 break;
1564 case OQUEST_:
1566 scan--;
1567 do {
1568 scan += OPND(s);
1569 s = *scan;
1570
1573 return;
1574 }
1577 default:
1578 if (newlen > g->mlen) {
1579 start = newstart;
1580 g->mlen = newlen;
1581 }
1582 newlen = 0;
1583 break;
1584 }
1586
1587 if (g->mlen == 0)
1588 return;
1589
1590
1591 g->must = malloc((size_t)g->mlen + 1);
1592 if (g->must == NULL) {
1593 g->mlen = 0;
1594 return;
1595 }
1596 cp = g->must;
1597 scan = start;
1598 for (i = g->mlen; i > 0; i--) {
1599 while (OP(s = *scan++) != OCHAR)
1600 continue;
1601 assert(cp < g->must + g->mlen);
1603 }
1604 assert(cp == g->must + g->mlen);
1605 *cp++ = '\0';
1606}
1607
1608
1609
1610
1611static sopno
1613 sop *scan;
1615 sopno plusnest = 0;
1616 sopno maxnest = 0;
1617
1618 if (p->error != 0)
1619 return (0);
1620
1621 scan = g->strip + 1;
1622 do {
1623 s = *scan++;
1624 switch (OP(s)) {
1626 plusnest++;
1627 break;
1629 if (plusnest > maxnest)
1630 maxnest = plusnest;
1631 plusnest--;
1632 break;
1633 }
1635 if (plusnest != 0)
1637 return (maxnest);
1638}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_FALLTHROUGH
LLVM_FALLTHROUGH - Mark fallthrough cases in switch statements.
INLINE void g(uint32_t *state, size_t a, size_t b, size_t c, size_t d, uint32_t x, uint32_t y)
static void mccase(struct parse *, cset *)
Definition regcomp.c:1336
static int samesets(struct re_guts *, int, int)
Definition regcomp.c:1360
static void stripsnug(struct parse *, struct re_guts *)
Definition regcomp.c:1512
#define NEXT2()
Definition regcomp.c:253
#define HERE()
Definition regcomp.c:265
static void mcadd(struct parse *, cset *, const char *)
Definition regcomp.c:1300
static char p_b_coll_elem(struct parse *, int)
Definition regcomp.c:985
#define SEETWO(a, b)
Definition regcomp.c:249
#define GETNEXT()
Definition regcomp.c:255
static void p_ere_exp(struct parse *)
Definition regcomp.c:429
static sopno dupl(struct parse *, sopno, sopno)
Definition regcomp.c:1400
#define DROP(n)
Definition regcomp.c:268
#define never
Definition regcomp.c:280
static char othercase(int)
Definition regcomp.c:1011
static void p_b_cclass(struct parse *, cset *)
Definition regcomp.c:926
static void doemit(struct parse *, sop, size_t)
Definition regcomp.c:1424
#define NPAREN
Definition regcomp.c:195
static void nonnewline(struct parse *)
Definition regcomp.c:1065
static void p_b_eclass(struct parse *, cset *)
Definition regcomp.c:957
static int freezeset(struct parse *, cset *)
Definition regcomp.c:1242
#define ASTERN(sop, pos)
Definition regcomp.c:264
#define AHEAD(pos)
Definition regcomp.c:263
static struct cclass cclasses[]
static struct cname cnames[]
static void ordinary(struct parse *, int)
Definition regcomp.c:1048
#define MUSTEAT(c, e)
Definition regcomp.c:259
#define SETERROR(e)
Definition regcomp.c:256
#define PEEK2()
Definition regcomp.c:245
static void categorize(struct parse *, struct re_guts *)
Definition regcomp.c:1376
static void p_str(struct parse *)
Definition regcomp.c:602
#define DUPMAX
Definition regcomp.c:273
static void bothcases(struct parse *, int)
Definition regcomp.c:1027
#define INSERT(op, pos)
Definition regcomp.c:262
static char nuls[10]
Definition regcomp.c:238
static void repeat(struct parse *, sopno, int, int)
Definition regcomp.c:1081
int llvm_regcomp(llvm_regex_t *preg, const char *pattern, int cflags)
Definition regcomp.c:287
static void p_b_term(struct parse *, cset *)
Definition regcomp.c:864
static int isinsets(struct re_guts *, int)
Definition regcomp.c:1344
#define NEXTn(n)
Definition regcomp.c:254
#define PEEK()
Definition regcomp.c:244
#define SEE(c)
Definition regcomp.c:248
static void p_bre(struct parse *, int, int)
Definition regcomp.c:618
#define THERE()
Definition regcomp.c:266
static int nch(struct parse *, cset *)
Definition regcomp.c:1286
static void doinsert(struct parse *, sop, size_t, sopno)
Definition regcomp.c:1444
static sopno pluscount(struct parse *, struct re_guts *)
Definition regcomp.c:1612
static void p_ere(struct parse *, int)
Definition regcomp.c:386
static char p_b_symbol(struct parse *)
Definition regcomp.c:968
#define MORE()
Definition regcomp.c:246
static void findmust(struct parse *, struct re_guts *)
Definition regcomp.c:1536
static cset * allocset(struct parse *)
Definition regcomp.c:1162
static void p_bracket(struct parse *)
Definition regcomp.c:784
static void dofwd(struct parse *, sopno, sop)
Definition regcomp.c:1477
static int p_count(struct parse *)
Definition regcomp.c:765
static void enlarge(struct parse *, sopno)
Definition regcomp.c:1489
#define REGINFINITY
Definition regcomp.c:275
#define MORE2()
Definition regcomp.c:247
#define REQUIRE(co, e)
Definition regcomp.c:257
#define EAT(c)
Definition regcomp.c:250
#define EMIT(op, sopnd)
Definition regcomp.c:261
#define THERETHERE()
Definition regcomp.c:267
static int p_simp_re(struct parse *, int)
Definition regcomp.c:648
static void freeset(struct parse *, cset *)
Definition regcomp.c:1221
static void mcinvert(struct parse *, cset *)
Definition regcomp.c:1325
static int seterr(struct parse *, int)
Definition regcomp.c:1151
#define NEXT()
Definition regcomp.c:252
#define EATTWO(a, b)
Definition regcomp.c:251
static int firstch(struct parse *, cset *)
Definition regcomp.c:1272
size_t llvm_strlcpy(char *dst, const char *src, size_t siz)
struct llvm_regex llvm_regex_t
void llvm_regfree(llvm_regex_t *)
const char * multis
Definition regcomp.c:57
const char * chars
Definition regcomp.c:56
const char * name
Definition regcomp.c:55
char code
Definition regcomp.c:84
const char * name
Definition regcomp.c:83
struct re_guts * g
Definition regcomp.c:194
const char * next
Definition regcomp.c:187
sopno pend[NPAREN]
Definition regcomp.c:197
sopno slen
Definition regcomp.c:192
sopno ssize
Definition regcomp.c:191
int error
Definition regcomp.c:189
const char * end
Definition regcomp.c:188
sopno pbegin[NPAREN]
Definition regcomp.c:196
sop * strip
Definition regcomp.c:190
int ncsalloc
Definition regcomp.c:193