| 6 |
and semantics are as close as possible to those of the Perl 5 language. |
and semantics are as close as possible to those of the Perl 5 language. |
| 7 |
|
|
| 8 |
Written by Philip Hazel |
Written by Philip Hazel |
| 9 |
Copyright (c) 1997-2009 University of Cambridge |
Copyright (c) 1997-2010 University of Cambridge |
| 10 |
|
|
| 11 |
----------------------------------------------------------------------------- |
----------------------------------------------------------------------------- |
| 12 |
Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
| 57 |
# define PCREPOSIX_EXP_DEFN __declspec(dllexport) |
# define PCREPOSIX_EXP_DEFN __declspec(dllexport) |
| 58 |
#endif |
#endif |
| 59 |
|
|
|
#include "pcre.h" |
|
| 60 |
#include "pcre_internal.h" |
#include "pcre_internal.h" |
| 61 |
#include "pcreposix.h" |
#include "pcreposix.h" |
| 62 |
|
|
| 134 |
REG_INVARG, /* inconsistent NEWLINE options */ |
REG_INVARG, /* inconsistent NEWLINE options */ |
| 135 |
REG_BADPAT, /* \g is not followed followed by an (optionally braced) non-zero number */ |
REG_BADPAT, /* \g is not followed followed by an (optionally braced) non-zero number */ |
| 136 |
REG_BADPAT, /* a numbered reference must not be zero */ |
REG_BADPAT, /* a numbered reference must not be zero */ |
| 137 |
REG_BADPAT, /* (*VERB) with an argument is not supported */ |
REG_BADPAT, /* an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) */ |
| 138 |
/* 60 */ |
/* 60 */ |
| 139 |
REG_BADPAT, /* (*VERB) not recognized */ |
REG_BADPAT, /* (*VERB) not recognized */ |
| 140 |
REG_BADPAT, /* number is too big */ |
REG_BADPAT, /* number is too big */ |
| 142 |
REG_BADPAT, /* digit expected after (?+ */ |
REG_BADPAT, /* digit expected after (?+ */ |
| 143 |
REG_BADPAT, /* ] is an invalid data character in JavaScript compatibility mode */ |
REG_BADPAT, /* ] is an invalid data character in JavaScript compatibility mode */ |
| 144 |
/* 65 */ |
/* 65 */ |
| 145 |
REG_BADPAT /* different names for subpatterns of the same number are not allowed */ |
REG_BADPAT, /* different names for subpatterns of the same number are not allowed */ |
| 146 |
|
REG_BADPAT, /* (*MARK) must have an argument */ |
| 147 |
|
REG_INVARG, /* this version of PCRE is not compiled with PCRE_UCP support */ |
| 148 |
}; |
}; |
| 149 |
|
|
| 150 |
/* Table of texts corresponding to POSIX error codes */ |
/* Table of texts corresponding to POSIX error codes */ |
| 248 |
if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL; |
if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL; |
| 249 |
if ((cflags & REG_NOSUB) != 0) options |= PCRE_NO_AUTO_CAPTURE; |
if ((cflags & REG_NOSUB) != 0) options |= PCRE_NO_AUTO_CAPTURE; |
| 250 |
if ((cflags & REG_UTF8) != 0) options |= PCRE_UTF8; |
if ((cflags & REG_UTF8) != 0) options |= PCRE_UTF8; |
| 251 |
|
if ((cflags & REG_UCP) != 0) options |= PCRE_UCP; |
| 252 |
if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY; |
if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY; |
| 253 |
|
|
| 254 |
preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr, |
preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr, |
| 338 |
else |
else |
| 339 |
{ |
{ |
| 340 |
so = 0; |
so = 0; |
| 341 |
eo = strlen(string); |
eo = (int)strlen(string); |
| 342 |
} |
} |
| 343 |
|
|
| 344 |
rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string + so, (eo - so), |
rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string + so, (eo - so), |
| 345 |
0, options, ovector, nmatch * 3); |
0, options, ovector, (int)(nmatch * 3)); |
| 346 |
|
|
| 347 |
if (rc == 0) rc = nmatch; /* All captured slots were filled in */ |
if (rc == 0) rc = (int)nmatch; /* All captured slots were filled in */ |
| 348 |
|
|
| 349 |
|
/* Successful match */ |
| 350 |
|
|
| 351 |
if (rc >= 0) |
if (rc >= 0) |
| 352 |
{ |
{ |
| 364 |
return 0; |
return 0; |
| 365 |
} |
} |
| 366 |
|
|
| 367 |
else |
/* Unsuccessful match */ |
| 368 |
|
|
| 369 |
|
if (allocated_ovector) free(ovector); |
| 370 |
|
switch(rc) |
| 371 |
{ |
{ |
| 372 |
if (allocated_ovector) free(ovector); |
/* ========================================================================== */ |
| 373 |
switch(rc) |
/* These cases are never obeyed. This is a fudge that causes a compile-time |
| 374 |
{ |
error if the vector eint, which is indexed by compile-time error number, is |
| 375 |
case PCRE_ERROR_NOMATCH: return REG_NOMATCH; |
not the correct length. It seems to be the only way to do such a check at |
| 376 |
case PCRE_ERROR_NULL: return REG_INVARG; |
compile time, as the sizeof() operator does not work in the C preprocessor. |
| 377 |
case PCRE_ERROR_BADOPTION: return REG_INVARG; |
As all the PCRE_ERROR_xxx values are negative, we can use 0 and 1. */ |
| 378 |
case PCRE_ERROR_BADMAGIC: return REG_INVARG; |
|
| 379 |
case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; |
case 0: |
| 380 |
case PCRE_ERROR_NOMEMORY: return REG_ESPACE; |
case (sizeof(eint)/sizeof(int) == ERRCOUNT): |
| 381 |
case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE; |
return REG_ASSERT; |
| 382 |
case PCRE_ERROR_BADUTF8: return REG_INVARG; |
/* ========================================================================== */ |
| 383 |
case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG; |
|
| 384 |
default: return REG_ASSERT; |
case PCRE_ERROR_NOMATCH: return REG_NOMATCH; |
| 385 |
} |
case PCRE_ERROR_NULL: return REG_INVARG; |
| 386 |
|
case PCRE_ERROR_BADOPTION: return REG_INVARG; |
| 387 |
|
case PCRE_ERROR_BADMAGIC: return REG_INVARG; |
| 388 |
|
case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; |
| 389 |
|
case PCRE_ERROR_NOMEMORY: return REG_ESPACE; |
| 390 |
|
case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE; |
| 391 |
|
case PCRE_ERROR_BADUTF8: return REG_INVARG; |
| 392 |
|
case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG; |
| 393 |
|
default: return REG_ASSERT; |
| 394 |
} |
} |
| 395 |
} |
} |
| 396 |
|
|