10 #define _MIRE_INTERNAL
40 if (mire == NULL)
return 0;
43 fprintf(stderr,
"--> mireClean(%p)\n", mire);
45 mire->pattern =
_free(mire->pattern);
47 if (mire->preg != NULL) {
50 mire->preg =
_free(mire->preg);
55 mire->pcre =
_free(mire->pcre);
56 mire->hints =
_free(mire->hints);
84 if (_mirePool == NULL) {
97 for (i = 0; i < nmire; i++)
100 if (mire->_item.use != NULL && mire->_item.pool != NULL) {
102 mire =
xrealloc(mire,
sizeof(*mire));
120 const unsigned char * table)
125 switch (mire->mode) {
134 mire->fnflags = options;
139 mire->cflags = options;
145 mire->coptions = options;
161 mire->offsets = offsets;
163 mire->noffsets = noffsets;
169 mire->offsets = offsets;
171 mire->noffsets = noffsets;
183 #if defined(PCRE_CASELESS)
187 #if defined(FNM_CASEFOLD)
191 #if defined(PCRE_CASELESS)
195 #if defined(FNM_CASEFOLD)
201 #if defined(PCRE_MULTILINE)
205 #if defined(PCRE_MULTILINE)
211 #if defined(PCRE_UTF8)
215 #if defined(PCRE_UTF8)
225 if (newline == NULL) {
227 #if defined(PCRE_CONFIG_NEWLINE)
229 (void)pcre_config(PCRE_CONFIG_NEWLINE, &val);
233 default: newline =
"lf";
break;
234 case '\r': newline =
"cr";
break;
236 case (
'\r' << 8) |
'\n': newline =
"crlf";
break;
238 case -1: newline =
"any";
break;
239 case -2: newline =
"anycrlf";
break;
244 if (!strcasecmp(newline,
"cr")) {
245 #if defined(PCRE_NEWLINE_CR)
249 }
else if (!strcasecmp(newline,
"lf")) {
250 #if defined(PCRE_NEWLINE_LF)
254 }
else if (!strcasecmp(newline,
"crlf")) {
255 #if defined(PCRE_NEWLINE_CRLF)
259 }
else if (!strcasecmp(newline,
"any")) {
260 #if defined(PCRE_NEWLINE_ANY)
264 }
else if (!strcasecmp(newline,
"anycrlf")) {
265 #if defined(PCRE_NEWLINE_ANYCRLF)
278 const char * locale_from = NULL;
282 if (locale == NULL) {
284 locale_from =
"--locale";
292 if ((locale =
getenv(
"LC_ALL")) != NULL)
293 locale_from =
"LC_ALL";
294 else if ((locale =
getenv(
"LC_CTYPE")) != NULL)
295 locale_from =
"LC_CTYPE";
306 if (locale != NULL) {
307 const char * olocale =
setlocale(LC_CTYPE, locale);
308 if (olocale == NULL) {
311 _(
"%s: Failed to set locale %s (obtained from %s)\n"),
316 #if defined(WITH_PCRE)
321 if (
setlocale(LC_CTYPE, olocale) == NULL)
336 mire->pattern =
xstrdup(pattern);
338 switch (mire->mode) {
346 mire->pcre = pcre_compile2(mire->pattern, mire->coptions,
347 &mire->errcode, &mire->errmsg, &mire->erroff, mire->table);
348 if (mire->pcre == NULL) {
351 _(
"pcre_compile2 failed: %s(%d) at offset %d of \"%s\"\n"),
352 mire->errmsg, mire->errcode, mire->erroff, mire->pattern);
362 mire->preg =
xcalloc(1,
sizeof(*mire->preg));
363 if (mire->cflags == 0)
365 rc = regcomp(mire->preg, mire->pattern, mire->cflags);
368 (void) regerror(rc, mire->preg, msg,
sizeof(msg)-1);
369 msg[
sizeof(msg)-1] =
'\0';
375 if (mire->fnflags == 0)
391 fprintf(stderr,
"--> mireRegcomp(%p, \"%s\") rc %d\n", mire, pattern, rc);
400 switch (mire->mode) {
403 rc = strcmp(mire->pattern, val);
410 if (val[vallen] !=
'\0') {
411 char * t = strncpy(
alloca(vallen+1), val, vallen);
418 rc = regexec(mire->preg, val,
419 mire->noffsets/3, (regmatch_t *)mire->offsets, mire->eflags);
422 case 0: rc = 0;
break;
423 case REG_NOMATCH: rc = -1;
break;
426 (void) regerror(rc, mire->preg, msg,
sizeof(msg)-1);
427 msg[
sizeof(msg)-1] =
'\0';
429 mire->pattern, msg, rc);
431 if (rc > 0) rc = -(rc+1);
438 vallen = strlen(val);
439 rc = pcre_exec(mire->pcre, mire->hints, val, (
int)vallen, mire->startoff,
440 mire->eoptions, mire->offsets, mire->noffsets);
442 case 0: rc = 0;
break;
443 case PCRE_ERROR_NOMATCH: rc = -1;
break;
454 rc =
fnmatch(mire->pattern, val, mire->fnflags);
456 case 0: rc = 0;
break;
462 if (rc > 0) rc = -(rc+1);
473 fprintf(stderr,
"--> mireRegexec(%p, %p[%u]) rc %d mode %d \"%.*s\"\n", mire, val, (
unsigned)vallen, rc, mire->mode, (
int)(vallen < 20 ? vallen : 20), val);
480 const unsigned char * table,
miRE * mirep,
int * nmirep)
485 if (*mirep == NULL) {
489 void *use = (*mirep)->_item.use;
490 void *pool = (*mirep)->_item.pool;
493 (*mirep) =
xrealloc((*mirep), ((*nmirep) + 1) *
sizeof(*mire));
494 mire = (*mirep) + (*nmirep);
495 memset(mire, 0,
sizeof(*mire));
498 mire->_item.use = use;
499 mire->_item.pool = pool;
512 const unsigned char * table,
miRE * mirep,
int * nmirep)
517 if (patterns != NULL)
518 while ((pattern = *patterns++) != NULL) {
521 int xx =
mireAppend(mode, tag, pattern, table, mirep, nmirep);
541 for (i = 0; i < nmire; mire++, i++) {
545 if (rc < 0 && xx < 0)
547 if (rc > 0 && xx >= 0)
563 for (j = 0; j < nmires; mire++, j++) {
566 #if defined(WITH_PCRE)
567 {
const char * error;
568 mire->hints = pcre_study(mire->pcre, 0, &error);
571 if (nmires == 1) s[0] =
'\0';
else sprintf(s,
_(
" number %d"), j);
581 #if defined(WITH_PCRE)