diff -cr dgd/src/Makefile dgd-patched/src/Makefile *** dgd/src/Makefile Sat Jan 28 08:44:22 1995 --- dgd-patched/src/Makefile Thu Feb 2 22:25:17 1995 *************** *** 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) always 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) always cd comp; $(MAKE) 'DMAKE=$(DMAKE)' 'CC=$(CC)' 'CCFLAGS=$(CCFLAGS)' dgd *************** *** 34,39 **** --- 34,42 ---- always: @rm -f a.out + regex/regex.o: regex/regex.c regex/regex.h + cd regex; ./configure; make regex.o CFLAGS="-O2" + $(BIN)/driver: a.out -mv $(BIN)/driver $(BIN)/driver.old cp a.out $(BIN)/driver *************** *** 89,91 **** --- 92,95 ---- 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-patched/src/config.c *** dgd/src/config.c Sat Jan 28 08:23:57 1995 --- dgd-patched/src/config.c Thu Feb 2 22:25:17 1995 *************** *** 19,24 **** --- 19,25 ---- # include "compile.h" # include "csupport.h" # include "table.h" + # include "rgx.h" typedef struct { char *name; /* name of the option */ *************** *** 395,400 **** --- 396,404 ---- (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-patched/src/kfun/extra.c *** dgd/src/kfun/extra.c Tue Sep 27 09:28:26 1994 --- dgd-patched/src/kfun/extra.c Thu Feb 2 22:25:18 1995 *************** *** 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-patched/src/kfun/kfun.h *** dgd/src/kfun/kfun.h Sun May 8 08:15:01 1994 --- dgd-patched/src/kfun/kfun.h Thu Feb 2 22:25:18 1995 *************** *** 5,7 **** --- 5,8 ---- # include "xfloat.h" # include "interpret.h" # include "data.h" + # include "rgx.h"