V10/cmd/gre/re.c

#include	"re.h"
#include	"lre.h"
#include	"hdr.h"

re_re *
re_recomp(char *b, char *e, unsigned char *map)
{
	return(egprep(greparse, (unsigned char *)b, (unsigned char *)e, map, 1));
}

re_reexec(re_re *pat, char *b, char *e, char *match[10][2])
{
	unsigned char *mb[10], *me[10], **rb, **re;
	int n, i;

	if(match)
		rb = mb, re = me;
	else
		rb = re = 0;
	n = eg_match(pat, (unsigned char *)b, (unsigned char *)e, rb, re);
	if(match)
		for(i = 0; i < 10; i++){
			match[i][0] = (char *)mb[i];
			match[i][1] = (char *)me[i];
		}
	return(n);
}

static void
freeexpr(register Expr *e)
{
	switch(e->type)
	{
	case Literal:
	case Dot:
	case Carat:
	case Dollar:
		if(e->follow)
			free((char *)e->follow);
		break;
	case Compcharclass:
	case Charclass:
		free((char *)e->r);
		break;
	case Cat:
	case Alternate:
		freeexpr(e->l);
		freeexpr(e->r);
		break;
	case Star:
	case Plus:
	case Quest:
	case Group:
	case EOP:
		freeexpr(e->l);
		break;
	case Backref:
	default:
		break;
	}
}

void
re_refree(re_re *re)
{
	if(re == 0)
		return;
	if(re->posbase)
		free((char *)re->posbase);
	if(re->root)
		freeexpr(re->root);
	if(re->ptr)
		free((char *)re->ptr);
	if(re->states)
		free((char *)re->states);
	/* leave br alone for now; it is hard to get right */
	free((char *)re);
}