MCPcopy Create free account
hub / github.com/boostorg/build / regatom

Function regatom

v2/engine/regexp.c:479–651  ·  view source on GitHub ↗

- regatom - the lowest level * * Optimization: gobbles an entire sequence of ordinary characters so that * it can turn them into a single node, which is smaller to store and * faster to run. Backslashed characters are exceptions, each becoming a * separate node; the code is simpler that way and it's not worth fixing. */

Source from the content-addressed store, hash-verified

477 * separate node; the code is simpler that way and it's not worth fixing.
478 */
479static char *
480regatom( int *flagp )
481{
482 register char *ret;
483 int flags;
484
485 *flagp = WORST; /* Tentatively. */
486
487 switch (*regparse++) {
488 /* FIXME: these chars only have meaning at beg/end of pat? */
489 case '^':
490 ret = regnode(BOL);
491 break;
492 case '$':
493 ret = regnode(EOL);
494 break;
495 case '.':
496 ret = regnode(ANY);
497 *flagp |= HASWIDTH|SIMPLE;
498 break;
499 case '[': {
500 register int classr;
501 register int classend;
502
503 if (*regparse == '^') { /* Complement of range. */
504 ret = regnode(ANYBUT);
505 regparse++;
506 } else
507 ret = regnode(ANYOF);
508 if (*regparse == ']' || *regparse == '-')
509 regc(*regparse++);
510 while (*regparse != '\0' && *regparse != ']') {
511 if (*regparse == '-') {
512 regparse++;
513 if (*regparse == ']' || *regparse == '\0')
514 regc('-');
515 else {
516 classr = UCHARAT(regparse-2)+1;
517 classend = UCHARAT(regparse);
518 if (classr > classend+1)
519 FAIL("invalid [] range");
520 for (; classr <= classend; classr++)
521 regc(classr);
522 regparse++;
523 }
524 } else
525 regc(*regparse++);
526 }
527 regc('\0');
528 if (*regparse != ']')
529 FAIL("unmatched []");
530 regparse++;
531 *flagp |= HASWIDTH|SIMPLE;
532 }
533 break;
534 case '(':
535 ret = reg(1, &flags);
536 if (ret == NULL)

Callers 1

regpieceFunction · 0.85

Calls 3

regnodeFunction · 0.85
regcFunction · 0.85
regFunction · 0.85

Tested by

no test coverage detected