| 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-2005 University of Cambridge |
Copyright (c) 1997-2009 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 |
| 39 |
|
|
| 40 |
|
|
| 41 |
/* This module contains an internal function that is used to match an extended |
/* This module contains an internal function that is used to match an extended |
| 42 |
class (one that contains characters whose values are > 255). It is used by both |
class. It is used by both pcre_exec() and pcre_def_exec(). */ |
|
pcre_exec() and pcre_def_exec(). */ |
|
| 43 |
|
|
| 44 |
|
|
| 45 |
|
#ifdef HAVE_CONFIG_H |
| 46 |
|
#include "config.h" |
| 47 |
|
#endif |
| 48 |
|
|
| 49 |
#include "pcre_internal.h" |
#include "pcre_internal.h" |
| 50 |
|
|
| 51 |
|
|
| 54 |
*************************************************/ |
*************************************************/ |
| 55 |
|
|
| 56 |
/* This function is called to match a character against an extended class that |
/* This function is called to match a character against an extended class that |
| 57 |
might contain values > 255. |
might contain values > 255 and/or Unicode properties. |
| 58 |
|
|
| 59 |
Arguments: |
Arguments: |
| 60 |
c the character |
c the character |
| 63 |
Returns: TRUE if character matches, else FALSE |
Returns: TRUE if character matches, else FALSE |
| 64 |
*/ |
*/ |
| 65 |
|
|
| 66 |
PCRE_EXPORT BOOL |
BOOL |
| 67 |
_pcre_xclass(int c, const uschar *data) |
_pcre_xclass(int c, const uschar *data) |
| 68 |
{ |
{ |
| 69 |
int t; |
int t; |
| 103 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
| 104 |
else /* XCL_PROP & XCL_NOTPROP */ |
else /* XCL_PROP & XCL_NOTPROP */ |
| 105 |
{ |
{ |
| 106 |
int chartype, othercase; |
const ucd_record *prop = GET_UCD(c); |
| 107 |
int rqdtype = *data++; |
|
| 108 |
int category = _pcre_ucp_findchar(c, &chartype, &othercase); |
switch(*data) |
|
if (rqdtype >= 128) |
|
|
{ |
|
|
if ((rqdtype - 128 == category) == (t == XCL_PROP)) return !negated; |
|
|
} |
|
|
else |
|
| 109 |
{ |
{ |
| 110 |
if ((rqdtype == chartype) == (t == XCL_PROP)) return !negated; |
case PT_ANY: |
| 111 |
|
if (t == XCL_PROP) return !negated; |
| 112 |
|
break; |
| 113 |
|
|
| 114 |
|
case PT_LAMP: |
| 115 |
|
if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt) == |
| 116 |
|
(t == XCL_PROP)) return !negated; |
| 117 |
|
break; |
| 118 |
|
|
| 119 |
|
case PT_GC: |
| 120 |
|
if ((data[1] == _pcre_ucp_gentype[prop->chartype]) == (t == XCL_PROP)) return !negated; |
| 121 |
|
break; |
| 122 |
|
|
| 123 |
|
case PT_PC: |
| 124 |
|
if ((data[1] == prop->chartype) == (t == XCL_PROP)) return !negated; |
| 125 |
|
break; |
| 126 |
|
|
| 127 |
|
case PT_SC: |
| 128 |
|
if ((data[1] == prop->script) == (t == XCL_PROP)) return !negated; |
| 129 |
|
break; |
| 130 |
|
|
| 131 |
|
/* This should never occur, but compilers may mutter if there is no |
| 132 |
|
default. */ |
| 133 |
|
|
| 134 |
|
default: |
| 135 |
|
return FALSE; |
| 136 |
} |
} |
| 137 |
|
|
| 138 |
|
data += 2; |
| 139 |
} |
} |
| 140 |
#endif /* SUPPORT_UCP */ |
#endif /* SUPPORT_UCP */ |
| 141 |
} |
} |