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 --- pcre.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 6 deletions(-) (limited to 'pcre.c') 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