#ifdef NULL
#undef NULL
#endif
-#ifndef I286
# define NULL 0
-#else
-# define NULL 0L
-#endif
#endif
#ifndef PERL_CORE
#endif /* NeXT || __NeXT__ */
#ifndef HAS_BOOL
-# if defined(UTS) || defined(VMS)
+# if defined(VMS)
# define bool int
# else
# define bool char
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__SUNPRO_C)) /* C99 or close enough. */
# define FUNCTION__ __func__
#else
-# if (defined(_MSC_VER) && _MSC_VER < 1300) || /* Pre-MSVC 7.0 has neither __func__ nor __FUNCTION and no good workarounds, either. */ \
+# if (defined(_MSC_VER) && _MSC_VER < 1300) || /* MSVC6 has neither __func__ nor __FUNCTION and no good workarounds, either. */ \
(defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tur64, -c99 not known, only -std1). */
# define FUNCTION__ ""
# else
# define PeRl_INT64_C(c) CAT2(c,LL)
# define PeRl_UINT64_C(c) CAT2(c,ULL)
# else
-# if LONGSIZE == 8 && QUADKIND == QUAD_IS_LONG
-# define PeRl_INT64_C(c) CAT2(c,L)
-# define PeRl_UINT64_C(c) CAT2(c,UL)
+# if QUADKIND == QUAD_IS___INT64
+# define PeRl_INT64_C(c) CAT2(c,I64)
+# define PeRl_UINT64_C(c) CAT2(c,UI64)
# else
-# if defined(_WIN64) && defined(_MSC_VER)
-# define PeRl_INT64_C(c) CAT2(c,I64)
-# define PeRl_UINT64_C(c) CAT2(c,UI64)
+# if LONGSIZE == 8 && QUADKIND == QUAD_IS_LONG
+# define PeRl_INT64_C(c) CAT2(c,L)
+# define PeRl_UINT64_C(c) CAT2(c,UL)
# else
# define PeRl_INT64_C(c) ((I64TYPE)(c))
# define PeRl_UINT64_C(c) ((U64TYPE)(c))
* digits */
#define isOCTAL_A(c) cBOOL(FITS_IN_8_BITS(c) && (0xF8 & (c)) == '0')
-
/* ASCII range only */
#ifdef H_PERL /* If have access to perl.h, lookup in its table */
-/* Bits for PL_charclass[]. These use names used in l1_char_class_tab.h but
- * their actual definitions are here. If that has a name not used here, it
- * won't compile. */
-# define _CC_WORDCHAR_A (1<<27)
-# define _CC_SPACE_A (1<<23)
-# define _CC_DIGIT_A (1<<9)
-# define _CC_ALNUMC_A (1<<0)
-# define _CC_ALPHA_A (1<<2)
-# define _CC_ASCII (1<<16)
-# define _CC_CNTRL_A (1<<7)
-# define _CC_GRAPH_A (1<<10)
-# define _CC_LOWER_A (1<<14)
-# define _CC_PRINT_A (1<<17)
-# define _CC_PUNCT_A (1<<21)
-# define _CC_UPPER_A (1<<25)
-# define _CC_XDIGIT_A (1<<29)
-# define _CC_PSXSPC_A (1<<19)
-# define _CC_BLANK_A (1<<4)
-
-# define _CC_WORDCHAR_L1 (1<<28)
-# define _CC_SPACE_L1 (1<<24)
-# define _CC_ALNUMC_L1 (1<<1)
-# define _CC_ALPHA_L1 (1<<3)
-# define _CC_CNTRL_L1 (1<<8)
-# define _CC_GRAPH_L1 (1<<11)
-# define _CC_LOWER_L1 (1<<15)
-# define _CC_PRINT_L1 (1<<18)
-# define _CC_PUNCT_L1 (1<<22)
-# define _CC_UPPER_L1 (1<<26)
-# define _CC_PSXSPC_L1 (1<<20)
-# define _CC_BLANK_L1 (1<<5)
-# define _CC_IDFIRST_A (1<<12)
-# define _CC_IDFIRST_L1 (1<<13)
-# define _CC_CHARNAME_CONT (1<<6)
-# define _CC_NONLATIN1_FOLD (1<<30)
-# define _CC_QUOTEMETA (1U<<31) /* 1U keeps Solaris from griping */
-/* Unused: None
- * If more are needed, can give up some of the above. The first ones to go
- * would be those that require just two tests to verify; either there are two
- * code points, like BLANK_A, or it occupies a single range like DIGIT_A,
- * UPPER_A, and LOWER_A. Also consider the ones that can be replaced with two
- * tests and an additional mask, so
- *
- * #define isCNTRL_A cBOOL(FITS_IN_8_BITS(c) \
- * && (( ! (~0x1F & NATIVE_TO_UNI(c)])) \
- * || UNLIKELY(NATIVE_TO_UNI(c) == 0x7f)))
- *
- * This takes advantage of the contiguous block of these with the first one's
- * representation having the lower order bits all zero;, except the DELETE must
- * be tested specially. A similar pattern can be used for for isCNTRL_L1,
- * isPRINT_A, and isPRINT_L1
- */
+
+/* Character class numbers. These are used in PL_charclass[] and the ones
+ * up through the one that corresponds to <_HIGHEST_REGCOMP_DOT_H_SYNC> are
+ * used by regcomp.h. These use names used in l1_char_class_tab.h but their
+ * actual definitions are here. If that has a name not used here, it won't
+ * compile. */
+# define _CC_WORDCHAR 0
+# define _CC_SPACE 1
+# define _CC_DIGIT 2
+# define _CC_ALNUMC 3
+# define _CC_ALPHA 4
+# define _CC_ASCII 5
+# define _CC_CNTRL 6
+# define _CC_GRAPH 7
+# define _CC_LOWER 8
+# define _CC_PRINT 9
+# define _CC_PUNCT 10
+# define _CC_UPPER 11
+# define _CC_XDIGIT 12
+# define _CC_PSXSPC 13
+# define _CC_BLANK 14
+# define _HIGHEST_REGCOMP_DOT_H_SYNC _CC_BLANK
+
+# define _CC_IDFIRST 15
+# define _CC_CHARNAME_CONT 16
+# define _CC_NONLATIN1_FOLD 17
+# define _CC_QUOTEMETA 18
+# define _CC_NON_FINAL_FOLD 19
+/* Unused: 20-31
+ * If more bits are needed, one could add a second word for non-64bit
+ * QUAD_IS_INT systems, using some #ifdefs to distinguish between having a 2nd
+ * word or not. */
# ifdef DOINIT
EXTCONST U32 PL_charclass[] = {
EXTCONST U32 PL_charclass[];
# endif
-# define _generic_isCC(c, bit) cBOOL(FITS_IN_8_BITS(c) && (PL_charclass[(U8) NATIVE_TO_UNI(c)] & (bit)))
-
-# define isALNUMC_A(c) _generic_isCC(c, _CC_ALNUMC_A)
-# define isALPHA_A(c) _generic_isCC(c, _CC_ALPHA_A)
-# define isBLANK_A(c) _generic_isCC(c, _CC_BLANK_A)
-# define isCNTRL_A(c) _generic_isCC(c, _CC_CNTRL_A)
-# define isDIGIT_A(c) _generic_isCC(c, _CC_DIGIT_A)
-# define isGRAPH_A(c) _generic_isCC(c, _CC_GRAPH_A)
-# define isIDFIRST_A(c) _generic_isCC(c, _CC_IDFIRST_A)
-# define isLOWER_A(c) _generic_isCC(c, _CC_LOWER_A)
-# define isPRINT_A(c) _generic_isCC(c, _CC_PRINT_A)
-# define isPSXSPC_A(c) _generic_isCC(c, _CC_PSXSPC_A)
-# define isPUNCT_A(c) _generic_isCC(c, _CC_PUNCT_A)
-# define isSPACE_A(c) _generic_isCC(c, _CC_SPACE_A)
-# define isUPPER_A(c) _generic_isCC(c, _CC_UPPER_A)
-# define isWORDCHAR_A(c) _generic_isCC(c, _CC_WORDCHAR_A)
-# define isXDIGIT_A(c) _generic_isCC(c, _CC_XDIGIT_A)
+ /* The 1U keeps Solaris from griping when shifting sets the uppermost bit */
+# define _CC_mask(classnum) (1U << (classnum))
+# define _generic_isCC(c, classnum) cBOOL(FITS_IN_8_BITS(c) \
+ && (PL_charclass[(U8) NATIVE_TO_UNI(c)] & _CC_mask(classnum)))
+
+ /* The mask for the _A versions of the macros; it just adds in the bit for
+ * ASCII. */
+# define _CC_mask_A(classnum) (_CC_mask(classnum) | _CC_mask(_CC_ASCII))
+
+ /* The _A version makes sure that both the desired bit and the ASCII bit
+ * are present */
+# define _generic_isCC_A(c, classnum) (FITS_IN_8_BITS(c) \
+ && ((PL_charclass[(U8) NATIVE_TO_UNI(c)] & _CC_mask_A(classnum)) \
+ == _CC_mask_A(classnum)))
+
+# define isALNUMC_A(c) _generic_isCC_A(c, _CC_ALNUMC)
+# define isALPHA_A(c) _generic_isCC_A(c, _CC_ALPHA)
+# define isBLANK_A(c) _generic_isCC_A(c, _CC_BLANK)
+# define isCNTRL_A(c) _generic_isCC_A(c, _CC_CNTRL)
+# define isDIGIT_A(c) _generic_isCC(c, _CC_DIGIT)
+# define isGRAPH_A(c) _generic_isCC_A(c, _CC_GRAPH)
+# define isLOWER_A(c) _generic_isCC_A(c, _CC_LOWER)
+# define isPRINT_A(c) _generic_isCC_A(c, _CC_PRINT)
+# define isPSXSPC_A(c) _generic_isCC_A(c, _CC_PSXSPC)
+# define isPUNCT_A(c) _generic_isCC_A(c, _CC_PUNCT)
+# define isSPACE_A(c) _generic_isCC_A(c, _CC_SPACE)
+# define isUPPER_A(c) _generic_isCC_A(c, _CC_UPPER)
+# define isWORDCHAR_A(c) _generic_isCC_A(c, _CC_WORDCHAR)
+# define isXDIGIT_A(c) _generic_isCC(c, _CC_XDIGIT)
+# define isIDFIRST_A(c) _generic_isCC_A(c, ( _CC_IDFIRST))
+
/* Either participates in a fold with a character above 255, or is a
* multi-char fold */
-# define _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) ((! cBOOL(FITS_IN_8_BITS(c))) || (PL_charclass[(U8) NATIVE_TO_UNI(c)] & _CC_NONLATIN1_FOLD))
+# define _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) ((! cBOOL(FITS_IN_8_BITS(c))) || (PL_charclass[(U8) NATIVE_TO_UNI(c)] & _CC_mask(_CC_NONLATIN1_FOLD)))
+
# define _isQUOTEMETA(c) _generic_isCC(c, _CC_QUOTEMETA)
+# define _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) \
+ _generic_isCC(c, _CC_NON_FINAL_FOLD)
#else /* No perl.h. */
# ifdef EBCDIC
# define isALNUMC_A(c) (isASCII(c) && isALNUMC(c))
/* Latin1 definitions */
#ifdef H_PERL
-# define isALNUMC_L1(c) _generic_isCC(c, _CC_ALNUMC_L1)
-# define isALPHA_L1(c) _generic_isCC(c, _CC_ALPHA_L1)
-# define isBLANK_L1(c) _generic_isCC(c, _CC_BLANK_L1)
+# define isALNUMC_L1(c) _generic_isCC(c, _CC_ALNUMC)
+# define isALPHA_L1(c) _generic_isCC(c, _CC_ALPHA)
+# define isBLANK_L1(c) _generic_isCC(c, _CC_BLANK)
/* continuation character for legal NAME in \N{NAME} */
# define isCHARNAME_CONT(c) _generic_isCC(c, _CC_CHARNAME_CONT)
-# define isCNTRL_L1(c) _generic_isCC(c, _CC_CNTRL_L1)
-# define isGRAPH_L1(c) _generic_isCC(c, _CC_GRAPH_L1)
-# define isIDFIRST_L1(c) _generic_isCC(c, _CC_IDFIRST_L1)
-# define isLOWER_L1(c) _generic_isCC(c, _CC_LOWER_L1)
-# define isPRINT_L1(c) _generic_isCC(c, _CC_PRINT_L1)
-# define isPSXSPC_L1(c) _generic_isCC(c, _CC_PSXSPC_L1)
-# define isPUNCT_L1(c) _generic_isCC(c, _CC_PUNCT_L1)
-# define isSPACE_L1(c) _generic_isCC(c, _CC_SPACE_L1)
-# define isUPPER_L1(c) _generic_isCC(c, _CC_UPPER_L1)
-# define isWORDCHAR_L1(c) _generic_isCC(c, _CC_WORDCHAR_L1)
+# define isCNTRL_L1(c) _generic_isCC(c, _CC_CNTRL)
+# define isGRAPH_L1(c) _generic_isCC(c, _CC_GRAPH)
+# define isLOWER_L1(c) _generic_isCC(c, _CC_LOWER)
+# define isPRINT_L1(c) _generic_isCC(c, _CC_PRINT)
+# define isPSXSPC_L1(c) _generic_isCC(c, _CC_PSXSPC)
+# define isPUNCT_L1(c) _generic_isCC(c, _CC_PUNCT)
+# define isSPACE_L1(c) _generic_isCC(c, _CC_SPACE)
+# define isUPPER_L1(c) _generic_isCC(c, _CC_UPPER)
+# define isWORDCHAR_L1(c) _generic_isCC(c, _CC_WORDCHAR)
+# define isIDFIRST_L1(c) _generic_isCC(c, _CC_IDFIRST)
#else /* No access to perl.h. Only a few provided here, just in case needed
* for backwards compatibility */
/* ALPHAU includes Unicode semantics for latin1 characters. It has an extra
#define isLOWER_uni(c) generic_uni(isLOWER, is_uni_lower, c)
#define isASCII_uni(c) isASCII(c)
/* All controls are in Latin1 */
-#define isCNTRL_uni(c) ((c) < 256 && isCNTRL_L1(c))
+#define isCNTRL_uni(c) isCNTRL_L1(c)
#define isGRAPH_uni(c) generic_uni(isGRAPH, is_uni_graph, c)
#define isPRINT_uni(c) generic_uni(isPRINT, is_uni_print, c)
#define isPUNCT_uni(c) generic_uni(isPUNCT, is_uni_punct, c)
#define isXDIGIT_uni(c) generic_uni(isXDIGIT, is_uni_xdigit, c)
+
+/* Posix and regular space differ only in U+000B, which is in Latin1 */
+#define isPSXSPC_uni(c) ((c) < 256 ? isPSXSPC_L1(c) : isSPACE_uni(c))
+
#define toUPPER_uni(c,s,l) to_uni_upper(c,s,l)
#define toTITLE_uni(c,s,l) to_uni_title(c,s,l)
#define toLOWER_uni(c,s,l) to_uni_lower(c,s,l)
#define toFOLD_uni(c,s,l) to_uni_fold(c,s,l)
-/* Posix and regular space differ only in U+000B, which is in Latin1 */
-#define isPSXSPC_uni(c) ((c) < 256 ? isPSXSPC_L1(c) : isSPACE_uni(c))
-
#define isALNUM_LC_uvchr(c) (c < 256 ? isALNUM_LC(c) : is_uni_alnum_lc(c))
#define isIDFIRST_LC_uvchr(c) (c < 256 ? isIDFIRST_LC(c) : is_uni_idfirst_lc(c))
#define isALPHA_LC_uvchr(c) (c < 256 ? isALPHA_LC(c) : is_uni_alpha_lc(c))
* the function. This relies on the fact that ASCII characters have the same
* representation whether utf8 or not */
#define generic_utf8(macro, function, p) (isASCII(*(p)) \
- ? CAT2(CAT2(macro,_),A)(*(p)) \
+ ? CAT2(CAT2(macro,_),A)(*(p)) \
: (UTF8_IS_DOWNGRADEABLE_START(*(p))) \
? CAT2(macro, _L1) \
(TWO_BYTE_UTF8_TO_UNI(*(p), \