diff options
author | Karl Williamson <khw@cpan.org> | 2019-09-28 11:58:59 -0600 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2019-09-29 11:46:26 -0600 |
commit | 5cd61b66283b55e639490151d4e730a840ab13d5 (patch) | |
tree | dd4f8ed1815291c2af682668c32c66d504a5af7d /regcomp.h | |
parent | 3363c7035ff1df0c3ffeae0cd18bb86cc39d62e4 (diff) | |
download | perl-5cd61b66283b55e639490151d4e730a840ab13d5.tar.gz |
regex: Add LEXACT_ONLY8 node type
This is like LEXACT, but it is known that only strings encoded in UTF-8
will match it, so don't even have to try if that condition isn't met.
Diffstat (limited to 'regcomp.h')
-rw-r--r-- | regcomp.h | 20 |
1 files changed, 13 insertions, 7 deletions
@@ -338,8 +338,10 @@ struct regnode_ssc { #define FLAGS(p) ((p)->flags) /* Caution: Doesn't apply to all \ regnode types. For some, it's the \ character set of the regnode */ -#define STR_LENs(p) (__ASSERT_(OP(p) != LEXACT) ((struct regnode_string *)p)->str_len) -#define STRINGs(p) (__ASSERT_(OP(p) != LEXACT) ((struct regnode_string *)p)->string) +#define STR_LENs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_ONLY8) \ + ((struct regnode_string *)p)->str_len) +#define STRINGs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_ONLY8) \ + ((struct regnode_string *)p)->string) #define OPERANDs(p) STRINGs(p) /* Long strings. Currently limited to length 18 bits, which handles a 262000 @@ -354,12 +356,16 @@ struct regnode_ssc { * node to be an ARG2L, using the second 32 bit field for the length, and not * using the flags nor next_off fields at all. One could have an llstring node * and even an lllstring type. */ -#define STR_LENl(p) (__ASSERT_(OP(p) == LEXACT) (((struct regnode_lstring *)p)->str_len)) -#define STRINGl(p) (__ASSERT_(OP(p) == LEXACT) (((struct regnode_lstring *)p)->string)) +#define STR_LENl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \ + (((struct regnode_lstring *)p)->str_len)) +#define STRINGl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \ + (((struct regnode_lstring *)p)->string)) #define OPERANDl(p) STRINGl(p) -#define STR_LEN(p) ((OP(p) == LEXACT) ? STR_LENl(p) : STR_LENs(p)) -#define STRING(p) ((OP(p) == LEXACT) ? STRINGl(p) : STRINGs(p)) +#define STR_LEN(p) ((OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \ + ? STR_LENl(p) : STR_LENs(p)) +#define STRING(p) ((OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \ + ? STRINGl(p) : STRINGs(p)) #define OPERAND(p) STRING(p) /* The number of (smallest) regnode equivalents that a string of length l bytes @@ -372,7 +378,7 @@ struct regnode_ssc { #define setSTR_LEN(p,v) \ STMT_START{ \ - if (OP(p) == LEXACT) \ + if (OP(p) == LEXACT || OP(p) == LEXACT_ONLY8) \ ((struct regnode_lstring *)(p))->str_len = (v); \ else \ ((struct regnode_string *)(p))->str_len = (v); \ |