aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Mikhirev2014-11-17 19:31:51 +0300
committerDmitry Mikhirev2014-11-17 19:31:51 +0300
commitd09171fe28b0b29f90cdf3fe2ebe03c39365cddd (patch)
tree8a7e23d2cb52a62e30bedaee061d1dbdad9b02e6
parenta82fb28ede37a9e81cfca1b99b18c04746bcede5 (diff)
downloadmake_pcre-d09171fe28b0b29f90cdf3fe2ebe03c39365cddd.tar.gz
make_pcre-d09171fe28b0b29f90cdf3fe2ebe03c39365cddd.tar.bz2
make_pcre-d09171fe28b0b29f90cdf3fe2ebe03c39365cddd.tar.xz
make_pcre-d09171fe28b0b29f90cdf3fe2ebe03c39365cddd.zip
handle some possible errors
-rw-r--r--pcre.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/pcre.c b/pcre.c
index 10fe267..ab4a30e 100644
--- a/pcre.c
+++ b/pcre.c
@@ -33,9 +33,10 @@ char *match(const char *name, int argc, char **argv)
char *pat = NULL; /* expanded pattern */
char *p; /* iteration pointer */
int co = 0; /* pattern compilation options */
+ int b; /* PCRE configuration option value */
pcre *re; /* compiled regexp */
const char *err; /* compilation error */
- int erroffset; /* offset of pattern character whwre error occured */
+ int erroffset; /* offset of pattern character where error occured */
char *str = NULL; /* expanded subject string */
int ncap = 0; /* number of captured substrings */
int ovec[MAX_CAP*3]; /* ovector */
@@ -58,7 +59,18 @@ char *match(const char *name, int argc, char **argv)
co |= PCRE_DOTALL;
break;
case 'u': /* use Unicode properties */
- co |= PCRE_UCP;
+ pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES,
+ &b);
+ if (b) {
+ co |= PCRE_UCP;
+ } else {
+ fprintf(stderr, "%s: PCRE library "
+ "does not support "
+ "Unicode properties, "
+ "`%c' option is "
+ "unavailable\n",
+ name, *p);
+ }
break;
case 'U': /* ungreedy quantifiers */
co |= PCRE_UNGREEDY;
@@ -70,7 +82,17 @@ char *match(const char *name, int argc, char **argv)
co |= PCRE_EXTRA;
break;
case '8': /* UTF-8 */
- co |= PCRE_UTF8;
+ pcre_config(PCRE_CONFIG_UTF8, &b);
+ if (b) {
+ co |= PCRE_UTF8;
+ } else {
+ fprintf(stderr, "%s: PCRE library "
+ "does not support "
+ "UTF-8, "
+ "`%c' option is "
+ "unavailable\n",
+ name, *p);
+ }
break;
default: /* unknown option */
fprintf(stderr, "%s: unknown option `%c'\n",
@@ -95,9 +117,12 @@ char *match(const char *name, int argc, char **argv)
str = gmk_expand(argv[1]);
ncap = pcre_exec(re, NULL, str, strlen(str), 0, 0, ovec, MAX_CAP*3);
pcre_free(re);
+ if (ncap < 0) { /* error occured */
+ fprintf(stderr, "%s: pattern matching error: %d\n", name, ncap);
+ }
end_match:
- if (ncap) { /* set retstr to matched substring */
+ if (ncap > 0) { /* set retstr to matched substring */
int len = ovec[1] - ovec[0];
retstr = gmk_alloc(len + 1);
strncpy(retstr, str + ovec[0], len);