10 #define _MIRE_INTERNAL
40 if (mire == NULL)
return 0;
41 mire->pattern =
_free(mire->pattern);
43 if (mire->preg != NULL) {
46 if (mire->preg) free(mire->preg);
52 mire->pcre =
_free(mire->pcre);
53 mire->hints =
_free(mire->hints);
66 fprintf(stderr,
"<-- mireClean(%p)\n", mire);
85 if (_mirePool == NULL) {
91 memset(((
char *)mire)+
sizeof(mire->_item), 0,
sizeof(*mire)-
sizeof(mire->_item));
102 if (mire->_item.use != NULL && mire->_item.pool != NULL)
105 if (mire) free(mire);
122 const unsigned char * table)
127 switch (mire->mode) {
136 mire->fnflags = options;
141 mire->cflags = options;
147 mire->coptions = options;
163 mire->offsets = offsets;
165 mire->noffsets = noffsets;
171 mire->offsets = offsets;
173 mire->noffsets = noffsets;
185 #if defined(PCRE_CASELESS)
189 #if defined(FNM_CASEFOLD)
193 #if defined(PCRE_CASELESS)
197 #if defined(FNM_CASEFOLD)
203 #if defined(PCRE_MULTILINE)
207 #if defined(PCRE_MULTILINE)
213 #if defined(PCRE_UTF8)
217 #if defined(PCRE_UTF8)
227 if (newline == NULL) {
229 #if defined(PCRE_CONFIG_NEWLINE)
231 (void)pcre_config(PCRE_CONFIG_NEWLINE, &val);
235 default: newline =
"lf";
break;
236 case '\r': newline =
"cr";
break;
238 case (
'\r' << 8) |
'\n': newline =
"crlf";
break;
240 case -1: newline =
"any";
break;
241 case -2: newline =
"anycrlf";
break;
246 if (!strcasecmp(newline,
"cr")) {
247 #if defined(PCRE_NEWLINE_CR)
251 }
else if (!strcasecmp(newline,
"lf")) {
252 #if defined(PCRE_NEWLINE_LF)
256 }
else if (!strcasecmp(newline,
"crlf")) {
257 #if defined(PCRE_NEWLINE_CRLF)
261 }
else if (!strcasecmp(newline,
"any")) {
262 #if defined(PCRE_NEWLINE_ANY)
266 }
else if (!strcasecmp(newline,
"anycrlf")) {
267 #if defined(PCRE_NEWLINE_ANYCRLF)
280 const char * locale_from = NULL;
284 if (locale == NULL) {
286 locale_from =
"--locale";
294 if ((locale =
getenv(
"LC_ALL")) != NULL)
295 locale_from =
"LC_ALL";
296 else if ((locale =
getenv(
"LC_CTYPE")) != NULL)
297 locale_from =
"LC_CTYPE";
308 if (locale != NULL) {
309 const char * olocale =
setlocale(LC_CTYPE, locale);
310 if (olocale == NULL) {
313 _(
"%s: Failed to set locale %s (obtained from %s)\n"),
318 #if defined(WITH_PCRE)
323 if (
setlocale(LC_CTYPE, olocale) == NULL)
338 mire->pattern =
xstrdup(pattern);
340 switch (mire->mode) {
348 mire->pcre = pcre_compile2(mire->pattern, mire->coptions,
349 &mire->errcode, &mire->errmsg, &mire->erroff, mire->table);
350 if (mire->pcre == NULL) {
353 _(
"pcre_compile2 failed: %s(%d) at offset %d of \"%s\"\n"),
354 mire->errmsg, mire->errcode, mire->erroff, mire->pattern);
364 mire->preg = (regex_t *)
xcalloc(1,
sizeof(*mire->preg));
365 if (mire->cflags == 0)
367 rc = regcomp(mire->preg, mire->pattern, mire->cflags);
370 (void) regerror(rc, mire->preg, msg,
sizeof(msg)-1);
371 msg[
sizeof(msg)-1] =
'\0';
377 if (mire->fnflags == 0)
393 fprintf(stderr,
"<-- mireRegcomp(%p, \"%s\") rc %d\n", mire, pattern, rc);
402 switch (mire->mode) {
404 if (mire->pattern == NULL)
407 vallen = strlen(val);
409 rc = strncmp(mire->pattern, val, vallen);
414 if (mire->preg == NULL)
419 char * t = strncpy(
alloca(vallen+1), val, vallen);
424 vallen = strlen(val);
427 rc = regexec(mire->preg, val,
428 mire->noffsets/3, (regmatch_t *)mire->offsets, mire->eflags);
431 case 0: rc = 0;
break;
432 case REG_NOMATCH: rc = -1;
break;
435 (void) regerror(rc, mire->preg, msg,
sizeof(msg)-1);
436 msg[
sizeof(msg)-1] =
'\0';
438 mire->pattern, msg, rc);
440 if (rc > 0) rc = -(rc+1);
446 if (mire->pcre == NULL)
449 vallen = strlen(val);
450 rc = pcre_exec((pcre *)mire->pcre, (pcre_extra *)mire->hints,
451 val, (
int)vallen, mire->startoff,
452 mire->eoptions, mire->offsets, mire->noffsets);
454 case 0: rc = 0;
break;
455 case PCRE_ERROR_NOMATCH: rc = -1;
break;
466 if (mire->pattern == NULL)
471 char * t = strncpy(
alloca(vallen+1), val, vallen);
475 rc =
fnmatch(mire->pattern, val, mire->fnflags);
477 case 0: rc = 0;
break;
483 if (rc > 0) rc = -(rc+1);
493 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);
500 const unsigned char * table,
miRE * mirep,
int * nmirep)
505 if (*mirep == NULL) {
510 void *pool = (*mirep)->_item.pool;
513 (*mirep) = (
miRE)
xrealloc((*mirep), ((*nmirep) + 1) *
sizeof(*mire));
514 mire = (*mirep) + (*nmirep);
515 memset(mire, 0,
sizeof(*mire));
518 mire->_item.use = use;
519 mire->_item.pool = pool;
532 const unsigned char * table,
miRE * mirep,
int * nmirep)
537 if (patterns != NULL)
538 while ((pattern = *patterns++) != NULL) {
541 int xx =
mireAppend(mode, tag, pattern, table, mirep, nmirep);
561 for (i = 0; i < nmire; mire++, i++) {
565 if (rc < 0 && xx < 0)
567 if (rc > 0 && xx >= 0)
583 for (j = 0; j < nmires; mire++, j++) {
586 #if defined(WITH_PCRE)
587 {
const char * error;
588 mire->hints = pcre_study((pcre *)mire->pcre, 0, &error);
591 if (nmires == 1) s[0] =
'\0';
else sprintf(s,
_(
" number %d"), j);
601 #if defined(WITH_PCRE)