Lines Matching +full:- +full:s
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
56 next(STR *s) in next() argument
63 switch (s->state) { in next()
69 switch (*s->str) { in next()
71 s->state = EOS; in next()
74 s->lastch = backslash(s, &is_octal); in next()
77 if (bracket(s)) in next()
78 return (next(s)); in next()
81 clen = mbrtowc(&wch, s->str, MB_LEN_MAX, NULL); in next()
82 if (clen == (size_t)-1 || clen == (size_t)-2 || in next()
86 s->lastch = wch; in next()
87 s->str += clen; in next()
92 if (s->str[0] == '-' && genrange(s, is_octal)) in next()
93 return (next(s)); in next()
96 if (s->cnt-- == 0) { in next()
97 s->state = NORMAL; in next()
98 return (next(s)); in next()
100 ++s->lastch; in next()
103 if (s->cnt-- == 0) { in next()
104 s->state = NORMAL; in next()
105 return (next(s)); in next()
111 s->cnt++; in next()
112 ch = nextwctype(s->lastch, s->cclass); in next()
113 if (ch == -1) { in next()
114 s->state = NORMAL; in next()
115 return (next(s)); in next()
117 s->lastch = ch; in next()
120 if ((ch = s->set[s->cnt++]) == OOBCH) { in next()
121 s->state = NORMAL; in next()
122 return (next(s)); in next()
124 s->lastch = ch; in next()
133 bracket(STR *s) in bracket() argument
137 switch (s->str[1]) { in bracket()
139 if ((p = strchr(s->str + 2, ']')) == NULL) in bracket()
141 if (*(p - 1) != ':' || p - s->str < 4) in bracket()
143 *(p - 1) = '\0'; in bracket()
144 s->str += 2; in bracket()
145 genclass(s); in bracket()
146 s->str = p + 1; in bracket()
149 if (s->str[2] == '\0' || (p = strchr(s->str + 3, ']')) == NULL) in bracket()
151 if (*(p - 1) != '=' || p - s->str < 4) in bracket()
153 s->str += 2; in bracket()
154 genequiv(s); in bracket()
158 if ((p = strpbrk(s->str + 2, "*]")) == NULL) in bracket()
162 s->str += 1; in bracket()
163 genseq(s); in bracket()
170 genclass(STR *s) in genclass() argument
173 if ((s->cclass = wctype(s->str)) == 0) in genclass()
174 errx(1, "unknown class %s", s->str); in genclass()
175 s->cnt = 0; in genclass()
176 s->lastch = -1; /* incremented before check in next() */ in genclass()
177 if (strcmp(s->str, "upper") == 0) in genclass()
178 s->state = CCLASS_UPPER; in genclass()
179 else if (strcmp(s->str, "lower") == 0) in genclass()
180 s->state = CCLASS_LOWER; in genclass()
182 s->state = CCLASS; in genclass()
186 genequiv(STR *s) in genequiv() argument
193 if (*s->str == '\\') { in genequiv()
194 s->equiv[0] = backslash(s, NULL); in genequiv()
195 if (*s->str != '=') in genequiv()
197 s->str += 2; in genequiv()
199 clen = mbrtowc(&wc, s->str, MB_LEN_MAX, NULL); in genequiv()
200 if (clen == (size_t)-1 || clen == (size_t)-2 || clen == 0) in genequiv()
202 s->equiv[0] = wc; in genequiv()
203 if (s->str[clen] != '=') in genequiv()
205 s->str += clen + 2; in genequiv()
213 * it fills the string with primary collation weight bytes. Only one- in genequiv()
214 * to-one mappings are supported. in genequiv()
217 src[0] = (char)s->equiv[0]; in genequiv()
225 s->equiv[p++] = i; in genequiv()
227 s->equiv[p] = OOBCH; in genequiv()
230 s->cnt = 0; in genequiv()
231 s->state = SET; in genequiv()
232 s->set = s->equiv; in genequiv()
236 genrange(STR *s, int was_octal) in genrange() argument
245 savestart = s->str; in genrange()
246 if (*++s->str == '\\') in genrange()
247 stopval = backslash(s, &octal); in genrange()
249 clen = mbrtowc(&wc, s->str, MB_LEN_MAX, NULL); in genrange()
250 if (clen == (size_t)-1 || clen == (size_t)-2) in genrange()
253 s->str += clen; in genrange()
260 if (stopval < s->lastch) { in genrange()
261 s->str = savestart; in genrange()
264 s->cnt = stopval - s->lastch + 1; in genrange()
265 s->state = RANGE; in genrange()
266 --s->lastch; in genrange()
269 if (charcoll((const void *)&stopval, (const void *)&(s->lastch)) < 0) { in genrange()
270 s->str = savestart; in genrange()
273 if ((s->set = p = malloc((NCHARS_SB + 1) * sizeof(int))) == NULL) in genrange()
276 if (charcoll((const void *)&cnt, (const void *)&(s->lastch)) >= 0 && in genrange()
280 n = p - s->set; in genrange()
282 s->cnt = 0; in genrange()
283 s->state = SET; in genrange()
285 mergesort(s->set, n, sizeof(*(s->set)), charcoll); in genrange()
290 genseq(STR *s) in genseq() argument
296 if (s->which == STRING1) in genseq()
299 if (*s->str == '\\') in genseq()
300 s->lastch = backslash(s, NULL); in genseq()
302 clen = mbrtowc(&wc, s->str, MB_LEN_MAX, NULL); in genseq()
303 if (clen == (size_t)-1 || clen == (size_t)-2) in genseq()
305 s->lastch = wc; in genseq()
306 s->str += clen; in genseq()
308 if (*s->str != '*') in genseq()
311 switch (*++s->str) { in genseq()
313 s->cnt = backslash(s, NULL); in genseq()
316 s->cnt = 0; in genseq()
317 ++s->str; in genseq()
320 if (isdigit((u_char)*s->str)) { in genseq()
321 s->cnt = strtol(s->str, &ep, 0); in genseq()
323 s->str = ep + 1; in genseq()
331 s->state = s->cnt ? SEQUENCE : INFINITE; in genseq()
339 backslash(STR *s, int *is_octal) in backslash() argument
346 ch = (u_char)*++s->str; in backslash()
349 val = val * 8 + ch - '0'; in backslash()
351 ++s->str; in backslash()
361 ++s->str; in backslash()
377 case '\0': /* \" -> \ */ in backslash()
378 s->state = EOS; in backslash()
380 default: /* \x" -> x */ in backslash()