From 16b9f8816ef373575e437b41d9e0aa8c5ae448e5 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Wed, 12 Dec 2018 21:28:06 -0500 Subject: [PATCH] removed rune-based api --- .gitignore | 1 + Makefile | 2 - rregexec.c | 210 ----------------------------------------------------- rregsub.c | 61 ---------------- 4 files changed, 1 insertion(+), 273 deletions(-) create mode 100644 .gitignore delete mode 100644 rregexec.c delete mode 100644 rregsub.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6e92f57 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +tags diff --git a/Makefile b/Makefile index bad630e..d2636b2 100644 --- a/Makefile +++ b/Makefile @@ -13,8 +13,6 @@ OFILES=\ regexec.$O\ regsub.$O\ regaux.$O\ - rregexec.$O\ - rregsub.$O\ utf.$O\ HFILES=\ diff --git a/rregexec.c b/rregexec.c deleted file mode 100644 index 7ced021..0000000 --- a/rregexec.c +++ /dev/null @@ -1,210 +0,0 @@ -#include "regexp9.h" -#include "regcomp.h" - -/* - * return 0 if no match - * >0 if a match - * <0 if we ran out of _relist space - */ -static int -rregexec1(Reprog *progp, /* program to run */ - Rune *bol, /* string to run machine on */ - Resub *mp, /* subexpression elements */ - int ms, /* number of elements at mp */ - Reljunk *j) -{ - int flag=0; - Reinst *inst; - Relist *tlp; - Rune *s; - int i, checkstart; - Rune r, *rp, *ep; - Relist* tl; /* This list, next list */ - Relist* nl; - Relist* tle; /* ends of this and next list */ - Relist* nle; - int match; - Rune *p; - - match = 0; - checkstart = j->startchar; - if(mp) - for(i=0; irelist[0][0].inst = 0; - j->relist[1][0].inst = 0; - - /* Execute machine once for each character, including terminal NUL */ - s = j->rstarts; - do{ - /* fast check for first char */ - if(checkstart) { - switch(j->starttype) { - case RUNE: - p = runestrchr(s, j->startchar); - if(p == 0 || s == j->reol) - return match; - s = p; - break; - case BOL: - if(s == bol) - break; - p = runestrchr(s, '\n'); - if(p == 0 || s == j->reol) - return match; - s = p+1; - break; - } - } - - r = *s; - - /* switch run lists */ - tl = j->relist[flag]; - tle = j->reliste[flag]; - nl = j->relist[flag^=1]; - nle = j->reliste[flag]; - nl->inst = 0; - - /* Add first instruction to current list */ - _rrenewemptythread(tl, progp->startinst, ms, s); - - /* Execute machine until current list is empty */ - for(tlp=tl; tlp->inst; tlp++){ - 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, ms, &tlp->se)==nle) - return -1; - break; - case LBRA: - tlp->se.m[inst->r.subid].s.rsp = s; - continue; - case RBRA: - tlp->se.m[inst->r.subid].e.rep = s; - continue; - case ANY: - if(r != '\n') - if(_renewthread(nl, inst->l.next, ms, &tlp->se)==nle) - return -1; - break; - case ANYNL: - if(_renewthread(nl, inst->l.next, ms, &tlp->se)==nle) - return -1; - break; - case BOL: - if(s == bol || *(s-1) == '\n') - continue; - break; - case EOL: - if(s == j->reol || 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, ms, &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, ms, &tlp->se)==nle) - return -1; - break; - case OR: - /* evaluate right choice later */ - if(_renewthread(tlp, inst->r.right, ms, &tlp->se) == tle) - return -1; - /* efficiency: advance and re-evaluate */ - continue; - case END: /* Match! */ - match = 1; - tlp->se.m[0].e.rep = s; - if(mp != 0) - _renewmatch(mp, ms, &tlp->se); - break; - } - break; - } - } - if(s == j->reol) - break; - checkstart = j->startchar && nl->inst==0; - s++; - }while(r); - return match; -} - -static int -rregexec2(Reprog *progp, /* program to run */ - Rune *bol, /* string to run machine on */ - Resub *mp, /* subexpression elements */ - int ms, /* number of elements at mp */ - Reljunk *j -) -{ - Relist relist0[5*LISTSIZE], relist1[5*LISTSIZE]; - - /* mark space */ - j->relist[0] = relist0; - j->relist[1] = relist1; - j->reliste[0] = relist0 + nelem(relist0) - 2; - j->reliste[1] = relist1 + nelem(relist1) - 2; - - return rregexec1(progp, bol, mp, ms, j); -} - -extern int -rregexec(Reprog *progp, /* program to run */ - Rune *bol, /* string to run machine on */ - Resub *mp, /* subexpression elements */ - int ms) /* number of elements at mp */ -{ - Reljunk j; - Relist relist0[LISTSIZE], relist1[LISTSIZE]; - int rv; - - /* - * use user-specified starting/ending location if specified - */ - j.rstarts = bol; - j.reol = 0; - if(mp && ms>0){ - if(mp->s.sp) - j.rstarts = mp->s.rsp; - if(mp->e.ep) - j.reol = mp->e.rep; - } - j.starttype = 0; - j.startchar = 0; - if(progp->startinst->type == RUNE && progp->startinst->r.r < Runeself) { - j.starttype = RUNE; - j.startchar = progp->startinst->r.r; - } - if(progp->startinst->type == BOL) - j.starttype = BOL; - - /* mark space */ - j.relist[0] = relist0; - j.relist[1] = relist1; - j.reliste[0] = relist0 + nelem(relist0) - 2; - j.reliste[1] = relist1 + nelem(relist1) - 2; - - rv = rregexec1(progp, bol, mp, ms, &j); - if(rv >= 0) - return rv; - rv = rregexec2(progp, bol, mp, ms, &j); - if(rv >= 0) - return rv; - return -1; -} diff --git a/rregsub.c b/rregsub.c deleted file mode 100644 index 7e2198c..0000000 --- a/rregsub.c +++ /dev/null @@ -1,61 +0,0 @@ -#include "regexp9.h" - -/* substitute into one string using the matches from the last regexec() */ -extern void -rregsub(Rune *sp, /* source string */ - Rune *dp, /* destination string */ - int dlen, - Resub *mp, /* subexpression elements */ - int ms) /* number of elements pointed to by mp */ -{ - Rune *ssp, *ep; - int i; - - ep = dp+(dlen/sizeof(Rune))-1; - while(*sp != '\0'){ - if(*sp == '\\'){ - switch(*++sp){ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - i = *sp-'0'; - if(mp!=0 && mp[i].s.rsp != 0 && ms>i) - for(ssp = mp[i].s.rsp; - ssp < mp[i].e.rep; - ssp++) - if(dp < ep) - *dp++ = *ssp; - break; - case '\\': - if(dp < ep) - *dp++ = '\\'; - break; - case '\0': - sp--; - break; - default: - if(dp < ep) - *dp++ = *sp; - break; - } - }else if(*sp == '&'){ - if(mp!=0 && mp[0].s.rsp != 0 && ms>0) - for(ssp = mp[0].s.rsp; - ssp < mp[0].e.rep; ssp++) - if(dp < ep) - *dp++ = *ssp; - }else{ - if(dp < ep) - *dp++ = *sp; - } - sp++; - } - *dp = '\0'; -} -- 2.52.0