aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Mikhirev2014-11-14 20:37:31 +0300
committerDmitry Mikhirev2014-11-14 20:37:31 +0300
commit5ddd691b03d55f150596c6963bcb24cd4d2e719a (patch)
tree72bae616c74e2ba63b3645a99475070cc852ebf8
parent56157c6dbf961d69d1a91a39723d0c68f8f81e82 (diff)
downloadmake_pcre-5ddd691b03d55f150596c6963bcb24cd4d2e719a.tar.gz
make_pcre-5ddd691b03d55f150596c6963bcb24cd4d2e719a.tar.bz2
make_pcre-5ddd691b03d55f150596c6963bcb24cd4d2e719a.tar.xz
make_pcre-5ddd691b03d55f150596c6963bcb24cd4d2e719a.zip
capture strings to variables $(0), $(1), ...
-rw-r--r--GNUmakefile15
-rw-r--r--pcre.c25
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;
}