#include "defs.h" #define STRIP 0177 #define MINUS '-' INT match(s, p) REG STRING s, p; { REG INT scc; CHAR c; IF scc = *s++ THEN IF (scc &= STRIP)==0 THEN scc=0200; FI FI SWITCH c = *p++ IN case '[': {BOOL ok; INT lc; ok=0; lc=MAXINT; WHILE c = *p++ DO IF c==']' THEN return(ok?match(s,p):0); ELIF c==MINUS THEN IF lc<=scc ANDF scc<=(*p++) THEN ok++ FI ELSE IF scc==(lc=(c&STRIP)) THEN ok++ FI FI OD return(0); } case '<': {INT a, b, c; INT num, ok=0; INT w=0; p=scanfor(p, &a, ':', &w); p=scanfor(p, &b, ':', &w); p=scanfor(p, &c, '>', &w); if(c<0) { c=b; b=1; } s--; num=0; while(w-->0) { if(digit(*s)) { num *= 10; num += *s++ -48; } else return(0); } while((a<=c) && (ok==0)) { if(num==a) ok++; a+=b; } return(ok?match(s,p):0); } default: IF (c&STRIP)!=scc THEN return(0) FI case '?': return(scc?match(s,p):0); case '*': IF *p==0 THEN return(1) FI --s; WHILE *s DO IF match(s++,p) THEN return(1) FI OD return(0); case 0: return(scc==0); ENDSW } STRING scanfor(s, ia, endch, amax) STRING s; INT *ia; INT *amax; { REG CHAR *cp=s; REG INT n=0; while(digit(*cp)) { n *= 10; n += *cp++ - 48; } *ia=(cp==s?(-1):n); *amax=max(*amax, cp-s); if(*cp==endch) cp++; return(cp); }