aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Mikhirev2014-11-14 18:22:10 +0300
committerDmitry Mikhirev2014-11-14 18:22:10 +0300
commit56157c6dbf961d69d1a91a39723d0c68f8f81e82 (patch)
tree173e200f926748cd67dd660c1e90e1e15d8da8c1
parent1f913a978aa1d9c1f797623c414752df15ba36ca (diff)
downloadmake_pcre-56157c6dbf961d69d1a91a39723d0c68f8f81e82.tar.gz
make_pcre-56157c6dbf961d69d1a91a39723d0c68f8f81e82.tar.bz2
make_pcre-56157c6dbf961d69d1a91a39723d0c68f8f81e82.tar.xz
make_pcre-56157c6dbf961d69d1a91a39723d0c68f8f81e82.zip
added options handling, various fixes
-rw-r--r--GNUmakefile34
-rw-r--r--pcre.c58
2 files changed, 77 insertions, 15 deletions
diff --git a/GNUmakefile b/GNUmakefile
index 91d3616..654e76e 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,17 +1,33 @@
--load pcre.so
-
MAKE_INCLUDE_DIR := $(HOME)/src/make-4.1
CFLAGS += -I$(MAKE_INCLUDE_DIR)
+tests = test001 test002
+
+-load pcre.so
+
+.PHONY: check $(tests) clean
+
pcre.so: CFLAGS += $(shell pcre-config --cflags)
pcre.so: LDFLAGS += $(shell pcre-config --libs)
pcre.so: pcre.c
$(CC) $(CFLAGS) -fPIC $(LDFLAGS) -shared -o $@ $<
-ifeq ($(m ^pattern$,pattern), pattern)
-check:
- @echo test PASSED
-else
-check:
- @echo test FAILED
-endif
+check: $(tests)
+
+test001:
+ @if [ '$(m ^test$,test)' = test ] ; then \
+ echo '$@ PASSED'; \
+ else \
+ echo '$@ FAILED'; \
+ fi
+
+test002: var = st
+test002:
+ @if [ '$(m ^te$(var)$$,test,e)' = test ] ; then \
+ echo '$@ PASSED'; \
+ else \
+ echo '$@ FAILED'; \
+ fi
+
+clean:
+ $(RM) *.o *.so
diff --git a/pcre.c b/pcre.c
index d8129ef..ac09257 100644
--- a/pcre.c
+++ b/pcre.c
@@ -10,33 +10,79 @@ const int MAX_CAP = 256;
char *match(const char *name, int argc, char **argv)
{
+ char *pat = NULL;
+ char *p;
+ int co = 0;
pcre *re;
const char *err;
int erroffset;
+ char *str;
int ncap = 0;
int ovec[MAX_CAP*3];
char *retstr = NULL;
- re = pcre_compile(argv[0], 0, &err, &erroffset, NULL);
- if (err != NULL) {
+ if (argc > 2) {
+ for (p = argv[2]; *p != '\0'; p++) {
+ switch (*p) {
+ case 'e':
+ pat = gmk_expand(argv[0]);
+ break;
+ case 'm':
+ co |= PCRE_MULTILINE;
+ break;
+ case 's':
+ co |= PCRE_DOTALL;
+ break;
+ case 'u':
+ co |= PCRE_UCP;
+ break;
+ case 'U':
+ co |= PCRE_UNGREEDY;
+ break;
+ case 'x':
+ co |= PCRE_EXTENDED;
+ break;
+ case 'X':
+ co |= PCRE_EXTRA;
+ break;
+ case '8':
+ co |= PCRE_UTF8;
+ break;
+ default:
+ fprintf(stderr, "%s: unknown option `%c'\n",
+ name, *p);
+ break;
+ }
+ }
+ }
+
+ if (pat == NULL) {
+ re = pcre_compile(argv[0], 0, &err, &erroffset, NULL);
+ } else {
+ re = pcre_compile(pat, 0, &err, &erroffset, NULL);
+ }
+ if (re == NULL) {
fprintf(stderr, "%s: %d: %s\n", name, erroffset, err);
goto end_match;
}
- ncap = pcre_exec(re, NULL, argv[1], strlen(argv[1]), 0, 0, ovec, MAX_CAP*3);
+ str = gmk_expand(argv[1]);
+
+ ncap = pcre_exec(re, NULL, str, strlen(str), 0, 0, ovec, MAX_CAP*3);
+ pcre_free(re);
end_match:
if (ncap) {
int len = ovec[1] - ovec[0];
retstr = gmk_alloc(len + 1);
- strncpy(retstr, argv[1] + ovec[0], len);
- retstr[len + 1] = '\0';
+ strncpy(retstr, str + ovec[0], len);
+ retstr[len] = '\0';
}
return retstr;
}
int pcre_gmk_setup()
{
- gmk_add_function("m", (gmk_func_ptr)match, 2, 2, GMK_FUNC_NOEXPAND);
+ gmk_add_function("m", (gmk_func_ptr)match, 2, 3, GMK_FUNC_NOEXPAND);
return 1;
}