X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/cad2e5aadfceb1a406f657488ea1c699f44a1487..389b72ffba57effeed96b76240b691bbd83408f7:/regcomp.h diff --git a/regcomp.h b/regcomp.h index 518add0..e30c8e7 100644 --- a/regcomp.h +++ b/regcomp.h @@ -66,10 +66,10 @@ typedef OP OP_4tree; /* Will be redefined later. */ */ struct regnode_string { - U8 flags; + U8 str_len; U8 type; U16 next_off; - U8 string[1]; + char string[1]; }; struct regnode_1 { @@ -133,6 +133,12 @@ struct regnode_2 { #define OP(p) ((p)->type) #define OPERAND(p) (((struct regnode_string *)p)->string) +#define MASK(p) ((char*)OPERAND(p)) +#define STR_LEN(p) (((struct regnode_string *)p)->str_len) +#define STRING(p) (((struct regnode_string *)p)->string) +#define STR_SZ(l) ((l + sizeof(regnode) - 1) / sizeof(regnode)) +#define NODE_SZ_STR(p) (STR_SZ(STR_LEN(p))+1) + #define NODE_ALIGN(node) #define ARG_LOC(p) (((struct regnode_1 *)p)->arg1) #define ARG1_LOC(p) (((struct regnode_2 *)p)->arg1) @@ -154,31 +160,83 @@ struct regnode_2 { #define SIZE_ONLY (PL_regcode == &PL_regdummy) -/* Flags for first parameter byte of ANYOF */ -#define ANYOF_INVERT 0x40 -#define ANYOF_FOLD 0x20 -#define ANYOF_LOCALE 0x10 -#define ANYOF_ISA 0x0F -#define ANYOF_ALNUML 0x08 -#define ANYOF_NALNUML 0x04 -#define ANYOF_SPACEL 0x02 -#define ANYOF_NSPACEL 0x01 - -/* Utility macros for bitmap of ANYOF */ -#define ANYOF_BYTE(p,c) (p)[1 + (((c) >> 3) & 31)] -#define ANYOF_BIT(c) (1 << ((c) & 7)) -#define ANYOF_SET(p,c) (ANYOF_BYTE(p,c) |= ANYOF_BIT(c)) -#define ANYOF_CLEAR(p,c) (ANYOF_BYTE(p,c) &= ~ANYOF_BIT(c)) -#define ANYOF_TEST(p,c) (ANYOF_BYTE(p,c) & ANYOF_BIT(c)) - -#define ANY_SKIP ((33 - 1)/sizeof(regnode) + 1) +/* Flags for first parameter byte [0] of ANYOF */ + +#define ANYOF_CLASS 0x08 +#define ANYOF_INVERT 0x04 +#define ANYOF_FOLD 0x02 +#define ANYOF_LOCALE 0x01 + +/* Character classes for bytes [1..4] of ANYOF */ + +#define ANYOF_ALNUM 0 /* \w, utf8::IsWord, isALNUM() */ +#define ANYOF_NALNUM 1 +#define ANYOF_SPACE 2 +#define ANYOF_NSPACE 3 +#define ANYOF_DIGIT 4 +#define ANYOF_NDIGIT 5 +#define ANYOF_ALNUMC 6 /* isalnum(3), utf8::IsAlnum, isALNUMC() */ +#define ANYOF_NALNUMC 7 +#define ANYOF_ALPHA 8 +#define ANYOF_NALPHA 9 +#define ANYOF_ASCII 10 +#define ANYOF_NASCII 11 +#define ANYOF_CNTRL 12 +#define ANYOF_NCNTRL 13 +#define ANYOF_GRAPH 14 +#define ANYOF_NGRAPH 15 +#define ANYOF_LOWER 16 +#define ANYOF_NLOWER 17 +#define ANYOF_PRINT 18 +#define ANYOF_NPRINT 19 +#define ANYOF_PUNCT 20 +#define ANYOF_NPUNCT 21 +#define ANYOF_UPPER 22 +#define ANYOF_NUPPER 23 +#define ANYOF_XDIGIT 24 +#define ANYOF_NXDIGIT 25 + +#define ANYOF_MAX 31 + +/* Backward source code compatibility. */ + +#define ANYOF_ALNUML ANYOF_ALNUM +#define ANYOF_NALNUML ANYOF_NALNUM +#define ANYOF_SPACEL ANYOF_SPACE +#define ANYOF_NSPACEL ANYOF_NSPACE + +/* Utility macros for the bitmap and classes of ANYOF */ + +#define ANYOF_OPND_SIZE 1 +#define ANYOF_CLASS_SIZE 4 +#define ANYOF_BITMAP_SIZE 32 /* 256 b/(8 b/B) */ +#define ANYOF_SIZE (ANYOF_OPND_SIZE+ANYOF_CLASS_SIZE+ANYOF_BITMAP_SIZE) + +#define ANYOF_FLAGS(p) ((p)[0]) +#define ANYOF_FLAGS_ALL 0xff + +#define ANYOF_BIT(c) (1 << ((c) & 7)) + +#define ANYOF_CLASS_OFFSET ANYOF_OPND_SIZE +#define ANYOF_CLASS_BYTE(p, c) ((p)[ANYOF_CLASS_OFFSET + (((c) >> 3) & 3)]) +#define ANYOF_CLASS_SET(p, c) (ANYOF_CLASS_BYTE(p, c) |= ANYOF_BIT(c)) +#define ANYOF_CLASS_CLEAR(p, c) (ANYOF_CLASS_BYTE(p, c) &= ~ANYOF_BIT(c)) +#define ANYOF_CLASS_TEST(p, c) (ANYOF_CLASS_BYTE(p, c) & ANYOF_BIT(c)) + +#define ANYOF_BITMAP_OFFSET (ANYOF_CLASS_OFFSET+ANYOF_CLASS_SIZE) +#define ANYOF_BITMAP_BYTE(p, c) ((p)[ANYOF_BITMAP_OFFSET + (((c) >> 3) & 31)]) +#define ANYOF_BITMAP_SET(p, c) (ANYOF_BITMAP_BYTE(p, c) |= ANYOF_BIT(c)) +#define ANYOF_BITMAP_CLEAR(p,c) (ANYOF_BITMAP_BYTE(p, c) &= ~ANYOF_BIT(c)) +#define ANYOF_BITMAP_TEST(p, c) (ANYOF_BITMAP_BYTE(p, c) & ANYOF_BIT(c)) + +#define ANY_SKIP ((ANYOF_SIZE - 1)/sizeof(regnode) + 1) /* * Utility definitions. */ #ifndef lint #ifndef CHARMASK -#define UCHARAT(p) ((int)*(unsigned char *)(p)) +#define UCHARAT(p) ((int)*(U8*)(p)) #else #define UCHARAT(p) ((int)*(p)&CHARMASK) #endif @@ -189,14 +247,14 @@ struct regnode_2 { #define FAIL(m) \ STMT_START { \ if (!SIZE_ONLY) \ - SAVEDESTRUCTOR(S_clear_re,(void*)PL_regcomp_rx); \ + SAVEDESTRUCTOR(clear_re,(void*)PL_regcomp_rx); \ Perl_croak(aTHX_ "/%.127s/: %s", PL_regprecomp,m); \ } STMT_END #define FAIL2(pat,m) \ STMT_START { \ if (!SIZE_ONLY) \ - SAVEDESTRUCTOR(S_clear_re,(void*)PL_regcomp_rx); \ + SAVEDESTRUCTOR(clear_re,(void*)PL_regcomp_rx); \ S_re_croak2(aTHX_ "/%.127s/: ",pat,PL_regprecomp,m); \ } STMT_END @@ -211,22 +269,22 @@ START_EXTERN_C #include "regnodes.h" -/* The following have no fixed length. char* since we do strchr on it. */ +/* The following have no fixed length. U8 so we can do strchr() on it. */ #ifndef DOINIT -EXTCONST char PL_varies[]; +EXTCONST U8 PL_varies[]; #else -EXTCONST char PL_varies[] = { +EXTCONST U8 PL_varies[] = { BRANCH, BACK, STAR, PLUS, CURLY, CURLYX, REF, REFF, REFFL, WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, CLUMP, 0 }; #endif -/* The following always have a length of 1. char* since we do strchr on it. */ -/* (Note that lenght 1 means "one character" under UTF8, not "one octet".) */ +/* The following always have a length of 1. U8 we can do strchr() on it. */ +/* (Note that length 1 means "one character" under UTF8, not "one octet".) */ #ifndef DOINIT -EXTCONST char PL_simple[]; +EXTCONST U8 PL_simple[]; #else -EXTCONST char PL_simple[] = { +EXTCONST U8 PL_simple[] = { REG_ANY, ANYUTF8, SANY, SANYUTF8, ANYOF, ANYOFUTF8, ALNUM, ALNUMUTF8, ALNUML, ALNUMLUTF8, NALNUM, NALNUMUTF8, NALNUML, NALNUMLUTF8,