From 56157c6dbf961d69d1a91a39723d0c68f8f81e82 Mon Sep 17 00:00:00 2001 From: Dmitry Mikhirev Date: Fri, 14 Nov 2014 18:22:10 +0300 Subject: added options handling, various fixes --- GNUmakefile | 34 +++++++++++++++++++++++++--------- pcre.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 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; } -- cgit v1.2.1