aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Mikhirev2014-11-17 14:34:33 +0300
committerDmitry Mikhirev2014-11-17 14:34:33 +0300
commita82fb28ede37a9e81cfca1b99b18c04746bcede5 (patch)
treee282a40f447d1c09115c6e9560adf1d82c42ba74
parent9340c70b0c57f90220f03017337eadfe78eba96f (diff)
downloadmake_pcre-a82fb28ede37a9e81cfca1b99b18c04746bcede5.tar.gz
make_pcre-a82fb28ede37a9e81cfca1b99b18c04746bcede5.tar.bz2
make_pcre-a82fb28ede37a9e81cfca1b99b18c04746bcede5.tar.xz
make_pcre-a82fb28ede37a9e81cfca1b99b18c04746bcede5.zip
code comments
-rw-r--r--GNUmakefile12
-rw-r--r--pcre.c67
2 files changed, 47 insertions, 32 deletions
diff --git a/GNUmakefile b/GNUmakefile
index c4999b2..3557b15 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -14,11 +14,23 @@ pcre.so: pcre.c
check: $(tests)
+
+### TEST EXPRESSIONS ###
+# each expression is passed to test(1)
+
+# simple test for pattern matching
test001 = '$(m ^test$,test)' = test
+
+# test for pattern expansion
test002: var = es
test002 = '$(m ^t$(var)t$$,test,E)' = test
+
+# test for string capturing by number
test003 = '$(m ^t(es)t$,test)$0$1' = testtestes -a -z '$(m a,b)$0$1'
+### END OF TEST EXPRESSIONS ###
+
+
test%:
@if [ $($@) ] ; then \
echo '$@ PASSED'; \
diff --git a/pcre.c b/pcre.c
index aff9a3d..10fe267 100644
--- a/pcre.c
+++ b/pcre.c
@@ -24,53 +24,55 @@
int plugin_is_GPL_compatible;
-const int MAX_CAP = 256;
+const int MAX_CAP = 256; /* maximum number of substrings to capture */
+const int MAX_CAP_LEN = 3; /* number of decimal digits in MAX_CAP */
+/* match() - function to be attached to make pattern matching function */
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 = NULL;
- int ncap = 0;
- int ovec[MAX_CAP*3];
- char *retstr = NULL;
- int i;
+ char *pat = NULL; /* expanded pattern */
+ char *p; /* iteration pointer */
+ int co = 0; /* pattern compilation options */
+ pcre *re; /* compiled regexp */
+ const char *err; /* compilation error */
+ int erroffset; /* offset of pattern character whwre error occured */
+ char *str = NULL; /* expanded subject string */
+ int ncap = 0; /* number of captured substrings */
+ int ovec[MAX_CAP*3]; /* ovector */
+ char *retstr = NULL; /* string to be returned */
+ int i; /* iterator */
- if (argc > 2) {
+ if (argc > 2) { /* options provided, parse them */
for (p = argv[2]; *p != '\0'; p++) {
switch (*p) {
- case 'E':
+ case 'E': /* expand pattern */
pat = gmk_expand(argv[0]);
break;
- case 'i':
+ case 'i': /* ignore case */
co |= PCRE_CASELESS;
break;
- case 'm':
+ case 'm': /* multi-line */
co |= PCRE_MULTILINE;
break;
- case 's':
+ case 's': /* single-line */
co |= PCRE_DOTALL;
break;
- case 'u':
+ case 'u': /* use Unicode properties */
co |= PCRE_UCP;
break;
- case 'U':
+ case 'U': /* ungreedy quantifiers */
co |= PCRE_UNGREEDY;
break;
- case 'x':
+ case 'x': /* extended regexp */
co |= PCRE_EXTENDED;
break;
- case 'X':
+ case 'X': /* PCRE extras */
co |= PCRE_EXTRA;
break;
- case '8':
+ case '8': /* UTF-8 */
co |= PCRE_UTF8;
break;
- default:
+ default: /* unknown option */
fprintf(stderr, "%s: unknown option `%c'\n",
name, *p);
break;
@@ -78,40 +80,40 @@ char *match(const char *name, int argc, char **argv)
}
}
- if (pat == NULL) {
+ if (pat == NULL) { /* compile unexpanded pattern */
re = pcre_compile(argv[0], 0, &err, &erroffset, NULL);
- } else {
+ } else { /* compile expanded pattern */
re = pcre_compile(pat, 0, &err, &erroffset, NULL);
gmk_free(pat);
}
- if (re == NULL) {
+ if (re == NULL) { /* compilation error */
fprintf(stderr, "%s: %d: %s\n", name, erroffset, err);
goto end_match;
}
+ /* expand subject string and execute regexp */
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) {
+ if (ncap) { /* set retstr to matched substring */
int len = ovec[1] - ovec[0];
retstr = gmk_alloc(len + 1);
strncpy(retstr, str + ovec[0], len);
retstr[len] = '\0';
}
- for (i = 0; i < ncap; i++) {
+ for (i = 0; (i < ncap) && (i < MAX_CAP); i++) { /* set make vars to captured substrings */
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];
+ char mk_set[len + MAX_CAP_LEN + 16];
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);
}
- for (; i < MAX_CAP; i++) {
- char mk_set[14];
+ for (; i < MAX_CAP; i++) { /* udefine remaining make vars */
+ char mk_set[MAX_CAP_LEN + 11];
sprintf(mk_set, "undefine %d\n", i);
gmk_eval(mk_set, NULL);
}
@@ -123,6 +125,7 @@ end_match:
int pcre_gmk_setup()
{
+ /* add function for pattern matching */
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;