From 5ddd691b03d55f150596c6963bcb24cd4d2e719a Mon Sep 17 00:00:00 2001 From: Dmitry Mikhirev Date: Fri, 14 Nov 2014 20:37:31 +0300 Subject: capture strings to variables $(0), $(1), ... --- GNUmakefile | 15 +++++++++++++-- pcre.c | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 654e76e..038399c 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,12 +1,13 @@ MAKE_INCLUDE_DIR := $(HOME)/src/make-4.1 -CFLAGS += -I$(MAKE_INCLUDE_DIR) +CFLAGS = -Wall -tests = test001 test002 +tests = test001 test002 test003 -load pcre.so .PHONY: check $(tests) clean +pcre.so: CFLAGS += -I$(MAKE_INCLUDE_DIR) pcre.so: CFLAGS += $(shell pcre-config --cflags) pcre.so: LDFLAGS += $(shell pcre-config --libs) pcre.so: pcre.c @@ -19,6 +20,7 @@ test001: echo '$@ PASSED'; \ else \ echo '$@ FAILED'; \ + return 1; \ fi test002: var = st @@ -27,6 +29,15 @@ test002: echo '$@ PASSED'; \ else \ echo '$@ FAILED'; \ + return 1; \ + fi + +test003: + @if [ '$(m te(st),test)$0$1' = testtestst -a -z '$(m a,b)$0$1' ] ; then \ + echo '$@ PASSED'; \ + else \ + echo '$@ FAILED'; \ + return 1; \ fi clean: diff --git a/pcre.c b/pcre.c index ac09257..fdd3f24 100644 --- a/pcre.c +++ b/pcre.c @@ -8,6 +8,8 @@ int plugin_is_GPL_compatible; const int MAX_CAP = 256; +static char *mk_resetvars; + char *match(const char *name, int argc, char **argv) { char *pat = NULL; @@ -20,6 +22,7 @@ char *match(const char *name, int argc, char **argv) int ncap = 0; int ovec[MAX_CAP*3]; char *retstr = NULL; + int i; if (argc > 2) { for (p = argv[2]; *p != '\0'; p++) { @@ -56,6 +59,8 @@ char *match(const char *name, int argc, char **argv) } } + gmk_eval(mk_resetvars, NULL); + if (pat == NULL) { re = pcre_compile(argv[0], 0, &err, &erroffset, NULL); } else { @@ -78,11 +83,31 @@ end_match: strncpy(retstr, str + ovec[0], len); retstr[len] = '\0'; } + for (i = 0; i < ncap; i++) { + char c = *(str + ovec[i*2 + 1]); + *(str + ovec[i*2 + 1]) = '\0'; + int len = ovec[i*2 + 1] - ovec[i]; + char mk_set[len + 18]; + sprintf(mk_set, "define %d\n%s\nendef\n", i, str + ovec[i*2]); + *(str + ovec[i*2 + 1]) = c; + gmk_eval(mk_set, NULL); + } return retstr; } int pcre_gmk_setup() { + int i; + + mk_resetvars = malloc(MAX_CAP * 13); + *mk_resetvars = '\0'; + for (i = 0; i < MAX_CAP; i++) { + char line[14]; + sprintf(line, "undefine %d\n", i); + strncat(mk_resetvars, line, 13); + } + + gmk_add_function("pcre_find", (gmk_func_ptr)match, 2, 3, GMK_FUNC_NOEXPAND); gmk_add_function("m", (gmk_func_ptr)match, 2, 3, GMK_FUNC_NOEXPAND); return 1; } -- cgit v1.2.1