summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/regexp/regexec.c
diff options
context:
space:
mode:
authorben <ben@rana>2016-04-27 07:52:41 -0500
committerben <ben@rana>2016-04-27 07:52:41 -0500
commit85824350b5f65053053245d141aaf7d668089d28 (patch)
tree075fe72eef40032c692d31194b2faac58eec5d18 /sys/src/ape/lib/regexp/regexec.c
parent0f8168038af32828fcdc39575dea0e4de0c01122 (diff)
remove ape regexp library, add utility for awk native port
Diffstat (limited to 'sys/src/ape/lib/regexp/regexec.c')
-rw-r--r--sys/src/ape/lib/regexp/regexec.c191
1 files changed, 0 insertions, 191 deletions
diff --git a/sys/src/ape/lib/regexp/regexec.c b/sys/src/ape/lib/regexp/regexec.c
deleted file mode 100644
index dee888b09..000000000
--- a/sys/src/ape/lib/regexp/regexec.c
+++ /dev/null
@@ -1,191 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include "regexp.h"
-#include "regcomp.h"
-
-static Resublist sempty; /* empty set of matches */
-
-/*
- * return 0 if no match
- * >0 if a match
- * <0 if we ran out of _relist space
- */
-static int
-regexec1(Reprog *progp, /* program to run */
- char *bol, /* string to run machine on */
- Resub *mp, /* subexpression elements */
- int ms, /* number of elements at mp */
- char *starts,
- char *eol,
- wchar_t startchar)
-{
- int flag=0;
- Reinst *inst;
- Relist *tlp;
- char *s;
- int i, checkstart;
- wchar_t r, *rp, *ep;
- int n;
- Relist* tl; /* This list, next list */
- Relist* nl;
- Relist* tle; /* ends of this and next list */
- Relist* nle;
- int match;
-
- match = 0;
- checkstart = startchar;
- sempty.m[0].s.sp = 0;
- if(mp!=0)
- for(i=0; i<ms; i++)
- mp[i].s.sp = mp[i].e.ep = 0;
- _relist[0][0].inst = _relist[1][0].inst = 0;
-
- /* Execute machine once for each character, including terminal NUL */
- s = starts;
- do{
- /* fast check for first char */
- r = *(unsigned char*)s;
- if(checkstart && r != startchar){
- s++;
- continue;
- }
-
- if(r < Runeself)
- n = 1;
- else {
- n = mbtowc(&r, s, MB_CUR_MAX);
- if (n <= 0)
- n = 1;
- }
-
- /* switch run lists */
- tl = _relist[flag];
- tle = _reliste[flag];
- nl = _relist[flag^=1];
- nle = _reliste[flag];
- nl->inst = 0;
-
- /* Add first instruction to current list */
- if(match == 0){
- sempty.m[0].s.sp = s;
- _renewthread(tl, progp->startinst, &sempty);
- }
-
- /* Execute machine until current list is empty */
- for(tlp=tl; tlp->inst; tlp++){ /* assignment = */
- if(s == eol)
- break;
-
- for(inst = tlp->inst; ; inst = inst->l.next){
- switch(inst->type){
- case RUNE: /* regular character */
- if(inst->r.r == r)
- if(_renewthread(nl, inst->l.next, &tlp->se)==nle)
- return -1;
- break;
- case LBRA:
- tlp->se.m[inst->r.subid].s.sp = s;
- continue;
- case RBRA:
- tlp->se.m[inst->r.subid].e.ep = s;
- continue;
- case ANY:
- if(r != '\n')
- if(_renewthread(nl, inst->l.next, &tlp->se)==nle)
- return -1;
- break;
- case ANYNL:
- if(_renewthread(nl, inst->l.next, &tlp->se)==nle)
- return -1;
- break;
- case BOL:
- if(s == bol || *(s-1) == '\n')
- continue;
- break;
- case EOL:
- if(r == 0 || r == '\n')
- continue;
- break;
- case CCLASS:
- ep = inst->r.cp->end;
- for(rp = inst->r.cp->spans; rp < ep; rp += 2)
- if(r >= rp[0] && r <= rp[1]){
- if(_renewthread(nl, inst->l.next, &tlp->se)==nle)
- return -1;
- break;
- }
- break;
- case NCCLASS:
- ep = inst->r.cp->end;
- for(rp = inst->r.cp->spans; rp < ep; rp += 2)
- if(r >= rp[0] && r <= rp[1])
- break;
- if(rp == ep)
- if(_renewthread(nl, inst->l.next, &tlp->se)==nle)
- return -1;
- break;
- case OR:
- /* evaluate right choice later */
- if(_renewthread(tlp, inst->r.right, &tlp->se) == tle)
- return -1;
- /* efficiency: advance and re-evaluate */
- continue;
- case END: /* Match! */
- match = 1;
- tlp->se.m[0].e.ep = s;
- if(mp != 0)
- _renewmatch(mp, ms, &tlp->se);
- break;
- }
- break;
- }
- }
- checkstart = startchar && nl->inst==0;
- s += n;
- }while(r);
- return match;
-}
-
-extern int
-regexec(Reprog *progp, /* program to run */
- char *bol, /* string to run machine on */
- Resub *mp, /* subexpression elements */
- int ms) /* number of elements at mp */
-{
- char *starts; /* where to start match */
- char *eol; /* where to end match */
- wchar_t startchar;
- int rv;
-
- /*
- * use user-specified starting/ending location if specified
- */
- starts = bol;
- eol = 0;
- if(mp && ms>0){
- if(mp->s.sp)
- starts = mp->s.sp;
- if(mp->e.ep)
- eol = mp->e.ep;
- }
- startchar = (progp->startinst->type == RUNE && progp->startinst->r.r < Runeself)
- ? progp->startinst->r.r : 0;
-
- /* keep trying till we have enough list space to terminate */
- for(;;){
- if(_relist[0] == 0){
- _relist[0] = malloc(2*_relistsize*sizeof(Relist));
- _relist[1] = _relist[0] + _relistsize;
- _reliste[0] = _relist[0] + _relistsize - 1;
- _reliste[1] = _relist[1] + _relistsize - 1;
- if(_relist[0] == 0)
- regerror("_relist overflow");
- }
- rv = regexec1(progp, bol, mp, ms, starts, eol, startchar);
- if(rv >= 0)
- return rv;
- free(_relist[0]);
- _relist[0] = 0;
- _relistsize += LISTINCREMENT;
- }
-}