123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- #ifdef HAVE_CONFIG_H
- #include "pcre_config.h"
- #endif
- #if defined(_WIN32) && !defined(PCRE_STATIC)
- # define PCREPOSIX_EXP_DECL extern __declspec(dllexport)
- # define PCREPOSIX_EXP_DEFN __declspec(dllexport)
- #endif
- #include "pcre.h"
- #include "pcre_internal.h"
- #include "pcreposix.h"
- static const int eint[] = {
- 0,
- REG_EESCAPE,
- REG_EESCAPE,
- REG_EESCAPE,
- REG_BADBR,
-
- REG_BADBR,
- REG_EBRACK,
- REG_ECTYPE,
- REG_ERANGE,
- REG_BADRPT,
-
- REG_BADRPT,
- REG_ASSERT,
- REG_BADPAT,
- REG_BADPAT,
- REG_EPAREN,
-
- REG_ESUBREG,
- REG_INVARG,
- REG_INVARG,
- REG_EPAREN,
- REG_ESIZE,
-
- REG_ESIZE,
- REG_ESPACE,
- REG_EPAREN,
- REG_ASSERT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_ECTYPE,
- REG_BADPAT,
- REG_INVARG,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_EESCAPE,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_INVARG,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_INVARG,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT,
-
- REG_BADPAT,
- REG_BADPAT,
- REG_BADPAT
- };
- static const char *const pstring[] = {
- "",
- "internal error",
- "invalid repeat counts in {}",
- "pattern error",
- "? * + invalid",
- "unbalanced {}",
- "unbalanced []",
- "collation error - not relevant",
- "bad class",
- "bad escape sequence",
- "empty expression",
- "unbalanced ()",
- "bad range inside []",
- "expression too big",
- "failed to get memory",
- "bad back reference",
- "bad argument",
- "match failed"
- };
- PCREPOSIX_EXP_DEFN size_t PCRE_CALL_CONVENTION
- regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
- {
- const char *message, *addmessage;
- size_t length, addlength;
- message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
- "unknown error code" : pstring[errcode];
- length = strlen(message) + 1;
- addmessage = " at offset ";
- addlength = (preg != NULL && (int)preg->re_erroffset != -1)?
- strlen(addmessage) + 6 : 0;
- if (errbuf_size > 0)
- {
- if (addlength > 0 && errbuf_size >= length + addlength)
- sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset);
- else
- {
- strncpy(errbuf, message, errbuf_size - 1);
- errbuf[errbuf_size-1] = 0;
- }
- }
- return length + addlength;
- }
- PCREPOSIX_EXP_DEFN void PCRE_CALL_CONVENTION
- regfree(regex_t *preg)
- {
- (PUBL(free))(preg->re_pcre);
- }
- PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION
- regcomp(regex_t *preg, const char *pattern, int cflags)
- {
- const char *errorptr;
- int erroffset;
- int errorcode;
- int options = 0;
- int re_nsub = 0;
- if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
- if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
- if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL;
- if ((cflags & REG_NOSUB) != 0) options |= PCRE_NO_AUTO_CAPTURE;
- if ((cflags & REG_UTF8) != 0) options |= PCRE_UTF8;
- if ((cflags & REG_UCP) != 0) options |= PCRE_UCP;
- if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY;
- preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,
- &erroffset, NULL);
- preg->re_erroffset = erroffset;
- if (preg->re_pcre == NULL)
- {
- return (errorcode < (int)(sizeof(eint)/sizeof(const int)))?
- eint[errorcode] : REG_BADPAT;
- }
- (void)pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT,
- &re_nsub);
- preg->re_nsub = (size_t)re_nsub;
- preg->re_erroffset = (size_t)(-1);
- return 0;
- }
- PCREPOSIX_EXP_DEFN int PCRE_CALL_CONVENTION
- regexec(const regex_t *preg, const char *string, size_t nmatch,
- regmatch_t pmatch[], int eflags)
- {
- int rc, so, eo;
- int options = 0;
- int *ovector = NULL;
- int small_ovector[POSIX_MALLOC_THRESHOLD * 3];
- BOOL allocated_ovector = FALSE;
- BOOL nosub =
- (REAL_PCRE_OPTIONS((const pcre *)preg->re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0;
- if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
- if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
- if ((eflags & REG_NOTEMPTY) != 0) options |= PCRE_NOTEMPTY;
- if (nosub || pmatch == NULL) nmatch = 0;
- else if (nmatch > 0)
- {
- if (nmatch <= POSIX_MALLOC_THRESHOLD)
- {
- ovector = &(small_ovector[0]);
- }
- else
- {
- if (nmatch > INT_MAX/(sizeof(int) * 3)) return REG_ESPACE;
- ovector = (int *)malloc(sizeof(int) * nmatch * 3);
- if (ovector == NULL) return REG_ESPACE;
- allocated_ovector = TRUE;
- }
- }
- if ((eflags & REG_STARTEND) != 0)
- {
- if (pmatch == NULL) return REG_INVARG;
- so = pmatch[0].rm_so;
- eo = pmatch[0].rm_eo;
- }
- else
- {
- so = 0;
- eo = (int)strlen(string);
- }
- rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string + so, (eo - so),
- 0, options, ovector, (int)(nmatch * 3));
- if (rc == 0) rc = (int)nmatch;
- if (rc >= 0)
- {
- size_t i;
- if (!nosub)
- {
- for (i = 0; i < (size_t)rc; i++)
- {
- pmatch[i].rm_so = (ovector[i*2] < 0)? -1 : ovector[i*2] + so;
- pmatch[i].rm_eo = (ovector[i*2+1] < 0)? -1: ovector[i*2+1] + so;
- }
- if (allocated_ovector) free(ovector);
- for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
- }
- return 0;
- }
- if (allocated_ovector) free(ovector);
- switch(rc)
- {
-
- case 0:
- case (sizeof(eint)/sizeof(int) == ERRCOUNT):
- return REG_ASSERT;
- case PCRE_ERROR_NOMATCH: return REG_NOMATCH;
- case PCRE_ERROR_NULL: return REG_INVARG;
- case PCRE_ERROR_BADOPTION: return REG_INVARG;
- case PCRE_ERROR_BADMAGIC: return REG_INVARG;
- case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
- case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
- case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;
- case PCRE_ERROR_BADUTF8: return REG_INVARG;
- case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;
- case PCRE_ERROR_BADMODE: return REG_INVARG;
- default: return REG_ASSERT;
- }
- }
|