|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 1656 (0x678)
Types: TextFile
Names: »reg.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/vn/reg.c«
/*
** vn news reader.
**
** reg.c - implementation of regex / regcmp on top of UCB library
**
** see copyright disclaimer / history in vn.c source file
*/
#include <stdio.h>
#define RGBLKSIZE 20
struct _regtab
{
struct _regtab *link;
char *regstr;
};
typedef struct _regtab REGTAB;
static REGTAB *Chain = NULL;
static REGTAB *Free = NULL;
static REGTAB *Compiled = NULL;
regfree(s)
char *s;
{
REGTAB *ptr,*cmp,*old;
cmp = (REGTAB *) s;
old = NULL;
for (ptr = Chain; ptr != NULL; ptr = (old = ptr)->link)
{
if (ptr == cmp)
{
if (old == NULL)
Chain = Chain->link;
else
old->link = ptr->link;
ptr->link = Free;
Free = ptr;
break;
}
}
}
char *regcmp(str)
char *str;
{
int i;
char *str_store();
char *re_comp();
if (re_comp(str) != NULL)
{
Compiled = NULL; /* make sure we're OK */
return(NULL);
}
if (Free == NULL)
{
Free = (REGTAB *) malloc(RGBLKSIZE * sizeof(REGTAB));
if (Free == NULL)
printex ("regcmp: memory allocation failure");
for (i = 0; i < RGBLKSIZE - 1; ++i)
Free[i].link = Free + i + 1;
Free[i].link = NULL;
}
Compiled = Free;
Free = Free->link;
Compiled->link = Chain;
Chain = Compiled;
Compiled->regstr = str_store(str);
return ((char *) Compiled);
}
char *regex(reg,str)
char *reg,*str;
{
REGTAB *cmp;
cmp = (REGTAB *) reg;
if (cmp == Compiled)
{
if (re_exec(str))
return(str);
return (NULL);
}
for (Compiled = Chain; Compiled != NULL; Compiled = Compiled->link)
{
if (Compiled == cmp)
break;
}
if (Compiled == NULL)
printex ("regex: bad pointer");
re_comp(Compiled->regstr);
if (re_exec(str))
return(str);
return(NULL);
}