📄 regcomp.c
字号:
regset(bits,def,class); lastclass = 1234; continue; case 'W': for (class = 0; class < 256; class++) if (!isALNUM(class)) regset(bits,def,class); lastclass = 1234; continue; case 's': for (class = 0; class < 256; class++) if (isSPACE(class)) regset(bits,def,class); lastclass = 1234; continue; case 'S': for (class = 0; class < 256; class++) if (!isSPACE(class)) regset(bits,def,class); lastclass = 1234; continue; case 'd': for (class = '0'; class <= '9'; class++) regset(bits,def,class); lastclass = 1234; continue; case 'D': for (class = 0; class < '0'; class++) regset(bits,def,class); for (class = '9' + 1; class < 256; class++) regset(bits,def,class); lastclass = 1234; continue; case 'n': class = '\n'; break; case 'r': class = '\r'; break; case 't': class = '\t'; break; case 'f': class = '\f'; break; case 'b': class = '\b'; break; case 'e': class = '\033'; break; case 'a': class = '\007'; break; case 'x': class = scanhex(regparse, 2, &numlen); regparse += numlen; break; case 'c': class = *regparse++; if (isLOWER(class)) class = toupper(class); class ^= 64; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': class = scanoct(--regparse, 3, &numlen); regparse += numlen; break; } } if (range) { if (lastclass > class) FAIL("invalid [] range in regexp"); range = 0; } else { lastclass = class; if (*regparse == '-' && regparse+1 < regxend && regparse[1] != ']') { regparse++; range = 1; continue; /* do it next time */ } } for ( ; lastclass <= class; lastclass++) { regset(bits,def,lastclass); if (regfold && isUPPER(lastclass)) regset(bits,def,tolower(lastclass)); } lastclass = class; } if (*regparse != ']') FAIL("unmatched [] in regexp"); regparse++; return ret;}/* - regnode - emit a node */static char * /* Location. */regnode(op)char op;{ register char *ret; register char *ptr; ret = regcode; if (ret == ®dummy) {#ifdef REGALIGN if (!(regsize & 1)) regsize++;#endif regsize += 3; return(ret); }#ifdef REGALIGN#ifndef lint if (!((long)ret & 1)) *ret++ = 127;#endif#endif ptr = ret; *ptr++ = op; *ptr++ = '\0'; /* Null "next" pointer. */ *ptr++ = '\0'; regcode = ptr; return(ret);}/* - reganode - emit a node with an argument */static char * /* Location. */reganode(op, arg)char op;unsigned short arg;{ register char *ret; register char *ptr; ret = regcode; if (ret == ®dummy) {#ifdef REGALIGN if (!(regsize & 1)) regsize++;#endif regsize += 5; return(ret); }#ifdef REGALIGN#ifndef lint if (!((long)ret & 1)) *ret++ = 127;#endif#endif ptr = ret; *ptr++ = op; *ptr++ = '\0'; /* Null "next" pointer. */ *ptr++ = '\0';#ifdef REGALIGN *(unsigned short *)(ret+3) = arg;#else ret[3] = arg >> 8; ret[4] = arg & 0377;#endif ptr += 2; regcode = ptr; return(ret);}/* - regc - emit (if appropriate) a byte of code */static voidregc(b)char b;{ if (regcode != ®dummy) *regcode++ = b; else regsize++;}/* - reginsert - insert an operator in front of already-emitted operand * * Means relocating the operand. */static voidreginsert(op, opnd)char op;char *opnd;{ register char *src; register char *dst; register char *place; register offset = (op == CURLY ? 4 : 0); if (regcode == ®dummy) {#ifdef REGALIGN regsize += 4 + offset;#else regsize += 3 + offset;#endif return; } src = regcode;#ifdef REGALIGN regcode += 4 + offset;#else regcode += 3 + offset;#endif dst = regcode; while (src > opnd) *--dst = *--src; place = opnd; /* Op node, where operand used to be. */ *place++ = op; *place++ = '\0'; *place++ = '\0'; while (offset-- > 0) *place++ = '\0';#ifdef REGALIGN *place++ = '\177';#endif}/* - regtail - set the next-pointer at the end of a node chain */static voidregtail(p, val)char *p;char *val;{ register char *scan; register char *temp; register int offset; if (p == ®dummy) return; /* Find last node. */ scan = p; for (;;) { temp = regnext(scan); if (temp == NULL) break; scan = temp; }#ifdef REGALIGN offset = val - scan;#ifndef lint *(short*)(scan+1) = offset;#else offset = offset;#endif#else if (OP(scan) == BACK) offset = scan - val; else offset = val - scan; *(scan+1) = (offset>>8)&0377; *(scan+2) = offset&0377;#endif}/* - regoptail - regtail on operand of first argument; nop if operandless */static voidregoptail(p, val)char *p;char *val;{ /* "Operandless" and "op != BRANCH" are synonymous in practice. */ if (p == NULL || p == ®dummy || OP(p) != BRANCH) return; regtail(NEXTOPER(p), val);}/* - regcurly - a little FSA that accepts {\d+,?\d*} */STATIC intregcurly(s)register char *s;{ if (*s++ != '{') return FALSE; if (!isDIGIT(*s)) return FALSE; while (isDIGIT(*s)) s++; if (*s == ',') s++; while (isDIGIT(*s)) s++; if (*s != '}') return FALSE; return TRUE;}#ifdef DEBUGGING/* - regdump - dump a regexp onto stderr in vaguely comprehensible form */voidregdump(r)regexp *r;{ register char *s; register char op = EXACTLY; /* Arbitrary non-END op. */ register char *next; s = r->program + 1; while (op != END) { /* While that wasn't END last time... */#ifdef REGALIGN if (!((long)s & 1)) s++;#endif op = OP(s); fprintf(stderr,"%2d%s", s-r->program, regprop(s)); /* Where, what. */ next = regnext(s); s += regarglen[op]; if (next == NULL) /* Next ptr. */ fprintf(stderr,"(0)"); else fprintf(stderr,"(%d)", (s-r->program)+(next-s)); s += 3; if (op == ANYOF) { s += 32; } if (op == EXACTLY) { /* Literal string, where present. */ s++; while (*s != '\0') { (void)putchar(*s); s++; } s++; } (void)putchar('\n'); } /* Header fields of interest. */ if (r->regstart) fprintf(stderr,"start `%s' ", r->regstart->str_ptr); if (r->regstclass) fprintf(stderr,"stclass `%s' ", regprop(r->regstclass)); if (r->reganch & ROPT_ANCH) fprintf(stderr,"anchored "); if (r->reganch & ROPT_SKIP) fprintf(stderr,"plus "); if (r->reganch & ROPT_IMPLICIT) fprintf(stderr,"implicit "); if (r->regmust != NULL) fprintf(stderr,"must have \"%s\" back %d ", r->regmust->str_ptr, r->regback); fprintf(stderr, "minlen %d ", r->minlen); fprintf(stderr,"\n");}/* - regprop - printable representation of opcode */char *regprop(op)char *op;{ register char *p; (void) strcpy(buf, ":"); switch (OP(op)) { case BOL: p = "BOL"; break; case EOL: p = "EOL"; break; case ANY: p = "ANY"; break; case ANYOF: p = "ANYOF"; break; case BRANCH: p = "BRANCH"; break; case EXACTLY: p = "EXACTLY"; break; case NOTHING: p = "NOTHING"; break; case BACK: p = "BACK"; break; case END: p = "END"; break; case ALNUM: p = "ALNUM"; break; case NALNUM: p = "NALNUM"; break; case BOUND: p = "BOUND"; break; case NBOUND: p = "NBOUND"; break; case SPACE: p = "SPACE"; break; case NSPACE: p = "NSPACE"; break; case DIGIT: p = "DIGIT"; break; case NDIGIT: p = "NDIGIT"; break; case CURLY: (void)sprintf(buf+strlen(buf), "CURLY {%d,%d}", ARG1(op),ARG2(op)); p = NULL; break; case REF: (void)sprintf(buf+strlen(buf), "REF%d", ARG1(op)); p = NULL; break; case OPEN: (void)sprintf(buf+strlen(buf), "OPEN%d", ARG1(op)); p = NULL; break; case CLOSE: (void)sprintf(buf+strlen(buf), "CLOSE%d", ARG1(op)); p = NULL; break; case STAR: p = "STAR"; break; case PLUS: p = "PLUS"; break; default: FAIL("corrupted regexp opcode"); } if (p != NULL) (void) strcat(buf, p); return(buf);}#endif /* DEBUGGING */voidregfree(r)struct regexp *r;{ if (r->precomp) { Safefree(r->precomp); r->precomp = Nullch; } if (r->subbase) { Safefree(r->subbase); r->subbase = Nullch; } if (r->regmust) { str_free(r->regmust); r->regmust = Nullstr; } if (r->regstart) { str_free(r->regstart); r->regstart = Nullstr; } Safefree(r->startp); Safefree(r->endp); Safefree(r);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -