regcomp.c (14815) | regcomp.c (17141) |
---|---|
1/*- 2 * Copyright (c) 1992, 1993, 1994 Henry Spencer. 3 * Copyright (c) 1992, 1993, 1994 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * Henry Spencer. 8 * --- 89 unchanged lines hidden (view full) --- 98static void repeat __P((struct parse *p, sopno start, int from, int to)); 99static int seterr __P((struct parse *p, int e)); 100static cset *allocset __P((struct parse *p)); 101static void freeset __P((struct parse *p, cset *cs)); 102static int freezeset __P((struct parse *p, cset *cs)); 103static int firstch __P((struct parse *p, cset *cs)); 104static int nch __P((struct parse *p, cset *cs)); 105static void mcadd __P((struct parse *p, cset *cs, char *cp)); | 1/*- 2 * Copyright (c) 1992, 1993, 1994 Henry Spencer. 3 * Copyright (c) 1992, 1993, 1994 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * Henry Spencer. 8 * --- 89 unchanged lines hidden (view full) --- 98static void repeat __P((struct parse *p, sopno start, int from, int to)); 99static int seterr __P((struct parse *p, int e)); 100static cset *allocset __P((struct parse *p)); 101static void freeset __P((struct parse *p, cset *cs)); 102static int freezeset __P((struct parse *p, cset *cs)); 103static int firstch __P((struct parse *p, cset *cs)); 104static int nch __P((struct parse *p, cset *cs)); 105static void mcadd __P((struct parse *p, cset *cs, char *cp)); |
106#if used |
|
106static void mcsub __P((cset *cs, char *cp)); 107static int mcin __P((cset *cs, char *cp)); 108static char *mcfind __P((cset *cs, char *cp)); | 107static void mcsub __P((cset *cs, char *cp)); 108static int mcin __P((cset *cs, char *cp)); 109static char *mcfind __P((cset *cs, char *cp)); |
110#endif |
|
109static void mcinvert __P((struct parse *p, cset *cs)); 110static void mccase __P((struct parse *p, cset *cs)); 111static int isinsets __P((struct re_guts *g, int c)); 112static int samesets __P((struct re_guts *g, int c1, int c2)); 113static void categorize __P((struct parse *p, struct re_guts *g)); 114static sopno dupl __P((struct parse *p, sopno start, sopno finish)); 115static void doemit __P((struct parse *p, sop op, size_t opnd)); 116static void doinsert __P((struct parse *p, sop op, size_t opnd, sopno pos)); --- 173 unchanged lines hidden (view full) --- 290 register sopno conc; 291 register int first = 1; /* is this the first alternative? */ 292 293 for (;;) { 294 /* do a bunch of concatenated expressions */ 295 conc = HERE(); 296 while (MORE() && (c = PEEK()) != '|' && c != stop) 297 p_ere_exp(p); | 111static void mcinvert __P((struct parse *p, cset *cs)); 112static void mccase __P((struct parse *p, cset *cs)); 113static int isinsets __P((struct re_guts *g, int c)); 114static int samesets __P((struct re_guts *g, int c1, int c2)); 115static void categorize __P((struct parse *p, struct re_guts *g)); 116static sopno dupl __P((struct parse *p, sopno start, sopno finish)); 117static void doemit __P((struct parse *p, sop op, size_t opnd)); 118static void doinsert __P((struct parse *p, sop op, size_t opnd, sopno pos)); --- 173 unchanged lines hidden (view full) --- 292 register sopno conc; 293 register int first = 1; /* is this the first alternative? */ 294 295 for (;;) { 296 /* do a bunch of concatenated expressions */ 297 conc = HERE(); 298 while (MORE() && (c = PEEK()) != '|' && c != stop) 299 p_ere_exp(p); |
298 REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ | 300 (void)REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ |
299 300 if (!EAT('|')) 301 break; /* NOTE BREAK OUT */ 302 303 if (first) { 304 INSERT(OCH_, conc); /* offset is wrong */ 305 prevfwd = conc; 306 prevback = conc; --- 30 unchanged lines hidden (view full) --- 337 int wascaret = 0; 338 339 assert(MORE()); /* caller should have ensured this */ 340 c = GETNEXT(); 341 342 pos = HERE(); 343 switch (c) { 344 case '(': | 301 302 if (!EAT('|')) 303 break; /* NOTE BREAK OUT */ 304 305 if (first) { 306 INSERT(OCH_, conc); /* offset is wrong */ 307 prevfwd = conc; 308 prevback = conc; --- 30 unchanged lines hidden (view full) --- 339 int wascaret = 0; 340 341 assert(MORE()); /* caller should have ensured this */ 342 c = GETNEXT(); 343 344 pos = HERE(); 345 switch (c) { 346 case '(': |
345 REQUIRE(MORE(), REG_EPAREN); | 347 (void)REQUIRE(MORE(), REG_EPAREN); |
346 p->g->nsub++; 347 subno = p->g->nsub; 348 if (subno < NPAREN) 349 p->pbegin[subno] = HERE(); 350 EMIT(OLPAREN, subno); 351 if (!SEE(')')) 352 p_ere(p, ')'); 353 if (subno < NPAREN) { 354 p->pend[subno] = HERE(); 355 assert(p->pend[subno] != 0); 356 } 357 EMIT(ORPAREN, subno); | 348 p->g->nsub++; 349 subno = p->g->nsub; 350 if (subno < NPAREN) 351 p->pbegin[subno] = HERE(); 352 EMIT(OLPAREN, subno); 353 if (!SEE(')')) 354 p_ere(p, ')'); 355 if (subno < NPAREN) { 356 p->pend[subno] = HERE(); 357 assert(p->pend[subno] != 0); 358 } 359 EMIT(ORPAREN, subno); |
358 MUSTEAT(')', REG_EPAREN); | 360 (void)MUSTEAT(')', REG_EPAREN); |
359 break; 360#ifndef POSIX_MISTAKE 361 case ')': /* happens only if no current unmatched ( */ 362 /* 363 * You may ask, why the ifndef? Because I didn't notice 364 * this until slightly too late for 1003.2, and none of the 365 * other 1003.2 regular-expression reviewers noticed it at 366 * all. So an unmatched ) is legal POSIX, at least until --- 26 unchanged lines hidden (view full) --- 393 nonnewline(p); 394 else 395 EMIT(OANY, 0); 396 break; 397 case '[': 398 p_bracket(p); 399 break; 400 case '\\': | 361 break; 362#ifndef POSIX_MISTAKE 363 case ')': /* happens only if no current unmatched ( */ 364 /* 365 * You may ask, why the ifndef? Because I didn't notice 366 * this until slightly too late for 1003.2, and none of the 367 * other 1003.2 regular-expression reviewers noticed it at 368 * all. So an unmatched ) is legal POSIX, at least until --- 26 unchanged lines hidden (view full) --- 395 nonnewline(p); 396 else 397 EMIT(OANY, 0); 398 break; 399 case '[': 400 p_bracket(p); 401 break; 402 case '\\': |
401 REQUIRE(MORE(), REG_EESCAPE); | 403 (void)REQUIRE(MORE(), REG_EESCAPE); |
402 c = GETNEXT(); 403 ordinary(p, c); 404 break; 405 case '{': /* okay as ordinary except if digit follows */ | 404 c = GETNEXT(); 405 ordinary(p, c); 406 break; 407 case '{': /* okay as ordinary except if digit follows */ |
406 REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT); | 408 (void)REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT); |
407 /* FALLTHROUGH */ 408 default: 409 ordinary(p, c); 410 break; 411 } 412 413 if (!MORE()) 414 return; 415 c = PEEK(); 416 /* we call { a repetition if followed by a digit */ 417 if (!( c == '*' || c == '+' || c == '?' || 418 (c == '{' && MORE2() && isdigit(PEEK2())) )) 419 return; /* no repetition, we're done */ 420 NEXT(); 421 | 409 /* FALLTHROUGH */ 410 default: 411 ordinary(p, c); 412 break; 413 } 414 415 if (!MORE()) 416 return; 417 c = PEEK(); 418 /* we call { a repetition if followed by a digit */ 419 if (!( c == '*' || c == '+' || c == '?' || 420 (c == '{' && MORE2() && isdigit(PEEK2())) )) 421 return; /* no repetition, we're done */ 422 NEXT(); 423 |
422 REQUIRE(!wascaret, REG_BADRPT); | 424 (void)REQUIRE(!wascaret, REG_BADRPT); |
423 switch (c) { 424 case '*': /* implemented as +? */ 425 /* this case does not require the (y|) trick, noKLUDGE */ 426 INSERT(OPLUS_, pos); 427 ASTERN(O_PLUS, pos); 428 INSERT(OQUEST_, pos); 429 ASTERN(O_QUEST, pos); 430 break; --- 10 unchanged lines hidden (view full) --- 441 AHEAD(THERE()); /* ...so fix it */ 442 ASTERN(O_CH, THERETHERE()); 443 break; 444 case '{': 445 count = p_count(p); 446 if (EAT(',')) { 447 if (isdigit(PEEK())) { 448 count2 = p_count(p); | 425 switch (c) { 426 case '*': /* implemented as +? */ 427 /* this case does not require the (y|) trick, noKLUDGE */ 428 INSERT(OPLUS_, pos); 429 ASTERN(O_PLUS, pos); 430 INSERT(OQUEST_, pos); 431 ASTERN(O_QUEST, pos); 432 break; --- 10 unchanged lines hidden (view full) --- 443 AHEAD(THERE()); /* ...so fix it */ 444 ASTERN(O_CH, THERETHERE()); 445 break; 446 case '{': 447 count = p_count(p); 448 if (EAT(',')) { 449 if (isdigit(PEEK())) { 450 count2 = p_count(p); |
449 REQUIRE(count <= count2, REG_BADBR); | 451 (void)REQUIRE(count <= count2, REG_BADBR); |
450 } else /* single number with comma */ 451 count2 = INFINITY; 452 } else /* just a single number */ 453 count2 = count; 454 repeat(p, pos, count, count2); 455 if (!EAT('}')) { /* error heuristics */ 456 while (MORE() && PEEK() != '}') 457 NEXT(); | 452 } else /* single number with comma */ 453 count2 = INFINITY; 454 } else /* just a single number */ 455 count2 = count; 456 repeat(p, pos, count, count2); 457 if (!EAT('}')) { /* error heuristics */ 458 while (MORE() && PEEK() != '}') 459 NEXT(); |
458 REQUIRE(MORE(), REG_EBRACE); | 460 (void)REQUIRE(MORE(), REG_EBRACE); |
459 SETERROR(REG_BADBR); 460 } 461 break; 462 } 463 464 if (!MORE()) 465 return; 466 c = PEEK(); --- 6 unchanged lines hidden (view full) --- 473/* 474 - p_str - string (no metacharacters) "parser" 475 == static void p_str(register struct parse *p); 476 */ 477static void 478p_str(p) 479register struct parse *p; 480{ | 461 SETERROR(REG_BADBR); 462 } 463 break; 464 } 465 466 if (!MORE()) 467 return; 468 c = PEEK(); --- 6 unchanged lines hidden (view full) --- 475/* 476 - p_str - string (no metacharacters) "parser" 477 == static void p_str(register struct parse *p); 478 */ 479static void 480p_str(p) 481register struct parse *p; 482{ |
481 REQUIRE(MORE(), REG_EMPTY); | 483 (void)REQUIRE(MORE(), REG_EMPTY); |
482 while (MORE()) 483 ordinary(p, GETNEXT()); 484} 485 486/* 487 - p_bre - BRE parser top level, anchoring and concatenation 488 == static void p_bre(register struct parse *p, register int end1, \ 489 == register int end2); --- 26 unchanged lines hidden (view full) --- 516 } 517 if (wasdollar) { /* oops, that was a trailing anchor */ 518 DROP(1); 519 EMIT(OEOL, 0); 520 p->g->iflags |= USEEOL; 521 p->g->neol++; 522 } 523 | 484 while (MORE()) 485 ordinary(p, GETNEXT()); 486} 487 488/* 489 - p_bre - BRE parser top level, anchoring and concatenation 490 == static void p_bre(register struct parse *p, register int end1, \ 491 == register int end2); --- 26 unchanged lines hidden (view full) --- 518 } 519 if (wasdollar) { /* oops, that was a trailing anchor */ 520 DROP(1); 521 EMIT(OEOL, 0); 522 p->g->iflags |= USEEOL; 523 p->g->neol++; 524 } 525 |
524 REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ | 526 (void)REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ |
525} 526 527/* 528 - p_simp_re - parse a simple RE, an atom possibly followed by a repetition 529 == static int p_simp_re(register struct parse *p, int starordinary); 530 */ 531static int /* was the simple RE an unbackslashed $? */ 532p_simp_re(p, starordinary) --- 8 unchanged lines hidden (view full) --- 541 register sopno subno; 542# define BACKSL (1<<CHAR_BIT) 543 544 pos = HERE(); /* repetion op, if any, covers from here */ 545 546 assert(MORE()); /* caller should have ensured this */ 547 c = GETNEXT(); 548 if (c == '\\') { | 527} 528 529/* 530 - p_simp_re - parse a simple RE, an atom possibly followed by a repetition 531 == static int p_simp_re(register struct parse *p, int starordinary); 532 */ 533static int /* was the simple RE an unbackslashed $? */ 534p_simp_re(p, starordinary) --- 8 unchanged lines hidden (view full) --- 543 register sopno subno; 544# define BACKSL (1<<CHAR_BIT) 545 546 pos = HERE(); /* repetion op, if any, covers from here */ 547 548 assert(MORE()); /* caller should have ensured this */ 549 c = GETNEXT(); 550 if (c == '\\') { |
549 REQUIRE(MORE(), REG_EESCAPE); | 551 (void)REQUIRE(MORE(), REG_EESCAPE); |
550 c = BACKSL | (unsigned char)GETNEXT(); 551 } 552 switch (c) { 553 case '.': 554 if (p->g->cflags®_NEWLINE) 555 nonnewline(p); 556 else 557 EMIT(OANY, 0); --- 13 unchanged lines hidden (view full) --- 571 /* the MORE here is an error heuristic */ 572 if (MORE() && !SEETWO('\\', ')')) 573 p_bre(p, '\\', ')'); 574 if (subno < NPAREN) { 575 p->pend[subno] = HERE(); 576 assert(p->pend[subno] != 0); 577 } 578 EMIT(ORPAREN, subno); | 552 c = BACKSL | (unsigned char)GETNEXT(); 553 } 554 switch (c) { 555 case '.': 556 if (p->g->cflags®_NEWLINE) 557 nonnewline(p); 558 else 559 EMIT(OANY, 0); --- 13 unchanged lines hidden (view full) --- 573 /* the MORE here is an error heuristic */ 574 if (MORE() && !SEETWO('\\', ')')) 575 p_bre(p, '\\', ')'); 576 if (subno < NPAREN) { 577 p->pend[subno] = HERE(); 578 assert(p->pend[subno] != 0); 579 } 580 EMIT(ORPAREN, subno); |
579 REQUIRE(EATTWO('\\', ')'), REG_EPAREN); | 581 (void)REQUIRE(EATTWO('\\', ')'), REG_EPAREN); |
580 break; 581 case BACKSL|')': /* should not get here -- must be user */ 582 case BACKSL|'}': 583 SETERROR(REG_EPAREN); 584 break; 585 case BACKSL|'1': 586 case BACKSL|'2': 587 case BACKSL|'3': --- 13 unchanged lines hidden (view full) --- 601 assert(OP(p->strip[p->pend[i]]) == ORPAREN); 602 (void) dupl(p, p->pbegin[i]+1, p->pend[i]); 603 EMIT(O_BACK, i); 604 } else 605 SETERROR(REG_ESUBREG); 606 p->g->backrefs = 1; 607 break; 608 case '*': | 582 break; 583 case BACKSL|')': /* should not get here -- must be user */ 584 case BACKSL|'}': 585 SETERROR(REG_EPAREN); 586 break; 587 case BACKSL|'1': 588 case BACKSL|'2': 589 case BACKSL|'3': --- 13 unchanged lines hidden (view full) --- 603 assert(OP(p->strip[p->pend[i]]) == ORPAREN); 604 (void) dupl(p, p->pbegin[i]+1, p->pend[i]); 605 EMIT(O_BACK, i); 606 } else 607 SETERROR(REG_ESUBREG); 608 p->g->backrefs = 1; 609 break; 610 case '*': |
609 REQUIRE(starordinary, REG_BADRPT); | 611 (void)REQUIRE(starordinary, REG_BADRPT); |
610 /* FALLTHROUGH */ 611 default: 612 ordinary(p, c &~ BACKSL); 613 break; 614 } 615 616 if (EAT('*')) { /* implemented as +? */ 617 /* this case does not require the (y|) trick, noKLUDGE */ 618 INSERT(OPLUS_, pos); 619 ASTERN(O_PLUS, pos); 620 INSERT(OQUEST_, pos); 621 ASTERN(O_QUEST, pos); 622 } else if (EATTWO('\\', '{')) { 623 count = p_count(p); 624 if (EAT(',')) { 625 if (MORE() && isdigit(PEEK())) { 626 count2 = p_count(p); | 612 /* FALLTHROUGH */ 613 default: 614 ordinary(p, c &~ BACKSL); 615 break; 616 } 617 618 if (EAT('*')) { /* implemented as +? */ 619 /* this case does not require the (y|) trick, noKLUDGE */ 620 INSERT(OPLUS_, pos); 621 ASTERN(O_PLUS, pos); 622 INSERT(OQUEST_, pos); 623 ASTERN(O_QUEST, pos); 624 } else if (EATTWO('\\', '{')) { 625 count = p_count(p); 626 if (EAT(',')) { 627 if (MORE() && isdigit(PEEK())) { 628 count2 = p_count(p); |
627 REQUIRE(count <= count2, REG_BADBR); | 629 (void)REQUIRE(count <= count2, REG_BADBR); |
628 } else /* single number with comma */ 629 count2 = INFINITY; 630 } else /* just a single number */ 631 count2 = count; 632 repeat(p, pos, count, count2); 633 if (!EATTWO('\\', '}')) { /* error heuristics */ 634 while (MORE() && !SEETWO('\\', '}')) 635 NEXT(); | 630 } else /* single number with comma */ 631 count2 = INFINITY; 632 } else /* just a single number */ 633 count2 = count; 634 repeat(p, pos, count, count2); 635 if (!EATTWO('\\', '}')) { /* error heuristics */ 636 while (MORE() && !SEETWO('\\', '}')) 637 NEXT(); |
636 REQUIRE(MORE(), REG_EBRACE); | 638 (void)REQUIRE(MORE(), REG_EBRACE); |
637 SETERROR(REG_BADBR); 638 } 639 } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */ 640 return(1); 641 642 return(0); 643} 644 --- 8 unchanged lines hidden (view full) --- 653 register int count = 0; 654 register int ndigits = 0; 655 656 while (MORE() && isdigit(PEEK()) && count <= DUPMAX) { 657 count = count*10 + (GETNEXT() - '0'); 658 ndigits++; 659 } 660 | 639 SETERROR(REG_BADBR); 640 } 641 } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */ 642 return(1); 643 644 return(0); 645} 646 --- 8 unchanged lines hidden (view full) --- 655 register int count = 0; 656 register int ndigits = 0; 657 658 while (MORE() && isdigit(PEEK()) && count <= DUPMAX) { 659 count = count*10 + (GETNEXT() - '0'); 660 ndigits++; 661 } 662 |
661 REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); | 663 (void)REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); |
662 return(count); 663} 664 665/* 666 - p_bracket - parse a bracketed character list 667 == static void p_bracket(register struct parse *p); 668 * 669 * Note a significant property of this code: if the allocset() did SETERROR, --- 23 unchanged lines hidden (view full) --- 693 if (EAT(']')) 694 CHadd(cs, ']'); 695 else if (EAT('-')) 696 CHadd(cs, '-'); 697 while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) 698 p_b_term(p, cs); 699 if (EAT('-')) 700 CHadd(cs, '-'); | 664 return(count); 665} 666 667/* 668 - p_bracket - parse a bracketed character list 669 == static void p_bracket(register struct parse *p); 670 * 671 * Note a significant property of this code: if the allocset() did SETERROR, --- 23 unchanged lines hidden (view full) --- 695 if (EAT(']')) 696 CHadd(cs, ']'); 697 else if (EAT('-')) 698 CHadd(cs, '-'); 699 while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) 700 p_b_term(p, cs); 701 if (EAT('-')) 702 CHadd(cs, '-'); |
701 MUSTEAT(']', REG_EBRACK); | 703 (void)MUSTEAT(']', REG_EBRACK); |
702 703 if (p->error != 0) /* don't mess things up further */ 704 return; 705 706 if (p->g->cflags®_ICASE) { 707 register int i; 708 register int ci; 709 --- 54 unchanged lines hidden (view full) --- 764 default: 765 c = '\0'; 766 break; 767 } 768 769 switch (c) { 770 case ':': /* character class */ 771 NEXT2(); | 704 705 if (p->error != 0) /* don't mess things up further */ 706 return; 707 708 if (p->g->cflags®_ICASE) { 709 register int i; 710 register int ci; 711 --- 54 unchanged lines hidden (view full) --- 766 default: 767 c = '\0'; 768 break; 769 } 770 771 switch (c) { 772 case ':': /* character class */ 773 NEXT2(); |
772 REQUIRE(MORE(), REG_EBRACK); | 774 (void)REQUIRE(MORE(), REG_EBRACK); |
773 c = PEEK(); | 775 c = PEEK(); |
774 REQUIRE(c != '-' && c != ']', REG_ECTYPE); | 776 (void)REQUIRE(c != '-' && c != ']', REG_ECTYPE); |
775 p_b_cclass(p, cs); | 777 p_b_cclass(p, cs); |
776 REQUIRE(MORE(), REG_EBRACK); 777 REQUIRE(EATTWO(':', ']'), REG_ECTYPE); | 778 (void)REQUIRE(MORE(), REG_EBRACK); 779 (void)REQUIRE(EATTWO(':', ']'), REG_ECTYPE); |
778 break; 779 case '=': /* equivalence class */ 780 NEXT2(); | 780 break; 781 case '=': /* equivalence class */ 782 NEXT2(); |
781 REQUIRE(MORE(), REG_EBRACK); | 783 (void)REQUIRE(MORE(), REG_EBRACK); |
782 c = PEEK(); | 784 c = PEEK(); |
783 REQUIRE(c != '-' && c != ']', REG_ECOLLATE); | 785 (void)REQUIRE(c != '-' && c != ']', REG_ECOLLATE); |
784 p_b_eclass(p, cs); | 786 p_b_eclass(p, cs); |
785 REQUIRE(MORE(), REG_EBRACK); 786 REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); | 787 (void)REQUIRE(MORE(), REG_EBRACK); 788 (void)REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); |
787 break; 788 default: /* symbol, ordinary character, or range */ 789/* xxx revision needed for multichar stuff */ 790 start = p_b_symbol(p); 791 if (SEE('-') && MORE2() && PEEK2() != ']') { 792 /* range */ 793 NEXT(); 794 if (EAT('-')) 795 finish = '-'; 796 else 797 finish = p_b_symbol(p); 798 } else 799 finish = start; 800/* xxx what about signed chars here... */ | 789 break; 790 default: /* symbol, ordinary character, or range */ 791/* xxx revision needed for multichar stuff */ 792 start = p_b_symbol(p); 793 if (SEE('-') && MORE2() && PEEK2() != ']') { 794 /* range */ 795 NEXT(); 796 if (EAT('-')) 797 finish = '-'; 798 else 799 finish = p_b_symbol(p); 800 } else 801 finish = start; 802/* xxx what about signed chars here... */ |
801 REQUIRE(start <= finish, REG_ERANGE); | 803 (void)REQUIRE(start <= finish, REG_ERANGE); |
802 for (i = start; i <= finish; i++) 803 CHadd(cs, i); 804 break; 805 } 806} 807 808/* 809 - p_b_cclass - parse a character-class name and deal with it --- 51 unchanged lines hidden (view full) --- 861 == static char p_b_symbol(register struct parse *p); 862 */ 863static char /* value of symbol */ 864p_b_symbol(p) 865register struct parse *p; 866{ 867 register char value; 868 | 804 for (i = start; i <= finish; i++) 805 CHadd(cs, i); 806 break; 807 } 808} 809 810/* 811 - p_b_cclass - parse a character-class name and deal with it --- 51 unchanged lines hidden (view full) --- 863 == static char p_b_symbol(register struct parse *p); 864 */ 865static char /* value of symbol */ 866p_b_symbol(p) 867register struct parse *p; 868{ 869 register char value; 870 |
869 REQUIRE(MORE(), REG_EBRACK); | 871 (void)REQUIRE(MORE(), REG_EBRACK); |
870 if (!EATTWO('[', '.')) 871 return(GETNEXT()); 872 873 /* collating symbol */ 874 value = p_b_coll_elem(p, '.'); | 872 if (!EATTWO('[', '.')) 873 return(GETNEXT()); 874 875 /* collating symbol */ 876 value = p_b_coll_elem(p, '.'); |
875 REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); | 877 (void)REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); |
876 return(value); 877} 878 879/* 880 - p_b_coll_elem - parse a collating-element name and look it up 881 == static char p_b_coll_elem(register struct parse *p, int endc); 882 */ 883static char /* value of collating element */ --- 375 unchanged lines hidden (view full) --- 1259 SETERROR(REG_ESPACE); 1260 return; 1261 } 1262 1263 (void) strcpy(cs->multis + oldend - 1, cp); 1264 cs->multis[cs->smultis - 1] = '\0'; 1265} 1266 | 878 return(value); 879} 880 881/* 882 - p_b_coll_elem - parse a collating-element name and look it up 883 == static char p_b_coll_elem(register struct parse *p, int endc); 884 */ 885static char /* value of collating element */ --- 375 unchanged lines hidden (view full) --- 1261 SETERROR(REG_ESPACE); 1262 return; 1263 } 1264 1265 (void) strcpy(cs->multis + oldend - 1, cp); 1266 cs->multis[cs->smultis - 1] = '\0'; 1267} 1268 |
1269#if used |
|
1267/* 1268 - mcsub - subtract a collating element from a cset 1269 == static void mcsub(register cset *cs, register char *cp); 1270 */ 1271static void 1272mcsub(cs, cp) 1273register cset *cs; 1274register char *cp; --- 41 unchanged lines hidden (view full) --- 1316 1317 if (cs->multis == NULL) 1318 return(NULL); 1319 for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) 1320 if (strcmp(cp, p) == 0) 1321 return(p); 1322 return(NULL); 1323} | 1270/* 1271 - mcsub - subtract a collating element from a cset 1272 == static void mcsub(register cset *cs, register char *cp); 1273 */ 1274static void 1275mcsub(cs, cp) 1276register cset *cs; 1277register char *cp; --- 41 unchanged lines hidden (view full) --- 1319 1320 if (cs->multis == NULL) 1321 return(NULL); 1322 for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) 1323 if (strcmp(cp, p) == 0) 1324 return(p); 1325 return(NULL); 1326} |
1327#endif |
|
1324 1325/* 1326 - mcinvert - invert the list of collating elements in a cset 1327 == static void mcinvert(register struct parse *p, register cset *cs); 1328 * 1329 * This would have to know the set of possibilities. Implementation 1330 * is deferred. 1331 */ --- 367 unchanged lines hidden --- | 1328 1329/* 1330 - mcinvert - invert the list of collating elements in a cset 1331 == static void mcinvert(register struct parse *p, register cset *cs); 1332 * 1333 * This would have to know the set of possibilities. Implementation 1334 * is deferred. 1335 */ --- 367 unchanged lines hidden --- |