diff -cr dgd/src/Makefile ../dgd/src/Makefile *** dgd/src/Makefile Wed Jul 27 15:18:08 1994 --- ../dgd/src/Makefile Tue Jul 26 01:43:48 1994 *************** *** 14,24 **** BIN= ../bin OBJ= alloc.o error.o hash.o swap.o str.o array.o object.o data.o path.o \ ! ed.o comm.o call_out.o interpret.o config.o dgd.o EDOBJ= alloc.o error.o LEXOBJ= alloc.o hash.o COMPOBJ=alloc.o error.o hash.o path.o str.o array.o object.o data.o \ ! interpret.o config.o a.out: $(OBJ) cd comp; $(MAKE) 'DMAKE=$(DMAKE)' 'CC=$(CC)' 'CCFLAGS=$(CCFLAGS)' dgd --- 14,24 ---- BIN= ../bin OBJ= alloc.o error.o hash.o swap.o str.o array.o object.o data.o path.o \ ! ed.o comm.o call_out.o interpret.o config.o dgd.o rgx.o regex/regex.o EDOBJ= alloc.o error.o LEXOBJ= alloc.o hash.o COMPOBJ=alloc.o error.o hash.o path.o str.o array.o object.o data.o \ ! interpret.o config.o rgx.o regex/regex.o a.out: $(OBJ) cd comp; $(MAKE) 'DMAKE=$(DMAKE)' 'CC=$(CC)' 'CCFLAGS=$(CCFLAGS)' dgd *************** *** 31,36 **** --- 31,39 ---- $(LD) $(LDFLAGS) $(OBJ) `cat comp/dgd` `cat lex/dgd` `cat ed/dgd` \ `cat kfun/dgd` `cat lpc/dgd` `cat host/dgd` $(LIBS) + regex/regex.o: regex/regex.c regex/regex.h + cd regex; ./configure; make regex.o CFLAGS="-g -O2" + $(BIN)/driver: a.out cp a.out $(BIN)/driver *************** *** 88,90 **** --- 91,94 ---- call_out.o config.o dgd.o: call_out.h error.o comm.o call_out.o config.o dgd.o: comm.h config.o: version.h + rgx.o: str.h array.h rgx.h regex/regex.h interpret.h diff -cr dgd/src/config.c ../dgd/src/config.c *** dgd/src/config.c Wed Jul 27 15:20:20 1994 --- ../dgd/src/config.c Sun Jul 24 23:56:10 1994 *************** *** 19,24 **** --- 19,25 ---- # include "compile.h" # include "csupport.h" # include "table.h" + # include "rgx.h" typedef struct { char *name; /* name of the option */ *************** *** 392,397 **** --- 393,401 ---- (int) conf[CALL_STACK].u.num, (int) conf[RESERVED_CSTACK].u.num, conf[CREATE].u.str); + + /* initialize regular expressions */ + rgx_init(); mdynamic(); diff -cr dgd/src/kfun/extra.c ../dgd/src/kfun/extra.c *** dgd/src/kfun/extra.c Sun May 15 18:09:24 1994 --- ../dgd/src/kfun/extra.c Tue Jul 26 21:43:11 1994 *************** *** 560,562 **** --- 560,640 ---- error("Not yet implemented"); } # endif + + + # ifdef FUNCDEF + FUNCDEF("regexp_compile", kf_regexp_compile, p_regexp_compile) + # else + char p_regexp_compile[] = { C_TYPECHECKED | C_STATIC | C_VARARGS | C_LOCAL, + T_STRING | (1 << REFSHIFT), 2, T_STRING, T_INT }; + + /* + * NAME: kfun->regexp_compile() + * DESCRIPTION: compile a regexp pattern + */ + int kf_regexp_compile(nargs) + int nargs; + { + int case_matters; + array *compiled; + + if (nargs < 1) + return -1; + + case_matters = (nargs == 2 ? ! (sp++)->u.number : 1); + + compiled = rgx_new(sp->u.string, case_matters); + + str_del(sp->u.string); + sp->type = T_ARRAY; + arr_ref(sp->u.array = compiled); + + return 0; + } + # endif + + + # ifdef FUNCDEF + FUNCDEF("regexp_match", kf_regexp_match, p_regexp_match) + # else + char p_regexp_match[] = { C_TYPECHECKED | C_STATIC | C_VARARGS | C_LOCAL, + T_INT | (1 << REFSHIFT), 3, + T_STRING | (1 << REFSHIFT), T_STRING, T_INT }; + + /* + * NAME: kfun->regexp_match() + * DESCRIPTION: perform regexp matching with a previously compiled pattern + */ + int kf_regexp_match(nargs) + int nargs; + { + int reverse; + string *subject; + array *compiled, *result; + + if (nargs < 2) + return -1; + + reverse = (nargs == 3 ? (sp++)->u.number : 0); + subject = sp->u.string; + compiled = sp[1].u.array; + + if (compiled->size != 3) + return 1; + + result = rgx_match(d_get_elts(compiled), subject, reverse); + + str_del((sp++)->u.string); + arr_del(sp->u.array); + + if (result == (array *) 0) + { + sp->type = T_INT; + sp->u.number = 0; + } + else + arr_ref(sp->u.array = result); + + return 0; + } + # endif diff -cr dgd/src/kfun/kfun.h ../dgd/src/kfun/kfun.h *** dgd/src/kfun/kfun.h Sun May 8 08:15:01 1994 --- ../dgd/src/kfun/kfun.h Sun Jul 24 23:58:26 1994 *************** *** 5,7 **** --- 5,8 ---- # include "xfloat.h" # include "interpret.h" # include "data.h" + # include "rgx.h"