/[pcre]/code/trunk/pcreposix.c
ViewVC logotype

Diff of /code/trunk/pcreposix.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 461 by ph10, Mon Oct 5 10:59:35 2009 UTC revision 758 by ph10, Mon Nov 21 12:05:36 2011 UTC
# Line 6  Line 6 
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
# Line 57  previously been set. */ Line 57  previously been set. */
57  #  define PCREPOSIX_EXP_DEFN __declspec(dllexport)  #  define PCREPOSIX_EXP_DEFN __declspec(dllexport)
58  #endif  #endif
59    
60    /* We include pcre.h before pcre_internal.h so that the PCRE library functions
61    are declared as "import" for Windows by defining PCRE_EXP_DECL as "import".
62    This is needed even though pcre_internal.h itself includes pcre.h, because it
63    does so after it has set PCRE_EXP_DECL to "export" if it is not already set. */
64    
65  #include "pcre.h"  #include "pcre.h"
66  #include "pcre_internal.h"  #include "pcre_internal.h"
67  #include "pcreposix.h"  #include "pcreposix.h"
# Line 135  static const int eint[] = { Line 140  static const int eint[] = {
140    REG_INVARG,  /* inconsistent NEWLINE options */    REG_INVARG,  /* inconsistent NEWLINE options */
141    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 */
142    REG_BADPAT,  /* a numbered reference must not be zero */    REG_BADPAT,  /* a numbered reference must not be zero */
143    REG_BADPAT,  /* (*VERB) with an argument is not supported */    REG_BADPAT,  /* an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) */
144    /* 60 */    /* 60 */
145    REG_BADPAT,  /* (*VERB) not recognized */    REG_BADPAT,  /* (*VERB) not recognized */
146    REG_BADPAT,  /* number is too big */    REG_BADPAT,  /* number is too big */
# Line 143  static const int eint[] = { Line 148  static const int eint[] = {
148    REG_BADPAT,  /* digit expected after (?+ */    REG_BADPAT,  /* digit expected after (?+ */
149    REG_BADPAT,  /* ] is an invalid data character in JavaScript compatibility mode */    REG_BADPAT,  /* ] is an invalid data character in JavaScript compatibility mode */
150    /* 65 */    /* 65 */
151    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 */
152      REG_BADPAT,  /* (*MARK) must have an argument */
153      REG_INVARG,  /* this version of PCRE is not compiled with PCRE_UCP support */
154      REG_BADPAT,  /* \c must be followed by an ASCII character */
155      REG_BADPAT,  /* \k is not followed by a braced, angle-bracketed, or quoted name */
156      /* 70 */
157      REG_BADPAT,  /* internal error: unknown opcode in find_fixedlength() */
158      REG_BADPAT,  /* \N is not supported in a class */
159  };  };
160    
161  /* Table of texts corresponding to POSIX error codes */  /* Table of texts corresponding to POSIX error codes */
# Line 247  if ((cflags & REG_NEWLINE) != 0)  option Line 259  if ((cflags & REG_NEWLINE) != 0)  option
259  if ((cflags & REG_DOTALL) != 0)   options |= PCRE_DOTALL;  if ((cflags & REG_DOTALL) != 0)   options |= PCRE_DOTALL;
260  if ((cflags & REG_NOSUB) != 0)    options |= PCRE_NO_AUTO_CAPTURE;  if ((cflags & REG_NOSUB) != 0)    options |= PCRE_NO_AUTO_CAPTURE;
261  if ((cflags & REG_UTF8) != 0)     options |= PCRE_UTF8;  if ((cflags & REG_UTF8) != 0)     options |= PCRE_UTF8;
262    if ((cflags & REG_UCP) != 0)      options |= PCRE_UCP;
263  if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY;  if ((cflags & REG_UNGREEDY) != 0) options |= PCRE_UNGREEDY;
264    
265  preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,  preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,
# Line 336  if ((eflags & REG_STARTEND) != 0) Line 349  if ((eflags & REG_STARTEND) != 0)
349  else  else
350    {    {
351    so = 0;    so = 0;
352    eo = strlen(string);    eo = (int)strlen(string);
353    }    }
354    
355  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),
356    0, options, ovector, nmatch * 3);    0, options, ovector, (int)(nmatch * 3));
357    
358    if (rc == 0) rc = (int)nmatch;    /* All captured slots were filled in */
359    
360  if (rc == 0) rc = nmatch;    /* All captured slots were filled in */  /* Successful match */
361    
362  if (rc >= 0)  if (rc >= 0)
363    {    {
# Line 360  if (rc >= 0) Line 375  if (rc >= 0)
375    return 0;    return 0;
376    }    }
377    
378  else  /* Unsuccessful match */
379    
380    if (allocated_ovector) free(ovector);
381    switch(rc)
382    {    {
383    if (allocated_ovector) free(ovector);  /* ========================================================================== */
384    switch(rc)    /* These cases are never obeyed. This is a fudge that causes a compile-time
385      {    error if the vector eint, which is indexed by compile-time error number, is
386      case PCRE_ERROR_NOMATCH: return REG_NOMATCH;    not the correct length. It seems to be the only way to do such a check at
387      case PCRE_ERROR_NULL: return REG_INVARG;    compile time, as the sizeof() operator does not work in the C preprocessor.
388      case PCRE_ERROR_BADOPTION: return REG_INVARG;    As all the PCRE_ERROR_xxx values are negative, we can use 0 and 1. */
389      case PCRE_ERROR_BADMAGIC: return REG_INVARG;  
390      case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;    case 0:
391      case PCRE_ERROR_NOMEMORY: return REG_ESPACE;    case (sizeof(eint)/sizeof(int) == ERRCOUNT):
392      case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;    return REG_ASSERT;
393      case PCRE_ERROR_BADUTF8: return REG_INVARG;  /* ========================================================================== */
394      case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;  
395      default: return REG_ASSERT;    case PCRE_ERROR_NOMATCH: return REG_NOMATCH;
396      }    case PCRE_ERROR_NULL: return REG_INVARG;
397      case PCRE_ERROR_BADOPTION: return REG_INVARG;
398      case PCRE_ERROR_BADMAGIC: return REG_INVARG;
399      case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
400      case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
401      case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;
402      case PCRE_ERROR_BADUTF8: return REG_INVARG;
403      case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;
404      default: return REG_ASSERT;
405    }    }
406  }  }
407    

Legend:
Removed from v.461  
changed lines
  Added in v.758

  ViewVC Help
Powered by ViewVC 1.1.5