diff options
Diffstat (limited to 'pcre.c')
| -rw-r--r-- | pcre.c | 101 | 
1 files changed, 50 insertions, 51 deletions
| @@ -27,6 +27,52 @@ int plugin_is_GPL_compatible;  const int MAX_CAP = 256;   /* maximum number of substrings to capture */  const int MAX_CAP_LEN = 3; /* number of decimal digits in MAX_CAP */ +/* set_comp_opt - set regexp option */ +int set_comp_opt(int opts, const char flag, const char *func) +{ +	int b; /* PCRE configuration option value */ + +	switch (flag) { +	case 'i': /* ignore case */ +		opts |= PCRE_CASELESS;  break; +	case 'm': /* multi-line */ +		opts |= PCRE_MULTILINE; break; +	case 's': /* single-line */ +		opts |= PCRE_DOTALL;    break; +	case 'u': /* use Unicode properties */ +		pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &b); +		if (b) { +			opts |= PCRE_UCP; +		} else { +			fprintf(stderr, "%s: PCRE library does not support " +					"Unicode properties, `%c' option is " +					"unavailable\n", +					func, flag); +		} +		break; +	case 'U': /* ungreedy quantifiers */ +		opts |= PCRE_UNGREEDY;  break; +	case 'x': /* extended regexp */ +		opts |= PCRE_EXTENDED;  break; +	case 'X': /* PCRE extras */ +		opts |= PCRE_EXTRA;     break; +	case '8': /* UTF-8 */ +		pcre_config(PCRE_CONFIG_UTF8, &b); +		if (b) { +			opts |= PCRE_UTF8; +		} else { +			fprintf(stderr, "%s: PCRE library does not support " +					"UTF-8, `%c' option is unavailable\n", +					func, flag); +		} +		break; +	default: /* unknown option */ +		fprintf(stderr, "%s: unknown option `%c'\n", func, flag); +		break; +	} +	return opts; +} +  /* set_vars() - set make variables to captured substrings */  int set_vars(const char *subj, int *ovec, const int ncap)  { @@ -89,7 +135,6 @@ 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 where error occured */ @@ -104,63 +149,17 @@ char *match(const char *name, int argc, char **argv)  			case 'E': /* expand pattern */  				pat = gmk_expand(argv[0]);  				break; -			case 'i': /* ignore case */ -				co |= PCRE_CASELESS; -				break; -			case 'm': /* multi-line */ -				co |= PCRE_MULTILINE; -				break; -			case 's': /* single-line */ -				co |= PCRE_DOTALL; -				break; -			case 'u': /* use Unicode properties */ -				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; -				break; -			case 'x': /* extended regexp */ -				co |= PCRE_EXTENDED; -				break; -			case 'X': /* PCRE extras */ -				co |= PCRE_EXTRA; -				break; -			case '8': /* UTF-8 */ -				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", -						name, *p); +			default: /* not match specific option */ +				co = set_comp_opt(co, *p, name);  				break;  			}  		}  	}  	if (pat == NULL) { /* compile unexpanded pattern */ -		re = pcre_compile(argv[0], 0, &err, &erroffset, NULL); +		re = pcre_compile(argv[0], co, &err, &erroffset, NULL);  	} else {           /* compile expanded pattern */ -		re = pcre_compile(pat, 0, &err, &erroffset, NULL); +		re = pcre_compile(pat, co, &err, &erroffset, NULL);  		gmk_free(pat);  	}  	if (re == NULL) { /* compilation error */ | 
