/********************************************************************** * Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. * * All Rights Reserved. * * Reference "/usr/src/COPYRIGHT" for applicable restrictions. * **********************************************************************/ #define SSIZE 50 #define TGRP 48 #define A256 02 #define ZERO 01 #define NBRA 10 #define CIRCFL 32; #define SLOP 5 #define EOF 0 #define CBRA 60 #define GRP 40 #define SGRP 56 static char Sccsid[] = "@(#)regcmp.c 3.0 4/22/86"; #define PGRP 68 #define EGRP 44 #define RNGE 03 #define CCHR 20 #define CDOT 64 #define CCL 24 #define NCCL 8 #define CDOL 28 #define CEOF 52 #define CKET 12 #define STAR 01 #define PLUS 02 #define MINUS 16 int *__sp_; char *__stmax; int __i_size; char * regcmp(cs1,cs2,cs3,cs4,cs5,cs6,cs7,cs8,cs9,cs10) char *cs1,*cs2,*cs3,*cs4,*cs5,*cs6,*cs7,*cs8,*cs9,*cs10; { register c; register char *ep, *sp; int *adx; int i,cflg; char *lastep, *sep, *eptr; char bracket[NBRA], *bracketp; int nbra,ngrp; int cclcnt; char stack[SSIZE]; __sp_ = (int *)stack; *__sp_ = -1; __stmax = &stack[SSIZE]; adx = (int *)&cs1; i = nbra = ngrp = 0; while(*adx) i += __size(*adx++); adx = (int *)&cs1; sp = (char *)*adx++; if((sep = ep = (char *)malloc(2*i+SLOP)) == (char *)0) return(0); bracketp = bracket; if ((c = *sp++) == EOF) goto cerror; if (c=='^') { c = *sp++; *ep++ = CIRCFL; } if ((c=='*') || (c=='+') || (c=='{')) goto cerror; sp--; for (;;) { if ((c = *sp++) == EOF) { if (*adx) { sp = (char *)*adx++; continue; } *ep++ = CEOF; if (--nbra > NBRA || *__sp_ != -1) goto cerror; __i_size = ep - sep; return(sep); } if ((c!='*') && (c!='{') && (c!='+')) lastep = ep; switch (c) { case '(': if (!__rpush(ep)) goto cerror; *ep++ = CBRA; *ep++ = -1; continue; case ')': if (!(eptr=(char *)__rpop())) goto cerror; if ((c = *sp++) == '$') { if ('0' > (c = *sp++) || c > '9') goto cerror; *ep++ = CKET; *ep++ = *++eptr = nbra++; *ep++ = (c-'0'); continue; } *ep++ = EGRP; *ep++ = ngrp++; sp--; switch (c) { case '+': *eptr = PGRP; break; case '*': *eptr = SGRP; break; case '{': *eptr = TGRP; break; default: *eptr = GRP; continue; } i = ep - eptr - 2; for (cclcnt = 0; i >= 256; cclcnt++) i -= 256; if (cclcnt > 3) goto cerror; *eptr |= cclcnt; *++eptr = i; continue; case '\\': *ep++ = CCHR; if ((c = *sp++) == EOF) goto cerror; *ep++ = c; continue; case '{': *lastep |= RNGE; cflg = 0; nlim: if ((c = *sp++) == '}') goto cerror; i = 0; do { if ('0' <= c && c <= '9') i = (i*10+(c-'0')); else goto cerror; } while (((c = *sp++) != '}') && (c != ',')); if (i>255) goto cerror; *ep++ = i; if (c==',') { if (cflg++) goto cerror; if((c = *sp++) == '}') { *ep++ = -1; continue; } else { sp--; goto nlim; } } if (!cflg) *ep++ = i; else if ((ep[-1]&0377) < (ep[-2]&0377)) goto cerror; continue; case '.': *ep++ = CDOT; continue; case '+': if (*lastep==CBRA || *lastep==CKET) goto cerror; *lastep |= PLUS; continue; case '*': if (*lastep==CBRA || *lastep==CKET) goto cerror; *lastep |= STAR; continue; case '$': if ((*sp != EOF) || (*adx)) goto defchar; *ep++ = CDOL; continue; case '[': *ep++ = CCL; *ep++ = 0; cclcnt = 1; if ((c = *sp++) == '^') { c = *sp++; ep[-2] = NCCL; } do { if (c==EOF) goto cerror; if ((c=='-') && (cclcnt>1) && (*sp!=']')) { *ep++ = ep[-1]; ep[-2] = MINUS; cclcnt++; continue; } *ep++ = c; cclcnt++; } while ((c = *sp++) != ']'); lastep[1] = cclcnt; continue; defchar: default: *ep++ = CCHR; *ep++ = c; } } cerror: free(sep); return(0); } __size(strg) char *strg; { int i; i = 1; while(*strg++) i++; return(i); } __rpop() { return (*__sp_ == -1)?0:*__sp_--; } __rpush(ptr) char *ptr; { if (++__sp_ > (int *)__stmax) return(0); *__sp_ = (int)ptr; return(1); }