|
|
researchv10 Norman
#include "re.h"
#include "lre.h"
#include "hdr.h"
static void traverse(Expr *);
#define MAXLIT 256 /* is plenty big enough */
static unsigned char tmp[MAXLIT], best[MAXLIT];
static unsigned char *p;
static int bestlen;
#define START { p = tmp ; }
#define ADD(c) { if(p >= &tmp[MAXLIT]) p--; *p++ = c; }
#define FINISH { ADD(0) if((p-tmp) > bestlen) memmove((char *)best, (char *)tmp, bestlen = p-tmp); }
re_lit(re_re *r, unsigned char **b, unsigned char **e)
{
bestlen = 0;
START
traverse(r->root);
FINISH
if(bestlen < 3)
return(0);
*b = best;
*e = best+bestlen-1;
return(1);
}
static void
traverse(register Expr *e)
{
switch(e->type)
{
case Literal:
ADD(e->lit)
break;
case Charclass:
if((int)e->l == 1)
ADD(*(char *)e->r)
else {
FINISH
START
}
break;
case Cat:
traverse(e->l);
traverse(e->r);
break;
case Plus:
traverse(e->l);
FINISH /* can't go on past a + */
START /* but we can start with one! */
traverse(e->l);
break;
case EOP:
FINISH
START
traverse(e->l);
break;
default:
FINISH
START
break;
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.