This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Put back the cygwin32 Configure fix of 3582 undone by 3597.
[perl5.git] / regcomp.h
index be6e5b1..7c5c13a 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -49,174 +49,6 @@ typedef OP OP_4tree;                        /* Will be redefined later. */
  * to the thing following the set of BRANCHes.)  The opcodes are:
  */
 
-/* definition  number  opnd?   meaning */
-#define        END      0      /* no   End of program. */
-#define        BOL      1      /* no   Match "" at beginning of line. */
-#define MBOL    2      /* no   Same, assuming multiline. */
-#define SBOL    3      /* no   Same, assuming singleline. */
-#define        EOL      4      /* no   Match "" at end of line. */
-#define MEOL    5      /* no   Same, assuming multiline. */
-#define SEOL    6      /* no   Same, assuming singleline. */
-#define        ANY      7      /* no   Match any one character (except newline). */
-#define        SANY     8      /* no   Match any one character. */
-#define        ANYOF    9      /* sv   Match character in (or not in) this class. */
-#define        CURLY   10      /* sv   Match this simple thing {n,m} times. */
-#define        CURLYX  11      /* sv   Match this complex thing {n,m} times. */
-#define        BRANCH  12      /* node Match this alternative, or the next... */
-#define        BACK    13      /* no   Match "", "next" ptr points backward. */
-#define        EXACT   14      /* sv   Match this string (preceded by length). */
-#define        EXACTF  15      /* sv   Match this string, folded (prec. by length). */
-#define        EXACTFL 16      /* sv   Match this string, folded in locale (w/len). */
-#define        NOTHING 17      /* no   Match empty string. */
-#define        STAR    18      /* node Match this (simple) thing 0 or more times. */
-#define        PLUS    19      /* node Match this (simple) thing 1 or more times. */
-#define BOUND  20      /* no   Match "" at any word boundary */
-#define BOUNDL 21      /* no   Match "" at any word boundary */
-#define NBOUND 22      /* no   Match "" at any word non-boundary */
-#define NBOUNDL        23      /* no   Match "" at any word non-boundary */
-#define REF    24      /* num  Match some already matched string */
-#define        OPEN    25      /* num  Mark this point in input as start of #n. */
-#define        CLOSE   26      /* num  Analogous to OPEN. */
-#define MINMOD 27      /* no   Next operator is not greedy. */
-#define GPOS   28      /* no   Matches where last m//g left off. */
-#define IFMATCH        29      /* off  Succeeds if the following matches. */
-#define UNLESSM        30      /* off  Fails if the following matches. */
-#define SUCCEED        31      /* no   Return from a subroutine, basically. */
-#define WHILEM 32      /* no   Do curly processing and see if rest matches. */
-#define ALNUM  33      /* no   Match any alphanumeric character */
-#define ALNUML 34      /* no   Match any alphanumeric char in locale */
-#define NALNUM 35      /* no   Match any non-alphanumeric character */
-#define NALNUML        36      /* no   Match any non-alphanumeric char in locale */
-#define SPACE  37      /* no   Match any whitespace character */
-#define SPACEL 38      /* no   Match any whitespace char in locale */
-#define NSPACE 39      /* no   Match any non-whitespace character */
-#define NSPACEL        40      /* no   Match any non-whitespace char in locale */
-#define DIGIT  41      /* no   Match any numeric character */
-#define NDIGIT 42      /* no   Match any non-numeric character */
-#define CURLYM 43      /* no   Match this medium-complex thing {n,m} times. */
-#define CURLYN 44      /* no   Match next-after-this simple thing
-                          {n,m} times, set parenths. */
-#define        TAIL    45      /* no   Match empty string. Can jump here from outside. */
-#define REFF   46      /* num  Match already matched string, folded */
-#define REFFL  47      /* num  Match already matched string, folded in loc. */
-#define EVAL   48      /* evl  Execute some Perl code. */
-#define LONGJMP        49      /* off  Jump far away. */
-#define BRANCHJ        50      /* off  BRANCH with long offset. */
-#define IFTHEN 51      /* off  Switch, should be preceeded by switcher . */
-#define GROUPP 52      /* num  Whether the group matched. */
-#define LOGICAL        53      /* no   Next opcode should set the flag only. */
-#define SUSPEND        54      /* off  "Independent" sub-RE. */
-#define RENUM  55      /* off  Group with independently numbered parens. */
-#define OPTIMIZED      56      /* off  Placeholder for dump. */
-
-/*
- * Opcode notes:
- *
- * BRANCH      The set of branches constituting a single choice are hooked
- *             together with their "next" pointers, since precedence prevents
- *             anything being concatenated to any individual branch.  The
- *             "next" pointer of the last BRANCH in a choice points to the
- *             thing following the whole choice.  This is also where the
- *             final "next" pointer of each individual branch points; each
- *             branch starts with the operand node of a BRANCH node.
- *
- * BACK                Normal "next" pointers all implicitly point forward; BACK
- *             exists to make loop structures possible.
- *
- * STAR,PLUS   '?', and complex '*' and '+', are implemented as circular
- *             BRANCH structures using BACK.  Simple cases (one character
- *             per match) are implemented with STAR and PLUS for speed
- *             and to minimize recursive plunges.
- *
- * OPEN,CLOSE,GROUPP   ...are numbered at compile time.
- */
-
-#ifndef DOINIT
-EXTCONST U8 regkind[];
-#else
-EXTCONST U8 regkind[] = {
-       END,
-       BOL,
-       BOL,
-       BOL,
-       EOL,
-       EOL,
-       EOL,
-       ANY,
-       ANY,
-       ANYOF,
-       CURLY,
-       CURLY,
-       BRANCH,
-       BACK,
-       EXACT,
-       EXACT,
-       EXACT,
-       NOTHING,
-       STAR,
-       PLUS,
-       BOUND,
-       BOUND,
-       NBOUND,
-       NBOUND,
-       REF,
-       OPEN,
-       CLOSE,
-       MINMOD,
-       GPOS,
-       BRANCHJ,
-       BRANCHJ,
-       END,
-       WHILEM,
-       ALNUM,
-       ALNUM,
-       NALNUM,
-       NALNUM,
-       SPACE,
-       SPACE,
-       NSPACE,
-       NSPACE,
-       DIGIT,
-       NDIGIT,
-       CURLY,
-       CURLY,
-       NOTHING,
-       REF,
-       REF,
-       EVAL,
-       LONGJMP,
-       BRANCHJ,
-       BRANCHJ,
-       GROUPP,
-       LOGICAL,
-       BRANCHJ,
-       BRANCHJ,
-       NOTHING,
-};
-#endif
-
-/* The following have no fixed length. char* since we do strchr on it. */
-#ifndef DOINIT
-EXTCONST char varies[];
-#else
-EXTCONST char varies[] = {
-    BRANCH, BACK, STAR, PLUS, CURLY, CURLYX, REF, REFF, REFFL, 
-    WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, 0
-};
-#endif
-
-/* The following always have a length of 1. char* since we do strchr on it. */
-#ifndef DOINIT
-EXTCONST char simple[];
-#else
-EXTCONST char simple[] = {
-    ANY, SANY, ANYOF,
-    ALNUM, ALNUML, NALNUM, NALNUML,
-    SPACE, SPACEL, NSPACE, NSPACEL,
-    DIGIT, NDIGIT, 0
-};
-#endif
-
 /*
  * A node is one char of opcode followed by two chars of "next" pointer.
  * "Next" pointers are stored as two 8-bit pieces, high order first.  The
@@ -318,9 +150,9 @@ struct regnode_2 {
 #define FILL_ADVANCE_NODE_ARG(ptr, op, arg) STMT_START { \
     ARG_SET(ptr, arg);  FILL_ADVANCE_NODE(ptr, op); (ptr) += 1; } STMT_END
 
-#define MAGIC 0234
+#define REG_MAGIC 0234
 
-#define SIZE_ONLY (regcode == &regdummy)
+#define SIZE_ONLY (PL_regcode == &PL_regdummy)
 
 /* Flags for first parameter byte of ANYOF */
 #define ANYOF_INVERT   0x40
@@ -351,52 +183,57 @@ struct regnode_2 {
 #define        UCHARAT(p)      ((int)*(p)&CHARMASK)
 #endif
 #else /* lint */
-#define UCHARAT(p)     regdummy
+#define UCHARAT(p)     PL_regdummy
 #endif /* lint */
 
-#define        FAIL(m)         croak    ("/%.127s/: %s",  regprecomp,m)
-#define        FAIL2(pat,m)    re_croak2("/%.127s/: ",pat,regprecomp,m)
+#define        FAIL(m) \
+    STMT_START {                                                       \
+       if (!SIZE_ONLY)                                                 \
+           SAVEDESTRUCTOR(S_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);            \
+       S_re_croak2(aTHX_ "/%.127s/: ",pat,PL_regprecomp,m);            \
+    } STMT_END
 
 #define EXTRA_SIZE(guy) ((sizeof(guy)-1)/sizeof(struct regnode))
 
-#ifdef REG_COMP_C
-const static U8 regarglen[] = {
-    0,0,0,0,0,0,0,0,0,0,
-    /*CURLY*/ EXTRA_SIZE(struct regnode_2), 
-    /*CURLYX*/ EXTRA_SIZE(struct regnode_2),
-    0,0,0,0,0,0,0,0,0,0,0,0,
-    /*REF*/ EXTRA_SIZE(struct regnode_1), 
-    /*OPEN*/ EXTRA_SIZE(struct regnode_1),
-    /*CLOSE*/ EXTRA_SIZE(struct regnode_1),
-    0,0,
-    /*IFMATCH*/ EXTRA_SIZE(struct regnode_1),
-    /*UNLESSM*/ EXTRA_SIZE(struct regnode_1),
-    0,0,0,0,0,0,0,0,0,0,0,0,
-    /*CURLYM*/ EXTRA_SIZE(struct regnode_2),
-    /*CURLYN*/ EXTRA_SIZE(struct regnode_2),
-    0,
-    /*REFF*/ EXTRA_SIZE(struct regnode_1),
-    /*REFFL*/ EXTRA_SIZE(struct regnode_1),
-    /*EVAL*/ EXTRA_SIZE(struct regnode_1),
-    /*LONGJMP*/ EXTRA_SIZE(struct regnode_1),
-    /*BRANCHJ*/ EXTRA_SIZE(struct regnode_1),
-    /*IFTHEN*/ EXTRA_SIZE(struct regnode_1),
-    /*GROUPP*/ EXTRA_SIZE(struct regnode_1),
-    /*LOGICAL*/ 0,
-    /*SUSPEND*/ EXTRA_SIZE(struct regnode_1),
-    /*RENUM*/ EXTRA_SIZE(struct regnode_1), 0,
+#define REG_SEEN_ZERO_LEN      1
+#define REG_SEEN_LOOKBEHIND    2
+#define REG_SEEN_GPOS          4
+#define REG_SEEN_EVAL          8
+
+START_EXTERN_C
+
+#include "regnodes.h"
+
+/* The following have no fixed length. char* since we do strchr on it. */
+#ifndef DOINIT
+EXTCONST char PL_varies[];
+#else
+EXTCONST char PL_varies[] = {
+    BRANCH, BACK, STAR, PLUS, CURLY, CURLYX, REF, REFF, REFFL, 
+    WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, CLUMP, 0
 };
+#endif
 
-const static char reg_off_by_arg[] = {
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0 .. 15 */
-    0,0,0,0,0,0,0,0,0,0,0,0,0, /*IFMATCH*/ 2, /*UNLESSM*/ 2, 0,
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 32 .. 47 */
-    0, /*LONGJMP*/ 1, /*BRANCHJ*/ 1, /*IFTHEN*/ 1, 0, 0,
-    /*RENUM*/ 1, /*RENUM*/ 1,0,
+/* 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".) */
+#ifndef DOINIT
+EXTCONST char PL_simple[];
+#else
+EXTCONST char PL_simple[] = {
+    REG_ANY, ANYUTF8, SANY, SANYUTF8, ANYOF, ANYOFUTF8,
+    ALNUM, ALNUMUTF8, ALNUML, ALNUMLUTF8,
+    NALNUM, NALNUMUTF8, NALNUML, NALNUMLUTF8,
+    SPACE, SPACEUTF8, SPACEL, SPACELUTF8,
+    NSPACE, NSPACEUTF8, NSPACEL, NSPACELUTF8,
+    DIGIT, DIGITUTF8, NDIGIT, NDIGITUTF8, 0
 };
 #endif
 
-#define REG_SEEN_ZERO_LEN      1
-#define REG_SEEN_LOOKBEHIND    2
-#define REG_SEEN_GPOS          4
-#define REG_SEEN_EVAL          8
+END_EXTERN_C