/[pcre]/code/branches/pcre16/pcreposix.c
ViewVC logotype

Diff of /code/branches/pcre16/pcreposix.c

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

revision 76 by nigel, Sat Feb 24 21:40:37 2007 UTC revision 77 by nigel, Sat Feb 24 21:40:45 2007 UTC
# Line 2  Line 2 
2  *      Perl-Compatible Regular Expressions       *  *      Perl-Compatible Regular Expressions       *
3  *************************************************/  *************************************************/
4    
5  /*  /* PCRE is a library of functions to support regular expressions whose syntax
6  This is a library of functions to support regular expressions whose syntax  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. See  
 the file Tech.Notes for some information on the internals.  
   
 This module is a wrapper that provides a POSIX API to the underlying PCRE  
 functions.  
7    
8  Written by: Philip Hazel <ph10@cam.ac.uk>                         Written by Philip Hazel
9               Copyright (c) 1997-2005 University of Cambridge
            Copyright (c) 1997-2004 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 43  POSSIBILITY OF SUCH DAMAGE. Line 37  POSSIBILITY OF SUCH DAMAGE.
37  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
38  */  */
39    
40  #include "internal.h"  
41    /* This module is a wrapper that provides a POSIX API to the underlying PCRE
42    functions. */
43    
44    
45    #include "pcre_internal.h"
46  #include "pcreposix.h"  #include "pcreposix.h"
47  #include "stdlib.h"  #include "stdlib.h"
48    
49    
50    
51  /* Corresponding tables of PCRE error messages and POSIX error codes. */  /* Table to translate PCRE compile time error codes into POSIX error codes. */
   
 static const char *const estring[] = {  
   ERR1,  ERR2,  ERR3,  ERR4,  ERR5,  ERR6,  ERR7,  ERR8,  ERR9,  ERR10,  
   ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20,  
   ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30,  
   ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40,  
   ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47 };  
52    
53  static const int eint[] = {  static const int eint[] = {
54    REG_EESCAPE, /* "\\ at end of pattern" */    0,           /* no error */
55    REG_EESCAPE, /* "\\c at end of pattern" */    REG_EESCAPE, /* \ at end of pattern */
56    REG_EESCAPE, /* "unrecognized character follows \\" */    REG_EESCAPE, /* \c at end of pattern */
57    REG_BADBR,   /* "numbers out of order in {} quantifier" */    REG_EESCAPE, /* unrecognized character follows \ */
58    REG_BADBR,   /* "number too big in {} quantifier" */    REG_BADBR,   /* numbers out of order in {} quantifier */
59    REG_EBRACK,  /* "missing terminating ] for character class" */    REG_BADBR,   /* number too big in {} quantifier */
60    REG_ECTYPE,  /* "invalid escape sequence in character class" */    REG_EBRACK,  /* missing terminating ] for character class */
61    REG_ERANGE,  /* "range out of order in character class" */    REG_ECTYPE,  /* invalid escape sequence in character class */
62    REG_BADRPT,  /* "nothing to repeat" */    REG_ERANGE,  /* range out of order in character class */
63    REG_BADRPT,  /* "operand of unlimited repeat could match the empty string" */    REG_BADRPT,  /* nothing to repeat */
64    REG_ASSERT,  /* "internal error: unexpected repeat" */    REG_BADRPT,  /* operand of unlimited repeat could match the empty string */
65    REG_BADPAT,  /* "unrecognized character after (?" */    REG_ASSERT,  /* internal error: unexpected repeat */
66    REG_BADPAT,  /* "POSIX named classes are supported only within a class" */    REG_BADPAT,  /* unrecognized character after (? */
67    REG_EPAREN,  /* "missing )" */    REG_BADPAT,  /* POSIX named classes are supported only within a class */
68    REG_ESUBREG, /* "reference to non-existent subpattern" */    REG_EPAREN,  /* missing ) */
69    REG_INVARG,  /* "erroffset passed as NULL" */    REG_ESUBREG, /* reference to non-existent subpattern */
70    REG_INVARG,  /* "unknown option bit(s) set" */    REG_INVARG,  /* erroffset passed as NULL */
71    REG_EPAREN,  /* "missing ) after comment" */    REG_INVARG,  /* unknown option bit(s) set */
72    REG_ESIZE,   /* "parentheses nested too deeply" */    REG_EPAREN,  /* missing ) after comment */
73    REG_ESIZE,   /* "regular expression too large" */    REG_ESIZE,   /* parentheses nested too deeply */
74    REG_ESPACE,  /* "failed to get memory" */    REG_ESIZE,   /* regular expression too large */
75    REG_EPAREN,  /* "unmatched brackets" */    REG_ESPACE,  /* failed to get memory */
76    REG_ASSERT,  /* "internal error: code overflow" */    REG_EPAREN,  /* unmatched brackets */
77    REG_BADPAT,  /* "unrecognized character after (?<" */    REG_ASSERT,  /* internal error: code overflow */
78    REG_BADPAT,  /* "lookbehind assertion is not fixed length" */    REG_BADPAT,  /* unrecognized character after (?< */
79    REG_BADPAT,  /* "malformed number after (?(" */    REG_BADPAT,  /* lookbehind assertion is not fixed length */
80    REG_BADPAT,  /* "conditional group containe more than two branches" */    REG_BADPAT,  /* malformed number after (?( */
81    REG_BADPAT,  /* "assertion expected after (?(" */    REG_BADPAT,  /* conditional group containe more than two branches */
82    REG_BADPAT,  /* "(?R or (?digits must be followed by )" */    REG_BADPAT,  /* assertion expected after (?( */
83    REG_ECTYPE,  /* "unknown POSIX class name" */    REG_BADPAT,  /* (?R or (?digits must be followed by ) */
84    REG_BADPAT,  /* "POSIX collating elements are not supported" */    REG_ECTYPE,  /* unknown POSIX class name */
85    REG_INVARG,  /* "this version of PCRE is not compiled with PCRE_UTF8 support" */    REG_BADPAT,  /* POSIX collating elements are not supported */
86    REG_BADPAT,  /* "spare error" */    REG_INVARG,  /* this version of PCRE is not compiled with PCRE_UTF8 support */
87    REG_BADPAT,  /* "character value in \x{...} sequence is too large" */    REG_BADPAT,  /* spare error */
88    REG_BADPAT,  /* "invalid condition (?(0)" */    REG_BADPAT,  /* character value in \x{...} sequence is too large */
89    REG_BADPAT,  /* "\\C not allowed in lookbehind assertion" */    REG_BADPAT,  /* invalid condition (?(0) */
90    REG_EESCAPE, /* "PCRE does not support \\L, \\l, \\N, \\U, or \\u" */    REG_BADPAT,  /* \C not allowed in lookbehind assertion */
91    REG_BADPAT,  /* "number after (?C is > 255" */    REG_EESCAPE, /* PCRE does not support \L, \l, \N, \U, or \u */
92    REG_BADPAT,  /* "closing ) for (?C expected" */    REG_BADPAT,  /* number after (?C is > 255 */
93    REG_BADPAT,  /* "recursive call could loop indefinitely" */    REG_BADPAT,  /* closing ) for (?C expected */
94    REG_BADPAT,  /* "unrecognized character after (?P" */    REG_BADPAT,  /* recursive call could loop indefinitely */
95    REG_BADPAT,  /* "syntax error after (?P" */    REG_BADPAT,  /* unrecognized character after (?P */
96    REG_BADPAT,  /* "two named groups have the same name" */    REG_BADPAT,  /* syntax error after (?P */
97    REG_BADPAT,  /* "invalid UTF-8 string" */    REG_BADPAT,  /* two named groups have the same name */
98    REG_BADPAT,  /* "support for \\P, \\p, and \\X has not been compiled" */    REG_BADPAT,  /* invalid UTF-8 string */
99    REG_BADPAT,  /* "malformed \\P or \\p sequence" */    REG_BADPAT,  /* support for \P, \p, and \X has not been compiled */
100    REG_BADPAT   /* "unknown property name after \\P or \\p" */    REG_BADPAT,  /* malformed \P or \p sequence */
101      REG_BADPAT   /* unknown property name after \P or \p */
102  };  };
103    
104  /* Table of texts corresponding to POSIX error codes */  /* Table of texts corresponding to POSIX error codes */
# Line 135  static const char *const pstring[] = { Line 128  static const char *const pstring[] = {
128    
129    
130  /*************************************************  /*************************************************
 *          Translate PCRE text code to int       *  
 *************************************************/  
   
 /* PCRE compile-time errors are given as strings defined as macros. We can just  
 look them up in a table to turn them into POSIX-style error codes. */  
   
 static int  
 pcre_posix_error_code(const char *s)  
 {  
 size_t i;  
 for (i = 0; i < sizeof(estring)/sizeof(char *); i++)  
   if (strcmp(s, estring[i]) == 0) return eint[i];  
 return REG_ASSERT;  
 }  
   
   
   
 /*************************************************  
131  *          Translate error code to string        *  *          Translate error code to string        *
132  *************************************************/  *************************************************/
133    
# Line 219  regcomp(regex_t *preg, const char *patte Line 194  regcomp(regex_t *preg, const char *patte
194  {  {
195  const char *errorptr;  const char *errorptr;
196  int erroffset;  int erroffset;
197    int errorcode;
198  int options = 0;  int options = 0;
199    
200  if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;  if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
201  if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;  if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
202    if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL;
203    
204  preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);  preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,
205      &erroffset, NULL);
206  preg->re_erroffset = erroffset;  preg->re_erroffset = erroffset;
207    
208  if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr);  if (preg->re_pcre == NULL) return eint[errorcode];
209    
210  preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);  preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
211  return 0;  return 0;

Legend:
Removed from v.76  
changed lines
  Added in v.77

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12