15759b3d2Safresh1################################################################################
25759b3d2Safresh1##
35759b3d2Safresh1##  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
45759b3d2Safresh1##  Version 2.x, Copyright (C) 2001, Paul Marquess.
55759b3d2Safresh1##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
65759b3d2Safresh1##
75759b3d2Safresh1##  This program is free software; you can redistribute it and/or
85759b3d2Safresh1##  modify it under the same terms as Perl itself.
95759b3d2Safresh1##
105759b3d2Safresh1################################################################################
115759b3d2Safresh1
125759b3d2Safresh1=provides
135759b3d2Safresh1
145759b3d2Safresh1__UNDEFINED__
15*3d61058aSafresh1__REDEFINE__
165759b3d2Safresh1END_EXTERN_C
175759b3d2Safresh1EXTERN_C
18f3efcd01Safresh1INT2PTR
19f3efcd01Safresh1MUTABLE_PTR
20f3efcd01Safresh1NVTYPE
21f3efcd01Safresh1PERLIO_FUNCS_CAST
22f3efcd01Safresh1PERLIO_FUNCS_DECL
23eac174f2Safresh1PERL_STATIC_INLINE
24f3efcd01Safresh1PERL_UNUSED_ARG
25f3efcd01Safresh1PERL_UNUSED_CONTEXT
26f3efcd01Safresh1PERL_UNUSED_DECL
27f3efcd01Safresh1PERL_UNUSED_RESULT
28f3efcd01Safresh1PERL_UNUSED_VAR
29f3efcd01Safresh1PERL_USE_GCC_BRACE_GROUPS
30f3efcd01Safresh1PTR2ul
31f3efcd01Safresh1PTRV
32f3efcd01Safresh1START_EXTERN_C
335759b3d2Safresh1STMT_END
34f3efcd01Safresh1STMT_START
35f3efcd01Safresh1SvRX
365759b3d2Safresh1WIDEST_UTYPE
375759b3d2Safresh1XSRETURN
389a4edab6SbluhmNOT_REACHED
399a4edab6SbluhmASSUME
40*3d61058aSafresh1Stack_off_t
41*3d61058aSafresh1Stack_off_t_MAX
42*3d61058aSafresh1PERL_STACK_OFFSET_DEFINED
435759b3d2Safresh1
445759b3d2Safresh1=implementation
455759b3d2Safresh1
46eac174f2Safresh1#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
47eac174f2Safresh1__UNDEFINED__ PERL_STATIC_INLINE static inline
48eac174f2Safresh1#else
49eac174f2Safresh1__UNDEFINED__ PERL_STATIC_INLINE static
50eac174f2Safresh1#endif
51eac174f2Safresh1
525759b3d2Safresh1__UNDEFINED__ cBOOL(cbool) ((cbool) ? (bool)1 : (bool)0)
535759b3d2Safresh1__UNDEFINED__ OpHAS_SIBLING(o)      (cBOOL((o)->op_sibling))
545759b3d2Safresh1__UNDEFINED__ OpSIBLING(o)          (0 + (o)->op_sibling)
555759b3d2Safresh1__UNDEFINED__ OpMORESIB_set(o, sib) ((o)->op_sibling = (sib))
565759b3d2Safresh1__UNDEFINED__ OpLASTSIB_set(o, parent) ((o)->op_sibling = NULL)
575759b3d2Safresh1__UNDEFINED__ OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib))
58f3efcd01Safresh1__UNDEFINED__ HEf_SVKEY   -2
59f3efcd01Safresh1
60f3efcd01Safresh1#if defined(DEBUGGING) && !defined(__COVERITY__)
61f3efcd01Safresh1__UNDEFINED__ __ASSERT_(statement)  assert(statement),
62f3efcd01Safresh1#else
63f3efcd01Safresh1__UNDEFINED__ __ASSERT_(statement)
64f3efcd01Safresh1#endif
655759b3d2Safresh1
66eac174f2Safresh1__UNDEF_NOT_PROVIDED__  __has_builtin(x) 0
679a4edab6Sbluhm
689a4edab6Sbluhm#if __has_builtin(__builtin_unreachable)
699a4edab6Sbluhm#  define D_PPP_HAS_BUILTIN_UNREACHABLE
709a4edab6Sbluhm#elif (defined(__GNUC__) && (   __GNUC__ > 4                              \
719a4edab6Sbluhm                             || __GNUC__ == 4 && __GNUC_MINOR__ >= 5))
729a4edab6Sbluhm#  define D_PPP_HAS_BUILTIN_UNREACHABLE
739a4edab6Sbluhm#endif
749a4edab6Sbluhm
759a4edab6Sbluhm#ifndef ASSUME
769a4edab6Sbluhm#  ifdef DEBUGGING
779a4edab6Sbluhm#    define ASSUME(x) assert(x)
789a4edab6Sbluhm#  elif defined(_MSC_VER)
799a4edab6Sbluhm#    define ASSUME(x) __assume(x)
809a4edab6Sbluhm#  elif defined(__ARMCC_VERSION)
819a4edab6Sbluhm#    define ASSUME(x) __promise(x)
829a4edab6Sbluhm#  elif defined(D_PPP_HAS_BUILTIN_UNREACHABLE)
839a4edab6Sbluhm#    define ASSUME(x) ((x) ? (void) 0 : __builtin_unreachable())
849a4edab6Sbluhm#  else
859a4edab6Sbluhm#    define ASSUME(x) assert(x)
869a4edab6Sbluhm#  endif
879a4edab6Sbluhm#endif
889a4edab6Sbluhm
899a4edab6Sbluhm#ifndef NOT_REACHED
909a4edab6Sbluhm#  ifdef D_PPP_HAS_BUILTIN_UNREACHABLE
919a4edab6Sbluhm#    define NOT_REACHED                                                     \
929a4edab6Sbluhm        STMT_START {                                                        \
939a4edab6Sbluhm            ASSUME(!"UNREACHABLE"); __builtin_unreachable();                \
949a4edab6Sbluhm        } STMT_END
959a4edab6Sbluhm#  elif ! defined(__GNUC__) && (defined(__sun) || defined(__hpux))
969a4edab6Sbluhm#    define NOT_REACHED
979a4edab6Sbluhm#  else
989a4edab6Sbluhm#    define NOT_REACHED  ASSUME(!"UNREACHABLE")
999a4edab6Sbluhm#  endif
1009a4edab6Sbluhm#endif
1019a4edab6Sbluhm
1029a4edab6Sbluhm#ifndef WIDEST_UTYPE
1039a4edab6Sbluhm# ifdef QUADKIND
1049a4edab6Sbluhm#  ifdef U64TYPE
1059a4edab6Sbluhm#   define WIDEST_UTYPE U64TYPE
1069a4edab6Sbluhm#  else
1079a4edab6Sbluhm#   define WIDEST_UTYPE unsigned Quad_t
1089a4edab6Sbluhm#  endif
1099a4edab6Sbluhm# else
1109a4edab6Sbluhm#  define WIDEST_UTYPE U32
1119a4edab6Sbluhm# endif
1129a4edab6Sbluhm#endif
1139a4edab6Sbluhm
114de8cc8edSafresh1/* These could become provided if/when they become part of the public API */
115de8cc8edSafresh1__UNDEF_NOT_PROVIDED__ withinCOUNT(c, l, n)                                    \
116de8cc8edSafresh1   (((WIDEST_UTYPE) (((c)) - ((l) | 0))) <= (((WIDEST_UTYPE) ((n) | 0))))
117de8cc8edSafresh1__UNDEF_NOT_PROVIDED__ inRANGE(c, l, u)                                        \
118de8cc8edSafresh1   (  (sizeof(c) == sizeof(U8))  ? withinCOUNT(((U8)  (c)), (l), ((u) - (l)))  \
119de8cc8edSafresh1    : (sizeof(c) == sizeof(U32)) ? withinCOUNT(((U32) (c)), (l), ((u) - (l)))  \
120de8cc8edSafresh1    : (withinCOUNT(((WIDEST_UTYPE) (c)), (l), ((u) - (l)))))
1215759b3d2Safresh1
122de8cc8edSafresh1/* The '| 0' part ensures a compiler error if c is not integer (like e.g., a
123de8cc8edSafresh1 * pointer) */
124de8cc8edSafresh1#undef FITS_IN_8_BITS   /* handy.h version uses a core-only constant */
125de8cc8edSafresh1__UNDEF_NOT_PROVIDED__ FITS_IN_8_BITS(c) (   (sizeof(c) == 1)               \
126de8cc8edSafresh1                                    || !(((WIDEST_UTYPE)((c) | 0)) & ~0xFF))
1275759b3d2Safresh1
128de8cc8edSafresh1/* Create the macro for "is'macro'_utf8_safe(s, e)".  For code points below
129de8cc8edSafresh1 * 256, it calls the equivalent _L1 macro by converting the UTF-8 to code
130de8cc8edSafresh1 * point.  That is so that it can automatically get the bug fixes done in this
131de8cc8edSafresh1 * file. */
132de8cc8edSafresh1#define D_PPP_IS_GENERIC_UTF8_SAFE(s, e, macro)                             \
133de8cc8edSafresh1   (((e) - (s)) <= 0                                                        \
134de8cc8edSafresh1     ? 0                                                                    \
135de8cc8edSafresh1     : UTF8_IS_INVARIANT((s)[0])                                            \
136de8cc8edSafresh1       ? is ## macro ## _L1((s)[0])                                         \
137de8cc8edSafresh1       : (((e) - (s)) < UTF8SKIP(s))                                        \
138de8cc8edSafresh1          ? 0                                                               \
139de8cc8edSafresh1          : UTF8_IS_DOWNGRADEABLE_START((s)[0])                             \
140de8cc8edSafresh1              /* The cast in the line below is only to silence warnings */  \
141de8cc8edSafresh1            ? is ## macro ## _L1((WIDEST_UTYPE) LATIN1_TO_NATIVE(           \
142de8cc8edSafresh1                                  UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
143de8cc8edSafresh1                                                     & UTF_START_MASK(2),   \
144de8cc8edSafresh1                                                  (s)[1])))                 \
145de8cc8edSafresh1            : is ## macro ## _utf8(s))
146de8cc8edSafresh1
147de8cc8edSafresh1/* Create the macro for "is'macro'_LC_utf8_safe(s, e)".  For code points below
148de8cc8edSafresh1 * 256, it calls the equivalent _L1 macro by converting the UTF-8 to code
149de8cc8edSafresh1 * point.  That is so that it can automatically get the bug fixes done in this
150de8cc8edSafresh1 * file. */
151de8cc8edSafresh1#define D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, macro)                          \
152de8cc8edSafresh1   (((e) - (s)) <= 0                                                        \
153de8cc8edSafresh1     ? 0                                                                    \
154de8cc8edSafresh1     : UTF8_IS_INVARIANT((s)[0])                                            \
155de8cc8edSafresh1       ? is ## macro ## _LC((s)[0])                                         \
156de8cc8edSafresh1       : (((e) - (s)) < UTF8SKIP(s))                                        \
157de8cc8edSafresh1          ? 0                                                               \
158de8cc8edSafresh1          : UTF8_IS_DOWNGRADEABLE_START((s)[0])                             \
159de8cc8edSafresh1              /* The cast in the line below is only to silence warnings */  \
160de8cc8edSafresh1            ? is ## macro ## _LC((WIDEST_UTYPE) LATIN1_TO_NATIVE(           \
161de8cc8edSafresh1                                  UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
162de8cc8edSafresh1                                                     & UTF_START_MASK(2),   \
163de8cc8edSafresh1                                                  (s)[1])))                 \
164de8cc8edSafresh1            : is ## macro ## _utf8(s))
165de8cc8edSafresh1
166de8cc8edSafresh1/* A few of the early functions are broken.  For these and the non-LC case,
167de8cc8edSafresh1 * machine generated code is substituted.  But that code doesn't work for
168de8cc8edSafresh1 * locales.  This is just like the above macro, but at the end, we call the
169de8cc8edSafresh1 * macro we've generated for the above 255 case, which is correct since locale
170de8cc8edSafresh1 * isn't involved.  This will generate extra code to handle the 0-255 inputs,
171de8cc8edSafresh1 * but hopefully it will be optimized out by the C compiler.  But just in case
172de8cc8edSafresh1 * it isn't, this macro is only used on the few versions that are broken */
173de8cc8edSafresh1
174de8cc8edSafresh1#define D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, macro)                   \
175de8cc8edSafresh1   (((e) - (s)) <= 0                                                        \
176de8cc8edSafresh1     ? 0                                                                    \
177de8cc8edSafresh1     : UTF8_IS_INVARIANT((s)[0])                                            \
178de8cc8edSafresh1       ? is ## macro ## _LC((s)[0])                                         \
179de8cc8edSafresh1       : (((e) - (s)) < UTF8SKIP(s))                                        \
180de8cc8edSafresh1          ? 0                                                               \
181de8cc8edSafresh1          : UTF8_IS_DOWNGRADEABLE_START((s)[0])                             \
182de8cc8edSafresh1              /* The cast in the line below is only to silence warnings */  \
183de8cc8edSafresh1            ? is ## macro ## _LC((WIDEST_UTYPE) LATIN1_TO_NATIVE(           \
184de8cc8edSafresh1                                  UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
185de8cc8edSafresh1                                                     & UTF_START_MASK(2),   \
186de8cc8edSafresh1                                                  (s)[1])))                 \
187de8cc8edSafresh1            : is ## macro ## _utf8_safe(s, e))
188de8cc8edSafresh1
189de8cc8edSafresh1__UNDEFINED__ SvRX(rv) (SvROK((rv)) ? (SvMAGICAL(SvRV((rv))) ? (mg_find(SvRV((rv)), PERL_MAGIC_qr) ? mg_find(SvRV((rv)), PERL_MAGIC_qr)->mg_obj : NULL) : NULL) : NULL)
1905759b3d2Safresh1__UNDEFINED__ SvRXOK(sv) (!!SvRX(sv))
1915759b3d2Safresh1
1925759b3d2Safresh1#ifndef PERL_UNUSED_DECL
1935759b3d2Safresh1#  ifdef HASATTRIBUTE
1945759b3d2Safresh1#    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
1955759b3d2Safresh1#      define PERL_UNUSED_DECL
1965759b3d2Safresh1#    else
1975759b3d2Safresh1#      define PERL_UNUSED_DECL __attribute__((unused))
1985759b3d2Safresh1#    endif
1995759b3d2Safresh1#  else
2005759b3d2Safresh1#    define PERL_UNUSED_DECL
2015759b3d2Safresh1#  endif
2025759b3d2Safresh1#endif
2035759b3d2Safresh1
2045759b3d2Safresh1#ifndef PERL_UNUSED_ARG
2055759b3d2Safresh1#  if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
2065759b3d2Safresh1#    include <note.h>
2075759b3d2Safresh1#    define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
2085759b3d2Safresh1#  else
2095759b3d2Safresh1#    define PERL_UNUSED_ARG(x) ((void)x)
2105759b3d2Safresh1#  endif
2115759b3d2Safresh1#endif
2125759b3d2Safresh1
2135759b3d2Safresh1#ifndef PERL_UNUSED_VAR
2145759b3d2Safresh1#  define PERL_UNUSED_VAR(x) ((void)x)
2155759b3d2Safresh1#endif
2165759b3d2Safresh1
2175759b3d2Safresh1#ifndef PERL_UNUSED_CONTEXT
2185759b3d2Safresh1#  ifdef USE_ITHREADS
2195759b3d2Safresh1#    define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
2205759b3d2Safresh1#  else
2215759b3d2Safresh1#    define PERL_UNUSED_CONTEXT
2225759b3d2Safresh1#  endif
2235759b3d2Safresh1#endif
2245759b3d2Safresh1
2255759b3d2Safresh1#ifndef PERL_UNUSED_RESULT
2265759b3d2Safresh1#  if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT)
2275759b3d2Safresh1#    define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END
2285759b3d2Safresh1#  else
2295759b3d2Safresh1#    define PERL_UNUSED_RESULT(v) ((void)(v))
2305759b3d2Safresh1#  endif
2315759b3d2Safresh1#endif
2325759b3d2Safresh1
2335759b3d2Safresh1__UNDEFINED__  NOOP          /*EMPTY*/(void)0
234eac174f2Safresh1
235eac174f2Safresh1#if { VERSION < 5.6.1 } && { VERSION < 5.27.7 }
236*3d61058aSafresh1__REDEFINE__ dNOOP struct Perl___notused_struct
237eac174f2Safresh1#endif
2385759b3d2Safresh1
2395759b3d2Safresh1#ifndef NVTYPE
2405759b3d2Safresh1#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
2415759b3d2Safresh1#    define NVTYPE long double
2425759b3d2Safresh1#  else
2435759b3d2Safresh1#    define NVTYPE double
2445759b3d2Safresh1#  endif
2455759b3d2Safresh1typedef NVTYPE NV;
2465759b3d2Safresh1#endif
2475759b3d2Safresh1
2485759b3d2Safresh1#ifndef INT2PTR
2495759b3d2Safresh1#  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
2505759b3d2Safresh1#    define PTRV                  UV
2515759b3d2Safresh1#    define INT2PTR(any,d)        (any)(d)
2525759b3d2Safresh1#  else
2535759b3d2Safresh1#    if PTRSIZE == LONGSIZE
2545759b3d2Safresh1#      define PTRV                unsigned long
2555759b3d2Safresh1#    else
2565759b3d2Safresh1#      define PTRV                unsigned
2575759b3d2Safresh1#    endif
2585759b3d2Safresh1#    define INT2PTR(any,d)        (any)(PTRV)(d)
2595759b3d2Safresh1#  endif
2605759b3d2Safresh1#endif
2615759b3d2Safresh1
2625759b3d2Safresh1#ifndef PTR2ul
2635759b3d2Safresh1#  if PTRSIZE == LONGSIZE
2645759b3d2Safresh1#    define PTR2ul(p)     (unsigned long)(p)
2655759b3d2Safresh1#  else
2665759b3d2Safresh1#    define PTR2ul(p)     INT2PTR(unsigned long,p)
2675759b3d2Safresh1#  endif
2685759b3d2Safresh1#endif
2695759b3d2Safresh1
270*3d61058aSafresh1#ifndef PERL_STACK_OFFSET_DEFINED
271*3d61058aSafresh1  typedef I32 Stack_off_t;
272*3d61058aSafresh1#  define Stack_off_t_MAX I32_MAX
273*3d61058aSafresh1#  define PERL_STACK_OFFSET_DEFINED
274*3d61058aSafresh1#endif
275*3d61058aSafresh1
2765759b3d2Safresh1__UNDEFINED__  PTR2nat(p)      (PTRV)(p)
2775759b3d2Safresh1__UNDEFINED__  NUM2PTR(any,d)  (any)PTR2nat(d)
2785759b3d2Safresh1__UNDEFINED__  PTR2IV(p)       INT2PTR(IV,p)
2795759b3d2Safresh1__UNDEFINED__  PTR2UV(p)       INT2PTR(UV,p)
2805759b3d2Safresh1__UNDEFINED__  PTR2NV(p)       NUM2PTR(NV,p)
2815759b3d2Safresh1
2825759b3d2Safresh1#ifdef __cplusplus
283*3d61058aSafresh1__REDEFINE__ START_EXTERN_C extern "C" {
284*3d61058aSafresh1__REDEFINE__ END_EXTERN_C }
285*3d61058aSafresh1__REDEFINE__ EXTERN_C extern "C"
2865759b3d2Safresh1#else
287*3d61058aSafresh1__REDEFINE__ START_EXTERN_C
288*3d61058aSafresh1__REDEFINE__ END_EXTERN_C
289*3d61058aSafresh1__REDEFINE__ EXTERN_C extern
2905759b3d2Safresh1#endif
2915759b3d2Safresh1
292de8cc8edSafresh1#if { VERSION < 5.004 } || defined(PERL_GCC_PEDANTIC)
2935759b3d2Safresh1#  ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
294de8cc8edSafresh1__UNDEF_NOT_PROVIDED__  PERL_GCC_BRACE_GROUPS_FORBIDDEN
2955759b3d2Safresh1#  endif
2965759b3d2Safresh1#endif
2975759b3d2Safresh1
298eac174f2Safresh1#if  ! defined(__GNUC__) || defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) || defined(__cplusplus)
299eac174f2Safresh1#    undef PERL_USE_GCC_BRACE_GROUPS
300eac174f2Safresh1#else
3015759b3d2Safresh1#  ifndef PERL_USE_GCC_BRACE_GROUPS
3025759b3d2Safresh1#    define PERL_USE_GCC_BRACE_GROUPS
3035759b3d2Safresh1#  endif
3045759b3d2Safresh1#endif
3055759b3d2Safresh1
3065759b3d2Safresh1#if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
307*3d61058aSafresh1__REDEFINE__ STMT_START  if (1)
308*3d61058aSafresh1__REDEFINE__ STMT_END    else (void)0
3095759b3d2Safresh1#else
310*3d61058aSafresh1__REDEFINE__ STMT_START  do
311*3d61058aSafresh1__REDEFINE__ STMT_END    while (0)
3125759b3d2Safresh1#endif
3135759b3d2Safresh1
3145759b3d2Safresh1__UNDEFINED__  boolSV(b)    ((b) ? &PL_sv_yes : &PL_sv_no)
3155759b3d2Safresh1
3165759b3d2Safresh1/* DEFSV appears first in 5.004_56 */
3175759b3d2Safresh1__UNDEFINED__  DEFSV        GvSV(PL_defgv)
3185759b3d2Safresh1__UNDEFINED__  SAVE_DEFSV   SAVESPTR(GvSV(PL_defgv))
3195759b3d2Safresh1__UNDEFINED__  DEFSV_set(sv) (DEFSV = (sv))
3205759b3d2Safresh1
3215759b3d2Safresh1/* Older perls (<=5.003) lack AvFILLp */
3225759b3d2Safresh1__UNDEFINED__  AvFILLp      AvFILL
3235759b3d2Safresh1
324f3efcd01Safresh1__UNDEFINED__  av_tindex    AvFILL
325f3efcd01Safresh1__UNDEFINED__  av_top_index AvFILL
3269a4edab6Sbluhm__UNDEFINED__  av_count(av) (AvFILL(av)+1)
327f3efcd01Safresh1
3285759b3d2Safresh1__UNDEFINED__  ERRSV        get_sv("@",FALSE)
3295759b3d2Safresh1
3305759b3d2Safresh1/* Hint: gv_stashpvn
3315759b3d2Safresh1 * This function's backport doesn't support the length parameter, but
3325759b3d2Safresh1 * rather ignores it. Portability can only be ensured if the length
3335759b3d2Safresh1 * parameter is used for speed reasons, but the length can always be
3345759b3d2Safresh1 * correctly computed from the string argument.
3355759b3d2Safresh1 */
3365759b3d2Safresh1
3375759b3d2Safresh1__UNDEFINED__  gv_stashpvn(str,len,create)  gv_stashpv(str,create)
3385759b3d2Safresh1
3395759b3d2Safresh1/* Replace: 1 */
3405759b3d2Safresh1__UNDEFINED__  get_cv          perl_get_cv
3415759b3d2Safresh1__UNDEFINED__  get_sv          perl_get_sv
3425759b3d2Safresh1__UNDEFINED__  get_av          perl_get_av
3435759b3d2Safresh1__UNDEFINED__  get_hv          perl_get_hv
3445759b3d2Safresh1/* Replace: 0 */
3455759b3d2Safresh1
3465759b3d2Safresh1__UNDEFINED__  dUNDERBAR       dNOOP
3475759b3d2Safresh1__UNDEFINED__  UNDERBAR        DEFSV
3485759b3d2Safresh1
3495759b3d2Safresh1__UNDEFINED__  dAX             I32 ax = MARK - PL_stack_base + 1
3505759b3d2Safresh1__UNDEFINED__  dITEMS          I32 items = SP - MARK
3515759b3d2Safresh1
3525759b3d2Safresh1__UNDEFINED__  dXSTARG         SV * targ = sv_newmortal()
3535759b3d2Safresh1
3545759b3d2Safresh1__UNDEFINED__  dAXMARK         I32 ax = POPMARK; \
3559a4edab6Sbluhm                               SV ** const mark = PL_stack_base + ax++
3565759b3d2Safresh1
3575759b3d2Safresh1
3585759b3d2Safresh1__UNDEFINED__  XSprePUSH       (sp = PL_stack_base + ax - 1)
3595759b3d2Safresh1
3605759b3d2Safresh1#if { VERSION < 5.005 }
361*3d61058aSafresh1__REDEFINE__ XSRETURN(off)                                   \
3625759b3d2Safresh1      STMT_START {                                        \
3635759b3d2Safresh1          PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
3645759b3d2Safresh1          return;                                         \
3655759b3d2Safresh1      } STMT_END
3665759b3d2Safresh1#endif
3675759b3d2Safresh1
3685759b3d2Safresh1__UNDEFINED__  XSPROTO(name)   void name(pTHX_ CV* cv)
3695759b3d2Safresh1__UNDEFINED__  SVfARG(p)       ((void*)(p))
3705759b3d2Safresh1
3715759b3d2Safresh1__UNDEFINED__  PERL_ABS(x)     ((x) < 0 ? -(x) : (x))
3725759b3d2Safresh1
3735759b3d2Safresh1__UNDEFINED__  dVAR            dNOOP
3745759b3d2Safresh1
3755759b3d2Safresh1__UNDEFINED__  SVf             "_"
3765759b3d2Safresh1
3775759b3d2Safresh1__UNDEFINED__  CPERLscope(x)   x
3785759b3d2Safresh1
3795759b3d2Safresh1__UNDEFINED__  PERL_HASH(hash,str,len) \
3805759b3d2Safresh1     STMT_START { \
3815759b3d2Safresh1        const char *s_PeRlHaSh = str; \
3825759b3d2Safresh1        I32 i_PeRlHaSh = len; \
3835759b3d2Safresh1        U32 hash_PeRlHaSh = 0; \
3845759b3d2Safresh1        while (i_PeRlHaSh--) \
3855759b3d2Safresh1            hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
3865759b3d2Safresh1        (hash) = hash_PeRlHaSh; \
3875759b3d2Safresh1    } STMT_END
3885759b3d2Safresh1
3895759b3d2Safresh1#ifndef PERLIO_FUNCS_DECL
3905759b3d2Safresh1# ifdef PERLIO_FUNCS_CONST
3915759b3d2Safresh1#  define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
3925759b3d2Safresh1#  define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
3935759b3d2Safresh1# else
3945759b3d2Safresh1#  define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
3955759b3d2Safresh1#  define PERLIO_FUNCS_CAST(funcs) (funcs)
3965759b3d2Safresh1# endif
3975759b3d2Safresh1#endif
3985759b3d2Safresh1
3995759b3d2Safresh1/* provide these typedefs for older perls */
4005759b3d2Safresh1#if { VERSION < 5.9.3 }
4015759b3d2Safresh1
4025759b3d2Safresh1# ifdef ARGSproto
4035759b3d2Safresh1typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
4045759b3d2Safresh1# else
4055759b3d2Safresh1typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
4065759b3d2Safresh1# endif
4075759b3d2Safresh1
4085759b3d2Safresh1typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
4095759b3d2Safresh1
4105759b3d2Safresh1#endif
4115759b3d2Safresh1
412de8cc8edSafresh1/* On versions without NATIVE_TO_ASCII, only ASCII is supported */
413de8cc8edSafresh1#if defined(EBCDIC) && defined(NATIVE_TO_ASCI)
414de8cc8edSafresh1__UNDEFINED__ NATIVE_TO_LATIN1(c) NATIVE_TO_ASCII(c)
415de8cc8edSafresh1__UNDEFINED__ LATIN1_TO_NATIVE(c) ASCII_TO_NATIVE(c)
416de8cc8edSafresh1__UNDEFINED__ NATIVE_TO_UNI(c) ((c) > 255 ? (c) : NATIVE_TO_LATIN1(c))
417de8cc8edSafresh1__UNDEFINED__ UNI_TO_NATIVE(c) ((c) > 255 ? (c) : LATIN1_TO_NATIVE(c))
418de8cc8edSafresh1#else
419de8cc8edSafresh1__UNDEFINED__ NATIVE_TO_LATIN1(c) (c)
420de8cc8edSafresh1__UNDEFINED__ LATIN1_TO_NATIVE(c) (c)
421de8cc8edSafresh1__UNDEFINED__ NATIVE_TO_UNI(c) (c)
422de8cc8edSafresh1__UNDEFINED__ UNI_TO_NATIVE(c) (c)
423de8cc8edSafresh1#endif
424de8cc8edSafresh1
425de8cc8edSafresh1/* Warning: LATIN1_TO_NATIVE, NATIVE_TO_LATIN1 NATIVE_TO_UNI UNI_TO_NATIVE
426de8cc8edSafresh1   EBCDIC is not supported on versions earlier than 5.7.1
427de8cc8edSafresh1 */
428de8cc8edSafresh1
429de8cc8edSafresh1/* The meaning of this changed; use the modern version */
430de8cc8edSafresh1#undef isPSXSPC
431de8cc8edSafresh1#undef isPSXSPC_A
432de8cc8edSafresh1#undef isPSXSPC_L1
433de8cc8edSafresh1
434de8cc8edSafresh1/* Hint: isPSXSPC, isPSXSPC_A, isPSXSPC_L1, isPSXSPC_utf8_safe
435de8cc8edSafresh1    This is equivalent to the corresponding isSPACE-type macro.  On perls
436de8cc8edSafresh1    before 5.18, this matched a vertical tab and SPACE didn't.  But the
437de8cc8edSafresh1    ppport.h SPACE version does match VT in all perl releases.  Since VT's are
438de8cc8edSafresh1    extremely rarely found in real-life files, this difference effectively
439de8cc8edSafresh1    doesn't matter */
440de8cc8edSafresh1
441de8cc8edSafresh1/* Hint: isSPACE, isSPACE_A, isSPACE_L1, isSPACE_utf8_safe
442de8cc8edSafresh1    Until Perl 5.18, this did not match the vertical tab (VT).  The ppport.h
443de8cc8edSafresh1    version does match it in all perl releases. Since VT's are extremely rarely
444de8cc8edSafresh1    found in real-life files, this difference effectively doesn't matter */
445de8cc8edSafresh1
446f3efcd01Safresh1#ifdef EBCDIC
447f3efcd01Safresh1
448de8cc8edSafresh1/* This is the first version where these macros are fully correct on EBCDIC
4499a4edab6Sbluhm * platforms.  Relying on the C library functions, as earlier releases did,
4509a4edab6Sbluhm * causes problems with locales */
451f3efcd01Safresh1# if { VERSION < 5.22.0 }
452f3efcd01Safresh1#  undef isALNUM
453f3efcd01Safresh1#  undef isALNUM_A
454de8cc8edSafresh1#  undef isALNUM_L1
455f3efcd01Safresh1#  undef isALNUMC
456f3efcd01Safresh1#  undef isALNUMC_A
457de8cc8edSafresh1#  undef isALNUMC_L1
458f3efcd01Safresh1#  undef isALPHA
459f3efcd01Safresh1#  undef isALPHA_A
460de8cc8edSafresh1#  undef isALPHA_L1
461f3efcd01Safresh1#  undef isALPHANUMERIC
462f3efcd01Safresh1#  undef isALPHANUMERIC_A
463de8cc8edSafresh1#  undef isALPHANUMERIC_L1
464f3efcd01Safresh1#  undef isASCII
465f3efcd01Safresh1#  undef isASCII_A
466de8cc8edSafresh1#  undef isASCII_L1
467f3efcd01Safresh1#  undef isBLANK
468f3efcd01Safresh1#  undef isBLANK_A
469de8cc8edSafresh1#  undef isBLANK_L1
470f3efcd01Safresh1#  undef isCNTRL
471f3efcd01Safresh1#  undef isCNTRL_A
472de8cc8edSafresh1#  undef isCNTRL_L1
473f3efcd01Safresh1#  undef isDIGIT
474f3efcd01Safresh1#  undef isDIGIT_A
475de8cc8edSafresh1#  undef isDIGIT_L1
476f3efcd01Safresh1#  undef isGRAPH
477f3efcd01Safresh1#  undef isGRAPH_A
478de8cc8edSafresh1#  undef isGRAPH_L1
479f3efcd01Safresh1#  undef isIDCONT
480f3efcd01Safresh1#  undef isIDCONT_A
481de8cc8edSafresh1#  undef isIDCONT_L1
482f3efcd01Safresh1#  undef isIDFIRST
483f3efcd01Safresh1#  undef isIDFIRST_A
484de8cc8edSafresh1#  undef isIDFIRST_L1
485f3efcd01Safresh1#  undef isLOWER
486f3efcd01Safresh1#  undef isLOWER_A
487de8cc8edSafresh1#  undef isLOWER_L1
488f3efcd01Safresh1#  undef isOCTAL
489f3efcd01Safresh1#  undef isOCTAL_A
490de8cc8edSafresh1#  undef isOCTAL_L1
491f3efcd01Safresh1#  undef isPRINT
492f3efcd01Safresh1#  undef isPRINT_A
493de8cc8edSafresh1#  undef isPRINT_L1
494f3efcd01Safresh1#  undef isPUNCT
495f3efcd01Safresh1#  undef isPUNCT_A
496de8cc8edSafresh1#  undef isPUNCT_L1
497f3efcd01Safresh1#  undef isSPACE
498f3efcd01Safresh1#  undef isSPACE_A
499de8cc8edSafresh1#  undef isSPACE_L1
500f3efcd01Safresh1#  undef isUPPER
501f3efcd01Safresh1#  undef isUPPER_A
502de8cc8edSafresh1#  undef isUPPER_L1
503f3efcd01Safresh1#  undef isWORDCHAR
504f3efcd01Safresh1#  undef isWORDCHAR_A
505de8cc8edSafresh1#  undef isWORDCHAR_L1
506f3efcd01Safresh1#  undef isXDIGIT
507f3efcd01Safresh1#  undef isXDIGIT_A
508de8cc8edSafresh1#  undef isXDIGIT_L1
509f3efcd01Safresh1# endif
510f3efcd01Safresh1
511f3efcd01Safresh1__UNDEFINED__ isASCII(c)    (isCNTRL(c) || isPRINT(c))
512f3efcd01Safresh1
513f3efcd01Safresh1        /* The below is accurate for all EBCDIC code pages supported by
514f3efcd01Safresh1         * all the versions of Perl overridden by this */
515f3efcd01Safresh1__UNDEFINED__ isCNTRL(c)    (    (c) == '\0' || (c) == '\a' || (c) == '\b'      \
516f3efcd01Safresh1                             ||  (c) == '\f' || (c) == '\n' || (c) == '\r'      \
517f3efcd01Safresh1                             ||  (c) == '\t' || (c) == '\v'                     \
518f3efcd01Safresh1                             || ((c) <= 3 && (c) >= 1) /* SOH, STX, ETX */      \
519f3efcd01Safresh1                             ||  (c) == 7    /* U+7F DEL */                     \
520f3efcd01Safresh1                             || ((c) <= 0x13 && (c) >= 0x0E) /* SO, SI */       \
521f3efcd01Safresh1                                                      /* DLE, DC[1-3] */        \
522f3efcd01Safresh1                             ||  (c) == 0x18 /* U+18 CAN */                     \
523f3efcd01Safresh1                             ||  (c) == 0x19 /* U+19 EOM */                     \
524f3efcd01Safresh1                             || ((c) <= 0x1F && (c) >= 0x1C) /* [FGRU]S */      \
525f3efcd01Safresh1                             ||  (c) == 0x26 /* U+17 ETB */                     \
526f3efcd01Safresh1                             ||  (c) == 0x27 /* U+1B ESC */                     \
527f3efcd01Safresh1                             ||  (c) == 0x2D /* U+05 ENQ */                     \
528f3efcd01Safresh1                             ||  (c) == 0x2E /* U+06 ACK */                     \
529f3efcd01Safresh1                             ||  (c) == 0x32 /* U+16 SYN */                     \
530f3efcd01Safresh1                             ||  (c) == 0x37 /* U+04 EOT */                     \
531f3efcd01Safresh1                             ||  (c) == 0x3C /* U+14 DC4 */                     \
532f3efcd01Safresh1                             ||  (c) == 0x3D /* U+15 NAK */                     \
533f3efcd01Safresh1                             ||  (c) == 0x3F /* U+1A SUB */                     \
534f3efcd01Safresh1                            )
535de8cc8edSafresh1
536de8cc8edSafresh1#if '^' == 106    /* EBCDIC POSIX-BC */
537de8cc8edSafresh1#  define D_PPP_OUTLIER_CONTROL 0x5F
538de8cc8edSafresh1#else   /* EBCDIC 1047 037 */
539de8cc8edSafresh1#  define D_PPP_OUTLIER_CONTROL 0xFF
540de8cc8edSafresh1#endif
541de8cc8edSafresh1
542de8cc8edSafresh1/* The controls are everything below blank, plus one outlier */
543de8cc8edSafresh1__UNDEFINED__ isCNTRL_L1(c) ((WIDEST_UTYPE) (c) < ' '                           \
544de8cc8edSafresh1                          || (WIDEST_UTYPE) (c) == D_PPP_OUTLIER_CONTROL)
545f3efcd01Safresh1/* The ordering of the tests in this and isUPPER are to exclude most characters
546f3efcd01Safresh1 * early */
547f3efcd01Safresh1__UNDEFINED__ isLOWER(c)    (        (c) >= 'a' && (c) <= 'z'                   \
548f3efcd01Safresh1                             &&  (   (c) <= 'i'                                 \
549f3efcd01Safresh1                                 || ((c) >= 'j' && (c) <= 'r')                  \
550f3efcd01Safresh1                                 ||  (c) >= 's'))
551f3efcd01Safresh1__UNDEFINED__ isUPPER(c)    (        (c) >= 'A' && (c) <= 'Z'                   \
552f3efcd01Safresh1                             && (    (c) <= 'I'                                 \
553f3efcd01Safresh1                                 || ((c) >= 'J' && (c) <= 'R')                  \
554f3efcd01Safresh1                                 ||  (c) >= 'S'))
555f3efcd01Safresh1
556f3efcd01Safresh1#else   /* Above is EBCDIC; below is ASCII */
557f3efcd01Safresh1
558f3efcd01Safresh1# if { VERSION < 5.4.0 }
559f3efcd01Safresh1/* The implementation of these in older perl versions can give wrong results if
560f3efcd01Safresh1 * the C program locale is set to other than the C locale */
561f3efcd01Safresh1#  undef isALNUM
562f3efcd01Safresh1#  undef isALNUM_A
563f3efcd01Safresh1#  undef isALPHA
564f3efcd01Safresh1#  undef isALPHA_A
565f3efcd01Safresh1#  undef isDIGIT
566f3efcd01Safresh1#  undef isDIGIT_A
567f3efcd01Safresh1#  undef isIDFIRST
568f3efcd01Safresh1#  undef isIDFIRST_A
569f3efcd01Safresh1#  undef isLOWER
570f3efcd01Safresh1#  undef isLOWER_A
571f3efcd01Safresh1#  undef isUPPER
572f3efcd01Safresh1#  undef isUPPER_A
573f3efcd01Safresh1# endif
574f3efcd01Safresh1
575de8cc8edSafresh1#  if { VERSION == 5.7.0 } /* this perl made space GRAPH */
576de8cc8edSafresh1#    undef isGRAPH
577de8cc8edSafresh1#  endif
578de8cc8edSafresh1
579de8cc8edSafresh1# if { VERSION < 5.8.0 } /* earlier perls omitted DEL */
580f3efcd01Safresh1#  undef isCNTRL
581f3efcd01Safresh1# endif
582f3efcd01Safresh1
583f3efcd01Safresh1# if { VERSION < 5.10.0 }
584de8cc8edSafresh1/* earlier perls included all of the isSPACE() characters, which is wrong. The
585de8cc8edSafresh1 * version provided by Devel::PPPort always overrides an existing buggy
586de8cc8edSafresh1 * version. */
587f3efcd01Safresh1#  undef isPRINT
588f3efcd01Safresh1#  undef isPRINT_A
589f3efcd01Safresh1# endif
590f3efcd01Safresh1
591f3efcd01Safresh1# if { VERSION < 5.14.0 }
592de8cc8edSafresh1/* earlier perls always returned true if the parameter was a signed char */
593f3efcd01Safresh1#  undef isASCII
594f3efcd01Safresh1#  undef isASCII_A
595f3efcd01Safresh1# endif
596f3efcd01Safresh1
597de8cc8edSafresh1# if { VERSION < 5.17.8 } /* earlier perls didn't include PILCROW, SECTION SIGN */
598de8cc8edSafresh1#  undef isPUNCT_L1
599de8cc8edSafresh1# endif
600de8cc8edSafresh1
601de8cc8edSafresh1# if { VERSION < 5.13.7 } /* khw didn't investigate why this failed */
602de8cc8edSafresh1#  undef isALNUMC_L1
603de8cc8edSafresh1#endif
604de8cc8edSafresh1
605de8cc8edSafresh1# if { VERSION < 5.20.0 } /* earlier perls didn't include \v */
606f3efcd01Safresh1#  undef isSPACE
607f3efcd01Safresh1#  undef isSPACE_A
608de8cc8edSafresh1#  undef isSPACE_L1
609de8cc8edSafresh1
610f3efcd01Safresh1# endif
611f3efcd01Safresh1
6125759b3d2Safresh1__UNDEFINED__ isASCII(c)        ((WIDEST_UTYPE) (c) <= 127)
6135759b3d2Safresh1__UNDEFINED__ isCNTRL(c)        ((WIDEST_UTYPE) (c) < ' ' || (c) == 127)
6149a4edab6Sbluhm__UNDEFINED__ isCNTRL_L1(c)     (   (WIDEST_UTYPE) (c) < ' '                \
6159a4edab6Sbluhm                                 || inRANGE((c), 0x7F, 0x9F))
6169a4edab6Sbluhm__UNDEFINED__ isLOWER(c)        inRANGE((c), 'a', 'z')
6179a4edab6Sbluhm__UNDEFINED__ isUPPER(c)        inRANGE((c), 'A', 'Z')
618de8cc8edSafresh1
619f3efcd01Safresh1#endif /* Below are definitions common to EBCDIC and ASCII */
620f3efcd01Safresh1
621de8cc8edSafresh1__UNDEFINED__ isASCII_L1(c)     isASCII(c)
622de8cc8edSafresh1__UNDEFINED__ isASCII_LC(c)     isASCII(c)
623f3efcd01Safresh1__UNDEFINED__ isALNUM(c)        isWORDCHAR(c)
624f3efcd01Safresh1__UNDEFINED__ isALNUMC(c)       isALPHANUMERIC(c)
625de8cc8edSafresh1__UNDEFINED__ isALNUMC_L1(c)    isALPHANUMERIC_L1(c)
626f3efcd01Safresh1__UNDEFINED__ isALPHA(c)        (isUPPER(c) || isLOWER(c))
627de8cc8edSafresh1__UNDEFINED__ isALPHA_L1(c)     (isUPPER_L1(c) || isLOWER_L1(c))
628f3efcd01Safresh1__UNDEFINED__ isALPHANUMERIC(c) (isALPHA(c) || isDIGIT(c))
629de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_L1(c) (isALPHA_L1(c) || isDIGIT(c))
630de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_LC(c) (isALPHA_LC(c) || isDIGIT_LC(c))
631f3efcd01Safresh1__UNDEFINED__ isBLANK(c)        ((c) == ' ' || (c) == '\t')
632de8cc8edSafresh1__UNDEFINED__ isBLANK_L1(c) (    isBLANK(c)                                    \
633de8cc8edSafresh1                             || (   FITS_IN_8_BITS(c)                          \
634de8cc8edSafresh1                                 && NATIVE_TO_LATIN1((U8) c) == 0xA0))
635de8cc8edSafresh1__UNDEFINED__ isBLANK_LC(c)     isBLANK(c)
636de8cc8edSafresh1__UNDEFINED__ isDIGIT(c)        inRANGE(c, '0', '9')
637de8cc8edSafresh1__UNDEFINED__ isDIGIT_L1(c)     isDIGIT(c)
638f3efcd01Safresh1__UNDEFINED__ isGRAPH(c)        (isWORDCHAR(c) || isPUNCT(c))
639de8cc8edSafresh1__UNDEFINED__ isGRAPH_L1(c)     (   isPRINT_L1(c)                              \
640de8cc8edSafresh1                                 && (c) != ' '                                 \
641de8cc8edSafresh1                                 && NATIVE_TO_LATIN1((U8) c) != 0xA0)
642f3efcd01Safresh1__UNDEFINED__ isIDCONT(c)       isWORDCHAR(c)
643de8cc8edSafresh1__UNDEFINED__ isIDCONT_L1(c)	isWORDCHAR_L1(c)
644de8cc8edSafresh1__UNDEFINED__ isIDCONT_LC(c)    isWORDCHAR_LC(c)
645f3efcd01Safresh1__UNDEFINED__ isIDFIRST(c)      (isALPHA(c) || (c) == '_')
646de8cc8edSafresh1__UNDEFINED__ isIDFIRST_L1(c)   (isALPHA_L1(c) || (U8) (c) == '_')
647de8cc8edSafresh1__UNDEFINED__ isIDFIRST_LC(c)   (isALPHA_LC(c) || (U8) (c) == '_')
648de8cc8edSafresh1__UNDEFINED__ isLOWER_L1(c) (    isLOWER(c)                                    \
649de8cc8edSafresh1                             || (   FITS_IN_8_BITS(c)                          \
650de8cc8edSafresh1                                 && (  (   NATIVE_TO_LATIN1((U8) c) >= 0xDF    \
651de8cc8edSafresh1                                        && NATIVE_TO_LATIN1((U8) c) != 0xF7)   \
652de8cc8edSafresh1                                     || NATIVE_TO_LATIN1((U8) c) == 0xAA       \
653de8cc8edSafresh1                                     || NATIVE_TO_LATIN1((U8) c) == 0xBA       \
654de8cc8edSafresh1                                     || NATIVE_TO_LATIN1((U8) c) == 0xB5)))
655f3efcd01Safresh1__UNDEFINED__ isOCTAL(c)        (((WIDEST_UTYPE)((c)) & ~7) == '0')
656de8cc8edSafresh1__UNDEFINED__ isOCTAL_L1(c)     isOCTAL(c)
657f3efcd01Safresh1__UNDEFINED__ isPRINT(c)        (isGRAPH(c) || (c) == ' ')
658de8cc8edSafresh1__UNDEFINED__ isPRINT_L1(c)     (FITS_IN_8_BITS(c) && ! isCNTRL_L1(c))
659f3efcd01Safresh1__UNDEFINED__ isPSXSPC(c)       isSPACE(c)
660de8cc8edSafresh1__UNDEFINED__ isPSXSPC_L1(c)    isSPACE_L1(c)
661f3efcd01Safresh1__UNDEFINED__ isPUNCT(c)    (   (c) == '-' || (c) == '!' || (c) == '"'         \
662f3efcd01Safresh1                             || (c) == '#' || (c) == '$' || (c) == '%'         \
663f3efcd01Safresh1                             || (c) == '&' || (c) == '\'' || (c) == '('        \
664f3efcd01Safresh1                             || (c) == ')' || (c) == '*' || (c) == '+'         \
665f3efcd01Safresh1                             || (c) == ',' || (c) == '.' || (c) == '/'         \
666f3efcd01Safresh1                             || (c) == ':' || (c) == ';' || (c) == '<'         \
667f3efcd01Safresh1                             || (c) == '=' || (c) == '>' || (c) == '?'         \
668f3efcd01Safresh1                             || (c) == '@' || (c) == '[' || (c) == '\\'        \
669f3efcd01Safresh1                             || (c) == ']' || (c) == '^' || (c) == '_'         \
670f3efcd01Safresh1                             || (c) == '`' || (c) == '{' || (c) == '|'         \
671f3efcd01Safresh1                             || (c) == '}' || (c) == '~')
672de8cc8edSafresh1__UNDEFINED__ isPUNCT_L1(c)  (    isPUNCT(c)                                   \
673de8cc8edSafresh1                              || (  FITS_IN_8_BITS(c)                          \
674de8cc8edSafresh1                                  && (   NATIVE_TO_LATIN1((U8) c) == 0xA1      \
675de8cc8edSafresh1                                      || NATIVE_TO_LATIN1((U8) c) == 0xA7      \
676de8cc8edSafresh1                                      || NATIVE_TO_LATIN1((U8) c) == 0xAB      \
677de8cc8edSafresh1                                      || NATIVE_TO_LATIN1((U8) c) == 0xB6      \
678de8cc8edSafresh1                                      || NATIVE_TO_LATIN1((U8) c) == 0xB7      \
679de8cc8edSafresh1                                      || NATIVE_TO_LATIN1((U8) c) == 0xBB      \
680de8cc8edSafresh1                                      || NATIVE_TO_LATIN1((U8) c) == 0xBF)))
681f3efcd01Safresh1__UNDEFINED__ isSPACE(c)        (   isBLANK(c) || (c) == '\n' || (c) == '\r'   \
682f3efcd01Safresh1                                 || (c) == '\v' || (c) == '\f')
683de8cc8edSafresh1__UNDEFINED__ isSPACE_L1(c) (    isSPACE(c)                                    \
684de8cc8edSafresh1                             || (FITS_IN_8_BITS(c)                             \
685de8cc8edSafresh1                                 && (   NATIVE_TO_LATIN1((U8) c) == 0x85       \
686de8cc8edSafresh1                                     || NATIVE_TO_LATIN1((U8) c) == 0xA0)))
687de8cc8edSafresh1__UNDEFINED__ isUPPER_L1(c) (   isUPPER(c)                                     \
688de8cc8edSafresh1                             || (FITS_IN_8_BITS(c)                             \
689de8cc8edSafresh1                                 && (   NATIVE_TO_LATIN1((U8) c) >= 0xC0       \
690de8cc8edSafresh1                                     && NATIVE_TO_LATIN1((U8) c) <= 0xDE       \
691de8cc8edSafresh1                                     && NATIVE_TO_LATIN1((U8) c) != 0xD7)))
692f3efcd01Safresh1__UNDEFINED__ isWORDCHAR(c)     (isALPHANUMERIC(c) || (c) == '_')
693de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_L1(c)  (isIDFIRST_L1(c) || isDIGIT(c))
694de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_LC(c)  (isIDFIRST_LC(c) || isDIGIT_LC(c))
695f3efcd01Safresh1__UNDEFINED__ isXDIGIT(c)       (   isDIGIT(c)                                 \
6969a4edab6Sbluhm                                 || inRANGE((c), 'a', 'f')                     \
6979a4edab6Sbluhm                                 || inRANGE((c), 'A', 'F'))
698de8cc8edSafresh1__UNDEFINED__ isXDIGIT_L1(c)    isXDIGIT(c)
699de8cc8edSafresh1__UNDEFINED__ isXDIGIT_LC(c)    isxdigit(c)
700f3efcd01Safresh1
701de8cc8edSafresh1__UNDEFINED__ isALNUM_A(c)         isALNUM(c)
702de8cc8edSafresh1__UNDEFINED__ isALNUMC_A(c)        isALNUMC(c)
703de8cc8edSafresh1__UNDEFINED__ isALPHA_A(c)         isALPHA(c)
704de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_A(c)  isALPHANUMERIC(c)
705de8cc8edSafresh1__UNDEFINED__ isASCII_A(c)         isASCII(c)
706de8cc8edSafresh1__UNDEFINED__ isBLANK_A(c)         isBLANK(c)
707de8cc8edSafresh1__UNDEFINED__ isCNTRL_A(c)         isCNTRL(c)
708de8cc8edSafresh1__UNDEFINED__ isDIGIT_A(c)         isDIGIT(c)
709de8cc8edSafresh1__UNDEFINED__ isGRAPH_A(c)         isGRAPH(c)
710de8cc8edSafresh1__UNDEFINED__ isIDCONT_A(c)        isIDCONT(c)
711de8cc8edSafresh1__UNDEFINED__ isIDFIRST_A(c)       isIDFIRST(c)
712de8cc8edSafresh1__UNDEFINED__ isLOWER_A(c)         isLOWER(c)
713de8cc8edSafresh1__UNDEFINED__ isOCTAL_A(c)         isOCTAL(c)
714de8cc8edSafresh1__UNDEFINED__ isPRINT_A(c)         isPRINT(c)
715de8cc8edSafresh1__UNDEFINED__ isPSXSPC_A(c)        isPSXSPC(c)
716de8cc8edSafresh1__UNDEFINED__ isPUNCT_A(c)         isPUNCT(c)
717de8cc8edSafresh1__UNDEFINED__ isSPACE_A(c)         isSPACE(c)
718de8cc8edSafresh1__UNDEFINED__ isUPPER_A(c)         isUPPER(c)
719de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_A(c)	   isWORDCHAR(c)
720de8cc8edSafresh1__UNDEFINED__ isXDIGIT_A(c)	   isXDIGIT(c)
721de8cc8edSafresh1
722de8cc8edSafresh1__UNDEFINED__ isASCII_utf8_safe(s,e)  (((e) - (s)) <= 0 ? 0 : isASCII(*(s)))
723de8cc8edSafresh1__UNDEFINED__ isASCII_uvchr(c)    (FITS_IN_8_BITS(c) ? isASCII_L1(c) : 0)
724de8cc8edSafresh1
725de8cc8edSafresh1#if { VERSION >= 5.006 }
726de8cc8edSafresh1#  ifdef isALPHA_uni    /* If one defined, all are; this is just an exemplar */
727de8cc8edSafresh1#    define D_PPP_is_ctype(upper, lower, c)                                 \
728de8cc8edSafresh1        (FITS_IN_8_BITS(c)                                                  \
729de8cc8edSafresh1        ? is ## upper ## _L1(c)                                             \
730de8cc8edSafresh1        : is ## upper ## _uni((UV) (c)))    /* _uni is old synonym */
731de8cc8edSafresh1#  else
732de8cc8edSafresh1#    define D_PPP_is_ctype(upper, lower, c)                                 \
733de8cc8edSafresh1        (FITS_IN_8_BITS(c)                                                  \
734de8cc8edSafresh1        ? is ## upper ## _L1(c)                                             \
735de8cc8edSafresh1        : is_uni_ ## lower((UV) (c)))     /* is_uni_ is even older */
736de8cc8edSafresh1#  endif
737de8cc8edSafresh1
738de8cc8edSafresh1__UNDEFINED__ isALPHA_uvchr(c)    D_PPP_is_ctype(ALPHA, alpha, c)
739de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_uvchr(c) (isALPHA_uvchr(c) || isDIGIT_uvchr(c))
740de8cc8edSafresh1#  ifdef is_uni_blank
741de8cc8edSafresh1__UNDEFINED__ isBLANK_uvchr(c)    D_PPP_is_ctype(BLANK, blank, c)
742de8cc8edSafresh1#  else
743de8cc8edSafresh1__UNDEFINED__ isBLANK_uvchr(c)  (FITS_IN_8_BITS(c)                          \
744de8cc8edSafresh1                                 ? isBLANK_L1(c)                            \
745de8cc8edSafresh1                                 : (   (UV) (c) == 0x1680 /* Unicode 3.0 */ \
746de8cc8edSafresh1                                    || inRANGE((UV) (c), 0x2000, 0x200A)    \
747de8cc8edSafresh1                                    || (UV) (c) == 0x202F  /* Unicode 3.0 */\
748de8cc8edSafresh1                                    || (UV) (c) == 0x205F  /* Unicode 3.2 */\
749de8cc8edSafresh1                                    || (UV) (c) == 0x3000))
750de8cc8edSafresh1#  endif
751de8cc8edSafresh1__UNDEFINED__ isCNTRL_uvchr(c)    D_PPP_is_ctype(CNTRL, cntrl, c)
752de8cc8edSafresh1__UNDEFINED__ isDIGIT_uvchr(c)    D_PPP_is_ctype(DIGIT, digit, c)
753de8cc8edSafresh1__UNDEFINED__ isGRAPH_uvchr(c)    D_PPP_is_ctype(GRAPH, graph, c)
754de8cc8edSafresh1__UNDEFINED__ isIDCONT_uvchr(c)   isWORDCHAR_uvchr(c)
755de8cc8edSafresh1__UNDEFINED__ isIDFIRST_uvchr(c)  D_PPP_is_ctype(IDFIRST, idfirst, c)
756de8cc8edSafresh1__UNDEFINED__ isLOWER_uvchr(c)    D_PPP_is_ctype(LOWER, lower, c)
757de8cc8edSafresh1__UNDEFINED__ isPRINT_uvchr(c)    D_PPP_is_ctype(PRINT, print, c)
758de8cc8edSafresh1__UNDEFINED__ isPSXSPC_uvchr(c)   isSPACE_uvchr(c)
759de8cc8edSafresh1__UNDEFINED__ isPUNCT_uvchr(c)    D_PPP_is_ctype(PUNCT, punct, c)
760de8cc8edSafresh1__UNDEFINED__ isSPACE_uvchr(c)    D_PPP_is_ctype(SPACE, space, c)
761de8cc8edSafresh1__UNDEFINED__ isUPPER_uvchr(c)    D_PPP_is_ctype(UPPER, upper, c)
762de8cc8edSafresh1__UNDEFINED__ isXDIGIT_uvchr(c)   D_PPP_is_ctype(XDIGIT, xdigit, c)
763de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_uvchr(c) (FITS_IN_8_BITS(c)                        \
764de8cc8edSafresh1                               ? isWORDCHAR_L1(c) : isALPHANUMERIC_uvchr(c))
765de8cc8edSafresh1
766de8cc8edSafresh1__UNDEFINED__ isALPHA_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, ALPHA)
767de8cc8edSafresh1#  ifdef isALPHANUMERIC_utf8
768de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_utf8_safe(s,e)                                 \
769de8cc8edSafresh1                                D_PPP_IS_GENERIC_UTF8_SAFE(s, e, ALPHANUMERIC)
770de8cc8edSafresh1#  else
771de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_utf8_safe(s,e)				    \
772de8cc8edSafresh1                        (isALPHA_utf8_safe(s,e) || isDIGIT_utf8_safe(s,e))
773de8cc8edSafresh1#  endif
774de8cc8edSafresh1
775de8cc8edSafresh1/* This was broken before 5.18, and just use this instead of worrying about
776de8cc8edSafresh1 * which releases the official works on */
777de8cc8edSafresh1#  if 'A' == 65
778de8cc8edSafresh1__UNDEFINED__  isBLANK_utf8_safe(s,e)                                       \
779de8cc8edSafresh1( ( LIKELY((e) > (s)) ) ?   /* Machine generated */                         \
780de8cc8edSafresh1    ( ( 0x09 == ((const U8*)s)[0] || 0x20 == ((const U8*)s)[0] ) ? 1        \
781de8cc8edSafresh1    : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ?                              \
782de8cc8edSafresh1	    ( ( 0xC2 == ((const U8*)s)[0] ) ?                               \
783de8cc8edSafresh1		( ( 0xA0 == ((const U8*)s)[1] ) ? 2 : 0 )                   \
784de8cc8edSafresh1	    : ( 0xE1 == ((const U8*)s)[0] ) ?                               \
785de8cc8edSafresh1		( ( ( 0x9A == ((const U8*)s)[1] ) && ( 0x80 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
786de8cc8edSafresh1	    : ( 0xE2 == ((const U8*)s)[0] ) ?                               \
787de8cc8edSafresh1		( ( 0x80 == ((const U8*)s)[1] ) ?                           \
788de8cc8edSafresh1		    ( ( inRANGE(((const U8*)s)[2], 0x80, 0x8A ) || 0xAF == ((const U8*)s)[2] ) ? 3 : 0 )\
789de8cc8edSafresh1		: ( ( 0x81 == ((const U8*)s)[1] ) && ( 0x9F == ((const U8*)s)[2] ) ) ? 3 : 0 )\
790de8cc8edSafresh1	    : ( ( ( 0xE3 == ((const U8*)s)[0] ) && ( 0x80 == ((const U8*)s)[1] ) ) && ( 0x80 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
791de8cc8edSafresh1	: 0 )                                                               \
792de8cc8edSafresh1 : 0 )
793de8cc8edSafresh1
794de8cc8edSafresh1#  elif 'A' == 193  && '^' == 95 /* EBCDIC 1047 */
795de8cc8edSafresh1
796de8cc8edSafresh1__UNDEFINED__  isBLANK_utf8_safe(s,e)                                       \
797de8cc8edSafresh1( ( LIKELY((e) > (s)) ) ?                                                   \
798de8cc8edSafresh1    ( ( 0x05 == ((const U8*)s)[0] || 0x40 == ((const U8*)s)[0] ) ? 1        \
799de8cc8edSafresh1    : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ?                              \
800de8cc8edSafresh1	    ( ( 0x80 == ((const U8*)s)[0] ) ?                               \
801de8cc8edSafresh1		( ( 0x41 == ((const U8*)s)[1] ) ? 2 : 0 )                   \
802de8cc8edSafresh1	    : ( 0xBC == ((const U8*)s)[0] ) ?                               \
803de8cc8edSafresh1		( ( ( 0x63 == ((const U8*)s)[1] ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
804de8cc8edSafresh1	    : ( 0xCA == ((const U8*)s)[0] ) ?                               \
805de8cc8edSafresh1		( ( 0x41 == ((const U8*)s)[1] ) ?                           \
806de8cc8edSafresh1		    ( ( inRANGE(((const U8*)s)[2], 0x41, 0x4A ) || 0x51 == ((const U8*)s)[2] ) ? 3 : 0 )\
807de8cc8edSafresh1		: ( 0x42 == ((const U8*)s)[1] ) ?                           \
808de8cc8edSafresh1		    ( ( 0x56 == ((const U8*)s)[2] ) ? 3 : 0 )               \
809de8cc8edSafresh1		: ( ( 0x43 == ((const U8*)s)[1] ) && ( 0x73 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
810de8cc8edSafresh1	    : ( ( ( 0xCE == ((const U8*)s)[0] ) && ( 0x41 == ((const U8*)s)[1] ) ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
811de8cc8edSafresh1	: 0 )                                                               \
812de8cc8edSafresh1: 0 )
813de8cc8edSafresh1
814de8cc8edSafresh1#  elif 'A' == 193  && '^' == 176 /* EBCDIC 037 */
815de8cc8edSafresh1
816de8cc8edSafresh1__UNDEFINED__  isBLANK_utf8_safe(s,e)                                       \
817de8cc8edSafresh1( ( LIKELY((e) > (s)) ) ?                                                   \
818de8cc8edSafresh1    ( ( 0x05 == ((const U8*)s)[0] || 0x40 == ((const U8*)s)[0] ) ? 1        \
819de8cc8edSafresh1    : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ?                              \
820de8cc8edSafresh1	    ( ( 0x78 == ((const U8*)s)[0] ) ?                               \
821de8cc8edSafresh1		( ( 0x41 == ((const U8*)s)[1] ) ? 2 : 0 )                   \
822de8cc8edSafresh1	    : ( 0xBD == ((const U8*)s)[0] ) ?                               \
823de8cc8edSafresh1		( ( ( 0x62 == ((const U8*)s)[1] ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
824de8cc8edSafresh1	    : ( 0xCA == ((const U8*)s)[0] ) ?                               \
825de8cc8edSafresh1		( ( 0x41 == ((const U8*)s)[1] ) ?                           \
826de8cc8edSafresh1		    ( ( inRANGE(((const U8*)s)[2], 0x41, 0x4A ) || 0x51 == ((const U8*)s)[2] ) ? 3 : 0 )\
827de8cc8edSafresh1		: ( 0x42 == ((const U8*)s)[1] ) ?                           \
828de8cc8edSafresh1		    ( ( 0x56 == ((const U8*)s)[2] ) ? 3 : 0 )               \
829de8cc8edSafresh1		: ( ( 0x43 == ((const U8*)s)[1] ) && ( 0x72 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
830de8cc8edSafresh1	    : ( ( ( 0xCE == ((const U8*)s)[0] ) && ( 0x41 == ((const U8*)s)[1] ) ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
831de8cc8edSafresh1	: 0 )                                                               \
832de8cc8edSafresh1: 0 )
833de8cc8edSafresh1
834de8cc8edSafresh1#  else
835de8cc8edSafresh1#    error Unknown character set
836de8cc8edSafresh1#  endif
837de8cc8edSafresh1
838de8cc8edSafresh1__UNDEFINED__ isCNTRL_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, CNTRL)
839de8cc8edSafresh1__UNDEFINED__ isDIGIT_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, DIGIT)
840de8cc8edSafresh1__UNDEFINED__ isGRAPH_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, GRAPH)
841de8cc8edSafresh1#  ifdef isIDCONT_utf8
842de8cc8edSafresh1__UNDEFINED__ isIDCONT_utf8_safe(s,e)   D_PPP_IS_GENERIC_UTF8_SAFE(s, e, IDCONT)
843de8cc8edSafresh1#  else
844de8cc8edSafresh1__UNDEFINED__ isIDCONT_utf8_safe(s,e)   isWORDCHAR_utf8_safe(s,e)
845de8cc8edSafresh1#  endif
846de8cc8edSafresh1
847de8cc8edSafresh1__UNDEFINED__ isIDFIRST_utf8_safe(s,e)  D_PPP_IS_GENERIC_UTF8_SAFE(s, e, IDFIRST)
848de8cc8edSafresh1__UNDEFINED__ isLOWER_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, LOWER)
849de8cc8edSafresh1__UNDEFINED__ isPRINT_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, PRINT)
850de8cc8edSafresh1
851*3d61058aSafresh1/* Use the modern definition */
852*3d61058aSafresh1__REDEFINE__ isPSXSPC_utf8_safe(s,e)   isSPACE_utf8_safe(s,e)
853de8cc8edSafresh1
854de8cc8edSafresh1__UNDEFINED__ isPUNCT_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, PUNCT)
855de8cc8edSafresh1__UNDEFINED__ isSPACE_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, SPACE)
856de8cc8edSafresh1__UNDEFINED__ isUPPER_utf8_safe(s,e)    D_PPP_IS_GENERIC_UTF8_SAFE(s, e, UPPER)
857de8cc8edSafresh1
858de8cc8edSafresh1#  ifdef isWORDCHAR_utf8
859de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, WORDCHAR)
860de8cc8edSafresh1#  else
861de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_utf8_safe(s,e)				               \
862de8cc8edSafresh1                               (isALPHANUMERIC_utf8_safe(s,e) || (*(s)) == '_')
863de8cc8edSafresh1#  endif
864de8cc8edSafresh1
865de8cc8edSafresh1/* This was broken before 5.12, and just use this instead of worrying about
866de8cc8edSafresh1 * which releases the official works on */
867de8cc8edSafresh1#  if 'A' == 65
868de8cc8edSafresh1__UNDEFINED__  isXDIGIT_utf8_safe(s,e)                                       \
869de8cc8edSafresh1( ( LIKELY((e) > (s)) ) ?                                                   \
870de8cc8edSafresh1    ( ( inRANGE(((const U8*)s)[0], 0x30, 0x39 ) || inRANGE(((const U8*)s)[0], 0x41, 0x46 ) || inRANGE(((const U8*)s)[0], 0x61, 0x66 ) ) ? 1\
871de8cc8edSafresh1    : ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xEF == ((const U8*)s)[0] ) ) ? ( ( 0xBC == ((const U8*)s)[1] ) ?\
872de8cc8edSafresh1		    ( ( inRANGE(((const U8*)s)[2], 0x90, 0x99 ) || inRANGE(((const U8*)s)[2], 0xA1, 0xA6 ) ) ? 3 : 0 )\
873de8cc8edSafresh1		: ( ( 0xBD == ((const U8*)s)[1] ) && ( inRANGE(((const U8*)s)[2], 0x81, 0x86 ) ) ) ? 3 : 0 ) : 0 )\
874de8cc8edSafresh1: 0 )
875de8cc8edSafresh1
876de8cc8edSafresh1#  elif 'A' == 193  && '^' == 95 /* EBCDIC 1047 */
877de8cc8edSafresh1
878de8cc8edSafresh1__UNDEFINED__  isXDIGIT_utf8_safe(s,e)                                       \
879de8cc8edSafresh1( ( LIKELY((e) > (s)) ) ?                                                   \
880de8cc8edSafresh1    ( ( inRANGE(((const U8*)s)[0], 0x81, 0x86 ) || inRANGE(((const U8*)s)[0], 0xC1, 0xC6 ) || inRANGE(((const U8*)s)[0], 0xF0, 0xF9 ) ) ? 1\
881de8cc8edSafresh1    : ( ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xDD == ((const U8*)s)[0] ) ) && ( 0x73 == ((const U8*)s)[1] ) ) ? ( ( 0x67 == ((const U8*)s)[2] ) ?\
882de8cc8edSafresh1			( ( inRANGE(((const U8*)s)[3], 0x57, 0x59 ) || inRANGE(((const U8*)s)[3], 0x62, 0x68 ) ) ? 4 : 0 )\
883de8cc8edSafresh1		    : ( ( inRANGE(((const U8*)s)[2], 0x68, 0x69 ) ) && ( inRANGE(((const U8*)s)[3], 0x42, 0x47 ) ) ) ? 4 : 0 ) : 0 )\
884de8cc8edSafresh1: 0 )
885de8cc8edSafresh1
886de8cc8edSafresh1#  elif 'A' == 193  && '^' == 176 /* EBCDIC 037 */
887de8cc8edSafresh1
888de8cc8edSafresh1__UNDEFINED__  isXDIGIT_utf8_safe(s,e)                                       \
889de8cc8edSafresh1( ( LIKELY((e) > (s)) ) ?                                                   \
890de8cc8edSafresh1    ( ( inRANGE(((const U8*)s)[0], 0x81, 0x86 ) || inRANGE(((const U8*)s)[0], 0xC1, 0xC6 ) || inRANGE(((const U8*)s)[0], 0xF0, 0xF9 ) ) ? 1\
891de8cc8edSafresh1    : ( ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xDD == ((const U8*)s)[0] ) ) && ( 0x72 == ((const U8*)s)[1] ) ) ? ( ( 0x66 == ((const U8*)s)[2] ) ?\
892de8cc8edSafresh1			( ( inRANGE(((const U8*)s)[3], 0x57, 0x59 ) || 0x5F == ((const U8*)s)[3] || inRANGE(((const U8*)s)[3], 0x62, 0x67 ) ) ? 4 : 0 )\
893de8cc8edSafresh1		    : ( ( inRANGE(((const U8*)s)[2], 0x67, 0x68 ) ) && ( inRANGE(((const U8*)s)[3], 0x42, 0x47 ) ) ) ? 4 : 0 ) : 0 )\
894de8cc8edSafresh1: 0 )
895de8cc8edSafresh1
896de8cc8edSafresh1#  else
897de8cc8edSafresh1#    error Unknown character set
898de8cc8edSafresh1#  endif
899de8cc8edSafresh1
900de8cc8edSafresh1__UNDEFINED__ isALPHA_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, ALPHA)
901de8cc8edSafresh1#  ifdef isALPHANUMERIC_utf8
902de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_LC_utf8_safe(s,e)                                 \
903de8cc8edSafresh1                                D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, ALPHANUMERIC)
904de8cc8edSafresh1#  else
905de8cc8edSafresh1__UNDEFINED__ isALPHANUMERIC_LC_utf8_safe(s,e)				    \
906de8cc8edSafresh1                        (isALPHA_LC_utf8_safe(s,e) || isDIGIT_LC_utf8_safe(s,e))
907de8cc8edSafresh1#  endif
908de8cc8edSafresh1
909de8cc8edSafresh1__UNDEFINED__  isBLANK_LC_utf8_safe(s,e)                                       \
910de8cc8edSafresh1                            D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, BLANK)
911de8cc8edSafresh1__UNDEFINED__ isCNTRL_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, CNTRL)
912de8cc8edSafresh1__UNDEFINED__ isDIGIT_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, DIGIT)
913de8cc8edSafresh1__UNDEFINED__ isGRAPH_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, GRAPH)
914de8cc8edSafresh1#  ifdef isIDCONT_utf8
915de8cc8edSafresh1__UNDEFINED__ isIDCONT_LC_utf8_safe(s,e)   D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, IDCONT)
916de8cc8edSafresh1#  else
917de8cc8edSafresh1__UNDEFINED__ isIDCONT_LC_utf8_safe(s,e)   isWORDCHAR_LC_utf8_safe(s,e)
918de8cc8edSafresh1#  endif
919de8cc8edSafresh1
920de8cc8edSafresh1__UNDEFINED__ isIDFIRST_LC_utf8_safe(s,e)  D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, IDFIRST)
921de8cc8edSafresh1__UNDEFINED__ isLOWER_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, LOWER)
922de8cc8edSafresh1__UNDEFINED__ isPRINT_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, PRINT)
923de8cc8edSafresh1
924*3d61058aSafresh1/* Use the modern definition */
925*3d61058aSafresh1__REDEFINE__ isPSXSPC_LC_utf8_safe(s,e)   isSPACE_LC_utf8_safe(s,e)
926de8cc8edSafresh1
927de8cc8edSafresh1__UNDEFINED__ isPUNCT_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, PUNCT)
928de8cc8edSafresh1__UNDEFINED__ isSPACE_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, SPACE)
929de8cc8edSafresh1__UNDEFINED__ isUPPER_LC_utf8_safe(s,e)    D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, UPPER)
930de8cc8edSafresh1
931de8cc8edSafresh1#  ifdef isWORDCHAR_utf8
932de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, WORDCHAR)
933de8cc8edSafresh1#  else
934de8cc8edSafresh1__UNDEFINED__ isWORDCHAR_LC_utf8_safe(s,e)				               \
935de8cc8edSafresh1                               (isALPHANUMERIC_LC_utf8_safe(s,e) || (*(s)) == '_')
936de8cc8edSafresh1#  endif
937de8cc8edSafresh1
938de8cc8edSafresh1__UNDEFINED__  isXDIGIT_LC_utf8_safe(s,e)                                       \
939de8cc8edSafresh1                            D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, XDIGIT)
940de8cc8edSafresh1
941de8cc8edSafresh1/* Warning: isALPHANUMERIC_utf8_safe, isALPHA_utf8_safe, isASCII_utf8_safe,
942de8cc8edSafresh1 * isBLANK_utf8_safe, isCNTRL_utf8_safe, isDIGIT_utf8_safe, isGRAPH_utf8_safe,
943de8cc8edSafresh1 * isIDCONT_utf8_safe, isIDFIRST_utf8_safe, isLOWER_utf8_safe,
944de8cc8edSafresh1 * isPRINT_utf8_safe, isPSXSPC_utf8_safe, isPUNCT_utf8_safe, isSPACE_utf8_safe,
945de8cc8edSafresh1 * isUPPER_utf8_safe, isWORDCHAR_utf8_safe, isWORDCHAR_utf8_safe,
946de8cc8edSafresh1 * isXDIGIT_utf8_safe,
947de8cc8edSafresh1 * isALPHANUMERIC_LC_utf8_safe, isALPHA_LC_utf8_safe, isASCII_LC_utf8_safe,
948de8cc8edSafresh1 * isBLANK_LC_utf8_safe, isCNTRL_LC_utf8_safe, isDIGIT_LC_utf8_safe,
949de8cc8edSafresh1 * isGRAPH_LC_utf8_safe, isIDCONT_LC_utf8_safe, isIDFIRST_LC_utf8_safe,
950de8cc8edSafresh1 * isLOWER_LC_utf8_safe, isPRINT_LC_utf8_safe, isPSXSPC_LC_utf8_safe,
951de8cc8edSafresh1 * isPUNCT_LC_utf8_safe, isSPACE_LC_utf8_safe, isUPPER_LC_utf8_safe,
952de8cc8edSafresh1 * isWORDCHAR_LC_utf8_safe, isWORDCHAR_LC_utf8_safe, isXDIGIT_LC_utf8_safe,
953de8cc8edSafresh1 * isALPHANUMERIC_uvchr, isALPHA_uvchr, isASCII_uvchr, isBLANK_uvchr,
954de8cc8edSafresh1 * isCNTRL_uvchr, isDIGIT_uvchr, isGRAPH_uvchr, isIDCONT_uvchr,
955de8cc8edSafresh1 * isIDFIRST_uvchr, isLOWER_uvchr, isPRINT_uvchr, isPSXSPC_uvchr,
956de8cc8edSafresh1 * isPUNCT_uvchr, isSPACE_uvchr, isUPPER_uvchr, isWORDCHAR_uvchr,
957de8cc8edSafresh1 * isWORDCHAR_uvchr, isXDIGIT_uvchr
958de8cc8edSafresh1 *
959de8cc8edSafresh1 * The UTF-8 handling is buggy in early Perls, and this can give inaccurate
960de8cc8edSafresh1 * results for code points above 0xFF, until the implementation started
961de8cc8edSafresh1 * settling down in 5.12 and 5.14 */
962de8cc8edSafresh1
963de8cc8edSafresh1#endif
964de8cc8edSafresh1
965de8cc8edSafresh1#define D_PPP_TOO_SHORT_MSG  "Malformed UTF-8 character starting with:"      \
966de8cc8edSafresh1                             " \\x%02x (too short; %d bytes available, need" \
967de8cc8edSafresh1                             " %d)\n"
968de8cc8edSafresh1/* Perls starting here had a new API which handled multi-character results */
969de8cc8edSafresh1#if { VERSION >= 5.7.3 }
970de8cc8edSafresh1
971de8cc8edSafresh1__UNDEFINED__ toLOWER_uvchr(c, s, l)  UNI_TO_NATIVE(to_uni_lower(NATIVE_TO_UNI(c), s, l))
972de8cc8edSafresh1__UNDEFINED__ toUPPER_uvchr(c, s, l)  UNI_TO_NATIVE(to_uni_upper(NATIVE_TO_UNI(c), s, l))
973de8cc8edSafresh1__UNDEFINED__ toTITLE_uvchr(c, s, l)  UNI_TO_NATIVE(to_uni_title(NATIVE_TO_UNI(c), s, l))
974de8cc8edSafresh1__UNDEFINED__ toFOLD_uvchr(c, s, l)   UNI_TO_NATIVE(to_uni_fold( NATIVE_TO_UNI(c), s, l))
975de8cc8edSafresh1
976de8cc8edSafresh1#  if { VERSION != 5.15.6 }     /* Just this version is broken */
977de8cc8edSafresh1
978de8cc8edSafresh1      /* Prefer the macro to the function */
979de8cc8edSafresh1#    if defined toLOWER_utf8
980de8cc8edSafresh1#      define D_PPP_TO_LOWER_CALLEE(s,r,l)    toLOWER_utf8(s,r,l)
981de8cc8edSafresh1#    else
982de8cc8edSafresh1#      define D_PPP_TO_LOWER_CALLEE(s,r,l)    to_utf8_lower(s,r,l)
983de8cc8edSafresh1#    endif
984de8cc8edSafresh1#    if defined toTITLE_utf8
985de8cc8edSafresh1#      define D_PPP_TO_TITLE_CALLEE(s,r,l)    toTITLE_utf8(s,r,l)
986de8cc8edSafresh1#    else
987de8cc8edSafresh1#      define D_PPP_TO_TITLE_CALLEE(s,r,l)    to_utf8_title(s,r,l)
988de8cc8edSafresh1#    endif
989de8cc8edSafresh1#    if defined toUPPER_utf8
990de8cc8edSafresh1#      define D_PPP_TO_UPPER_CALLEE(s,r,l)    toUPPER_utf8(s,r,l)
991de8cc8edSafresh1#    else
992de8cc8edSafresh1#      define D_PPP_TO_UPPER_CALLEE(s,r,l)    to_utf8_upper(s,r,l)
993de8cc8edSafresh1#    endif
994de8cc8edSafresh1#    if defined toFOLD_utf8
995de8cc8edSafresh1#      define D_PPP_TO_FOLD_CALLEE(s,r,l)     toFOLD_utf8(s,r,l)
996de8cc8edSafresh1#    else
997de8cc8edSafresh1#      define D_PPP_TO_FOLD_CALLEE(s,r,l)     to_utf8_fold(s,r,l)
998de8cc8edSafresh1#    endif
999de8cc8edSafresh1#  else     /* Below is 5.15.6, which failed to make the macros available
1000de8cc8edSafresh1#              outside of core, so we have to use the 'Perl_' form.  khw
1001de8cc8edSafresh1#              decided it was easier to just handle this case than have to
1002de8cc8edSafresh1#              document the exception, and make an exception in the tests below
1003de8cc8edSafresh1#              */
1004de8cc8edSafresh1#    define D_PPP_TO_LOWER_CALLEE(s,r,l)                                    \
1005de8cc8edSafresh1                        Perl__to_utf8_lower_flags(aTHX_ s, r, l, 0, NULL)
1006de8cc8edSafresh1#    define D_PPP_TO_TITLE_CALLEE(s,r,l)                                    \
1007de8cc8edSafresh1                        Perl__to_utf8_title_flags(aTHX_ s, r, l, 0, NULL)
1008de8cc8edSafresh1#    define D_PPP_TO_UPPER_CALLEE(s,r,l)                                    \
1009de8cc8edSafresh1                        Perl__to_utf8_upper_flags(aTHX_ s, r, l, 0, NULL)
1010de8cc8edSafresh1#    define D_PPP_TO_FOLD_CALLEE(s,r,l)                                     \
1011de8cc8edSafresh1            Perl__to_utf8_fold_flags(aTHX_ s, r, l, FOLD_FLAGS_FULL, NULL)
1012de8cc8edSafresh1#  endif
1013de8cc8edSafresh1
1014de8cc8edSafresh1/* The actual implementation of the backported macros.  If too short, croak,
1015de8cc8edSafresh1 * otherwise call the original that doesn't have an upper limit parameter */
1016de8cc8edSafresh1#  define D_PPP_GENERIC_MULTI_ARG_TO(name, s, e,r,l)                        \
1017de8cc8edSafresh1    (((((e) - (s)) <= 0)                                                    \
1018de8cc8edSafresh1         /* We could just do nothing, but modern perls croak */             \
1019de8cc8edSafresh1      ? (croak("Attempting case change on zero length string"),             \
1020de8cc8edSafresh1         0) /* So looks like it returns something, and will compile */      \
1021de8cc8edSafresh1      : ((e) - (s)) < UTF8SKIP(s))                                          \
1022de8cc8edSafresh1        ? (croak(D_PPP_TOO_SHORT_MSG,                                       \
1023de8cc8edSafresh1                               s[0], (int) ((e) - (s)), (int) UTF8SKIP(s)), \
1024de8cc8edSafresh1           0)                                                               \
1025de8cc8edSafresh1        : D_PPP_TO_ ## name ## _CALLEE(s,r,l))
1026de8cc8edSafresh1
1027de8cc8edSafresh1__UNDEFINED__  toUPPER_utf8_safe(s,e,r,l)                                   \
1028de8cc8edSafresh1                        D_PPP_GENERIC_MULTI_ARG_TO(UPPER,s,e,r,l)
1029de8cc8edSafresh1__UNDEFINED__  toLOWER_utf8_safe(s,e,r,l)                                   \
1030de8cc8edSafresh1                        D_PPP_GENERIC_MULTI_ARG_TO(LOWER,s,e,r,l)
1031de8cc8edSafresh1__UNDEFINED__  toTITLE_utf8_safe(s,e,r,l)                                   \
1032de8cc8edSafresh1                        D_PPP_GENERIC_MULTI_ARG_TO(TITLE,s,e,r,l)
1033de8cc8edSafresh1__UNDEFINED__  toFOLD_utf8_safe(s,e,r,l)                                    \
1034de8cc8edSafresh1                        D_PPP_GENERIC_MULTI_ARG_TO(FOLD,s,e,r,l)
1035de8cc8edSafresh1
1036de8cc8edSafresh1#elif { VERSION >= 5.006 }
1037de8cc8edSafresh1
1038de8cc8edSafresh1/* Here we have UTF-8 support, but using the original API where the case
1039de8cc8edSafresh1 * changing functions merely returned the changed code point; hence they
1040de8cc8edSafresh1 * couldn't handle multi-character results. */
1041de8cc8edSafresh1
1042de8cc8edSafresh1#  ifdef uvchr_to_utf8
1043de8cc8edSafresh1#    define D_PPP_UV_TO_UTF8 uvchr_to_utf8
1044de8cc8edSafresh1#  else
1045de8cc8edSafresh1#    define D_PPP_UV_TO_UTF8 uv_to_utf8
1046de8cc8edSafresh1#  endif
1047de8cc8edSafresh1
1048de8cc8edSafresh1   /* Get the utf8 of the case changed value, and store its length; then have
1049de8cc8edSafresh1    * to re-calculate the changed case value in order to return it */
1050de8cc8edSafresh1#  define D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(name, c, s, l)                  \
1051de8cc8edSafresh1        (*(l) = (D_PPP_UV_TO_UTF8(s,                                        \
1052de8cc8edSafresh1                 UNI_TO_NATIVE(to_uni_ ## name(NATIVE_TO_UNI(c)))) - (s)),  \
1053de8cc8edSafresh1        UNI_TO_NATIVE(to_uni_ ## name(NATIVE_TO_UNI(c))))
1054de8cc8edSafresh1
1055de8cc8edSafresh1__UNDEFINED__ toLOWER_uvchr(c, s, l)                                        \
1056de8cc8edSafresh1                        D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(lower, c, s, l)
1057de8cc8edSafresh1__UNDEFINED__ toUPPER_uvchr(c, s, l)                                        \
1058de8cc8edSafresh1                        D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(upper, c, s, l)
1059de8cc8edSafresh1__UNDEFINED__ toTITLE_uvchr(c, s, l)                                        \
1060de8cc8edSafresh1                        D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(title, c, s, l)
1061de8cc8edSafresh1__UNDEFINED__ toFOLD_uvchr(c, s, l)   toLOWER_uvchr(c, s, l)
1062de8cc8edSafresh1
1063de8cc8edSafresh1#  define D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(name, s, e, r, l)                \
1064de8cc8edSafresh1    (((((e) - (s)) <= 0)                                                    \
1065de8cc8edSafresh1      ? (croak("Attempting case change on zero length string"),             \
1066de8cc8edSafresh1         0) /* So looks like it returns something, and will compile */      \
1067de8cc8edSafresh1      : ((e) - (s)) < UTF8SKIP(s))                                          \
1068de8cc8edSafresh1        ? (croak(D_PPP_TOO_SHORT_MSG,                                       \
1069de8cc8edSafresh1                               s[0], (int) ((e) - (s)), (int) UTF8SKIP(s)), \
1070de8cc8edSafresh1           0)                                                               \
1071de8cc8edSafresh1          /* Get the changed code point and store its UTF-8 */              \
1072de8cc8edSafresh1        : D_PPP_UV_TO_UTF8(r, to_utf8_ ## name(s)),                         \
1073de8cc8edSafresh1            /* Then store its length, and re-get code point for return */   \
1074de8cc8edSafresh1            *(l) = UTF8SKIP(r), to_utf8_ ## name(r))
1075de8cc8edSafresh1
1076de8cc8edSafresh1/* Warning: toUPPER_utf8_safe, toLOWER_utf8_safe, toTITLE_utf8_safe,
1077de8cc8edSafresh1 * toUPPER_uvchr, toLOWER_uvchr, toTITLE_uvchr
1078de8cc8edSafresh1    The UTF-8 case changing operations had bugs before around 5.12 or 5.14;
1079de8cc8edSafresh1    this backport does not correct them.
1080de8cc8edSafresh1
1081de8cc8edSafresh1    In perls before 7.3, multi-character case changing is not implemented; this
1082de8cc8edSafresh1    backport uses the simple case changes available in those perls. */
1083de8cc8edSafresh1
1084de8cc8edSafresh1__UNDEFINED__  toUPPER_utf8_safe(s,e,r,l)                                   \
1085de8cc8edSafresh1                        D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(upper, s, e, r, l)
1086de8cc8edSafresh1__UNDEFINED__  toLOWER_utf8_safe(s,e,r,l)                                   \
1087de8cc8edSafresh1                        D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(lower, s, e, r, l)
1088de8cc8edSafresh1__UNDEFINED__  toTITLE_utf8_safe(s,e,r,l)                                   \
1089de8cc8edSafresh1                        D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(title, s, e, r, l)
1090de8cc8edSafresh1
1091de8cc8edSafresh1 /* Warning: toFOLD_utf8_safe, toFOLD_uvchr
1092de8cc8edSafresh1    The UTF-8 case changing operations had bugs before around 5.12 or 5.14;
1093de8cc8edSafresh1    this backport does not correct them.
1094de8cc8edSafresh1
1095de8cc8edSafresh1    In perls before 7.3, case folding is not implemented; instead, this
1096de8cc8edSafresh1    backport substitutes simple (not multi-character, which isn't available)
1097de8cc8edSafresh1    lowercasing.  This gives the correct result in most, but not all, instances
1098de8cc8edSafresh1    */
1099de8cc8edSafresh1
1100de8cc8edSafresh1__UNDEFINED__  toFOLD_utf8_safe(s,e,r,l)  toLOWER_utf8_safe(s,e,r,l)
1101de8cc8edSafresh1
1102de8cc8edSafresh1#endif
11035759b3d2Safresh1
11045759b3d2Safresh1/* Until we figure out how to support this in older perls... */
11055759b3d2Safresh1#if { VERSION >= 5.8.0 }
11065759b3d2Safresh1
11075759b3d2Safresh1__UNDEFINED__ HeUTF8(he)        ((HeKLEN(he) == HEf_SVKEY) ?            \
11085759b3d2Safresh1                                 SvUTF8(HeKEY_sv(he)) :                 \
11095759b3d2Safresh1                                 (U32)HeKUTF8(he))
11105759b3d2Safresh1
11115759b3d2Safresh1#endif
11125759b3d2Safresh1
11135759b3d2Safresh1__UNDEFINED__ C_ARRAY_LENGTH(a)		(sizeof(a)/sizeof((a)[0]))
11145759b3d2Safresh1__UNDEFINED__ C_ARRAY_END(a)		((a) + C_ARRAY_LENGTH(a))
11155759b3d2Safresh1
1116f3efcd01Safresh1__UNDEFINED__ LIKELY(x) (x)
1117f3efcd01Safresh1__UNDEFINED__ UNLIKELY(x) (x)
1118f3efcd01Safresh1
1119f3efcd01Safresh1#ifndef MUTABLE_PTR
11209a4edab6Sbluhm#if defined(PERL_USE_GCC_BRACE_GROUPS)
1121f3efcd01Safresh1#  define MUTABLE_PTR(p) ({ void *_p = (p); _p; })
1122f3efcd01Safresh1#else
1123f3efcd01Safresh1#  define MUTABLE_PTR(p) ((void *) (p))
1124f3efcd01Safresh1#endif
1125f3efcd01Safresh1#endif
1126f3efcd01Safresh1
11279a4edab6Sbluhm__UNDEFINED__ MUTABLE_AV(p)   ((AV *)MUTABLE_PTR(p))
11289a4edab6Sbluhm__UNDEFINED__ MUTABLE_CV(p)   ((CV *)MUTABLE_PTR(p))
11299a4edab6Sbluhm__UNDEFINED__ MUTABLE_GV(p)   ((GV *)MUTABLE_PTR(p))
11309a4edab6Sbluhm__UNDEFINED__ MUTABLE_HV(p)   ((HV *)MUTABLE_PTR(p))
11319a4edab6Sbluhm__UNDEFINED__ MUTABLE_IO(p)   ((IO *)MUTABLE_PTR(p))
1132f3efcd01Safresh1__UNDEFINED__ MUTABLE_SV(p)   ((SV *)MUTABLE_PTR(p))
1133f3efcd01Safresh1
11345759b3d2Safresh1=xsmisc
11355759b3d2Safresh1
11365759b3d2Safresh1typedef XSPROTO(XSPROTO_test_t);
11375759b3d2Safresh1typedef XSPROTO_test_t *XSPROTO_test_t_ptr;
11385759b3d2Safresh1
11395759b3d2Safresh1XS(XS_Devel__PPPort_dXSTARG);  /* prototype */
11405759b3d2Safresh1XS(XS_Devel__PPPort_dXSTARG)
11415759b3d2Safresh1{
11425759b3d2Safresh1  dXSARGS;
11435759b3d2Safresh1  dXSTARG;
11445759b3d2Safresh1  IV iv;
11455759b3d2Safresh1
11465759b3d2Safresh1  PERL_UNUSED_VAR(cv);
11475759b3d2Safresh1  SP -= items;
11485759b3d2Safresh1  iv = SvIV(ST(0)) + 1;
11495759b3d2Safresh1  PUSHi(iv);
11505759b3d2Safresh1  XSRETURN(1);
11515759b3d2Safresh1}
11525759b3d2Safresh1
11535759b3d2Safresh1XS(XS_Devel__PPPort_dAXMARK);  /* prototype */
11545759b3d2Safresh1XS(XS_Devel__PPPort_dAXMARK)
11555759b3d2Safresh1{
11565759b3d2Safresh1  dSP;
11575759b3d2Safresh1  dAXMARK;
11585759b3d2Safresh1  dITEMS;
11595759b3d2Safresh1  IV iv;
11605759b3d2Safresh1
11615759b3d2Safresh1  PERL_UNUSED_VAR(cv);
11625759b3d2Safresh1  SP -= items;
11635759b3d2Safresh1  iv = SvIV(ST(0)) - 1;
11645759b3d2Safresh1  mPUSHi(iv);
11655759b3d2Safresh1  XSRETURN(1);
11665759b3d2Safresh1}
11675759b3d2Safresh1
11685759b3d2Safresh1=xsboot
11695759b3d2Safresh1
11705759b3d2Safresh1{
11715759b3d2Safresh1  XSPROTO_test_t_ptr p = &XS_Devel__PPPort_dXSTARG;
11725759b3d2Safresh1  newXS("Devel::PPPort::dXSTARG", *p, file);
11735759b3d2Safresh1}
11745759b3d2Safresh1newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
11755759b3d2Safresh1
11765759b3d2Safresh1=xsubs
11775759b3d2Safresh1
11785759b3d2Safresh1int
11795759b3d2Safresh1OpSIBLING_tests()
11805759b3d2Safresh1	PREINIT:
1181e0680481Safresh1		OP *x = NULL;
1182e0680481Safresh1		OP *kid = NULL;
1183e0680481Safresh1		OP *middlekid = NULL;
1184e0680481Safresh1		OP *lastkid = NULL;
11855759b3d2Safresh1		int count = 0;
11865759b3d2Safresh1		int failures = 0;
11875759b3d2Safresh1		int i;
11885759b3d2Safresh1	CODE:
11895759b3d2Safresh1		x = newOP(OP_PUSHMARK, 0);
11905759b3d2Safresh1
11915759b3d2Safresh1		/* No siblings yet! */
11925759b3d2Safresh1		if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
11935759b3d2Safresh1			failures++; warn("Op should not have had a sib");
11945759b3d2Safresh1		}
11955759b3d2Safresh1
11965759b3d2Safresh1
11975759b3d2Safresh1		/* Add 2 siblings */
11985759b3d2Safresh1		kid = x;
11995759b3d2Safresh1
12005759b3d2Safresh1		for (i = 0; i < 2; i++) {
12015759b3d2Safresh1			OP *newsib = newOP(OP_PUSHMARK, 0);
12025759b3d2Safresh1			OpMORESIB_set(kid, newsib);
12035759b3d2Safresh1
12045759b3d2Safresh1			kid = OpSIBLING(kid);
12055759b3d2Safresh1			lastkid = kid;
12065759b3d2Safresh1		}
1207f3efcd01Safresh1                middlekid = OpSIBLING(x);
12085759b3d2Safresh1
12095759b3d2Safresh1		/* Should now have a sibling */
12105759b3d2Safresh1		if (! OpHAS_SIBLING(x) || ! OpSIBLING(x) ) {
12115759b3d2Safresh1			failures++; warn("Op should have had a sib after moresib_set");
12125759b3d2Safresh1		}
12135759b3d2Safresh1
12145759b3d2Safresh1		/* Count the siblings */
12155759b3d2Safresh1		for (kid = OpSIBLING(x); kid; kid = OpSIBLING(kid)) {
12165759b3d2Safresh1			count++;
12175759b3d2Safresh1		}
12185759b3d2Safresh1
12195759b3d2Safresh1		if (count != 2) {
12205759b3d2Safresh1			failures++; warn("Kid had %d sibs, expected 2", count);
12215759b3d2Safresh1		}
12225759b3d2Safresh1
12235759b3d2Safresh1		if (OpHAS_SIBLING(lastkid) || OpSIBLING(lastkid)) {
12245759b3d2Safresh1			failures++; warn("Last kid should not have a sib");
12255759b3d2Safresh1		}
12265759b3d2Safresh1
12275759b3d2Safresh1		/* Really sets the parent, and says 'no more siblings' */
12285759b3d2Safresh1		OpLASTSIB_set(x, lastkid);
12295759b3d2Safresh1
12305759b3d2Safresh1		if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
12315759b3d2Safresh1			failures++; warn("OpLASTSIB_set failed?");
12325759b3d2Safresh1		}
12335759b3d2Safresh1
12345759b3d2Safresh1		/* Restore the kid */
12355759b3d2Safresh1		OpMORESIB_set(x, lastkid);
12365759b3d2Safresh1
12375759b3d2Safresh1		/* Try to remove it again */
12385759b3d2Safresh1		OpLASTSIB_set(x, NULL);
12395759b3d2Safresh1
12405759b3d2Safresh1		if (OpHAS_SIBLING(x) || OpSIBLING(x)) {
12415759b3d2Safresh1			failures++; warn("OpLASTSIB_set with NULL failed?");
12425759b3d2Safresh1		}
12435759b3d2Safresh1
12445759b3d2Safresh1		/* Try to restore with maybesib_set */
12455759b3d2Safresh1		OpMAYBESIB_set(x, lastkid, NULL);
12465759b3d2Safresh1
12475759b3d2Safresh1		if (! OpHAS_SIBLING(x) || ! OpSIBLING(x) ) {
12485759b3d2Safresh1			failures++; warn("Op should have had a sib after maybesibset");
12495759b3d2Safresh1		}
12505759b3d2Safresh1
1251f3efcd01Safresh1                op_free(lastkid);
1252f3efcd01Safresh1                op_free(middlekid);
1253f3efcd01Safresh1                op_free(x);
12545759b3d2Safresh1		RETVAL = failures;
12555759b3d2Safresh1	OUTPUT:
12565759b3d2Safresh1		RETVAL
12575759b3d2Safresh1
12585759b3d2Safresh1int
12595759b3d2Safresh1SvRXOK(sv)
12605759b3d2Safresh1	SV *sv
12615759b3d2Safresh1	CODE:
12625759b3d2Safresh1		RETVAL = SvRXOK(sv);
12635759b3d2Safresh1	OUTPUT:
12645759b3d2Safresh1		RETVAL
12655759b3d2Safresh1
12665759b3d2Safresh1int
12675759b3d2Safresh1ptrtests()
12685759b3d2Safresh1        PREINIT:
12695759b3d2Safresh1                int var, *p = &var;
12705759b3d2Safresh1
12715759b3d2Safresh1        CODE:
12725759b3d2Safresh1                RETVAL = 0;
12735759b3d2Safresh1                RETVAL += PTR2nat(p) != 0       ?  1 : 0;
12745759b3d2Safresh1                RETVAL += PTR2ul(p) != 0UL      ?  2 : 0;
12755759b3d2Safresh1                RETVAL += PTR2UV(p) != (UV) 0   ?  4 : 0;
12765759b3d2Safresh1                RETVAL += PTR2IV(p) != (IV) 0   ?  8 : 0;
12775759b3d2Safresh1                RETVAL += PTR2NV(p) != (NV) 0   ? 16 : 0;
12785759b3d2Safresh1                RETVAL += p > NUM2PTR(int *, 0) ? 32 : 0;
12795759b3d2Safresh1
12805759b3d2Safresh1        OUTPUT:
12815759b3d2Safresh1                RETVAL
12825759b3d2Safresh1
12835759b3d2Safresh1int
12845759b3d2Safresh1gv_stashpvn(name, create)
12855759b3d2Safresh1        char *name
12865759b3d2Safresh1        I32 create
12875759b3d2Safresh1        CODE:
12885759b3d2Safresh1                RETVAL = gv_stashpvn(name, strlen(name), create) != NULL;
12895759b3d2Safresh1        OUTPUT:
12905759b3d2Safresh1                RETVAL
12915759b3d2Safresh1
12925759b3d2Safresh1int
12935759b3d2Safresh1get_sv(name, create)
12945759b3d2Safresh1        char *name
12955759b3d2Safresh1        I32 create
12965759b3d2Safresh1        CODE:
12975759b3d2Safresh1                RETVAL = get_sv(name, create) != NULL;
12985759b3d2Safresh1        OUTPUT:
12995759b3d2Safresh1                RETVAL
13005759b3d2Safresh1
13015759b3d2Safresh1int
13025759b3d2Safresh1get_av(name, create)
13035759b3d2Safresh1        char *name
13045759b3d2Safresh1        I32 create
13055759b3d2Safresh1        CODE:
13065759b3d2Safresh1                RETVAL = get_av(name, create) != NULL;
13075759b3d2Safresh1        OUTPUT:
13085759b3d2Safresh1                RETVAL
13095759b3d2Safresh1
13105759b3d2Safresh1int
13115759b3d2Safresh1get_hv(name, create)
13125759b3d2Safresh1        char *name
13135759b3d2Safresh1        I32 create
13145759b3d2Safresh1        CODE:
13155759b3d2Safresh1                RETVAL = get_hv(name, create) != NULL;
13165759b3d2Safresh1        OUTPUT:
13175759b3d2Safresh1                RETVAL
13185759b3d2Safresh1
13195759b3d2Safresh1int
13205759b3d2Safresh1get_cv(name, create)
13215759b3d2Safresh1        char *name
13225759b3d2Safresh1        I32 create
13235759b3d2Safresh1        CODE:
13245759b3d2Safresh1                RETVAL = get_cv(name, create) != NULL;
13255759b3d2Safresh1        OUTPUT:
13265759b3d2Safresh1                RETVAL
13275759b3d2Safresh1
13285759b3d2Safresh1void
13295759b3d2Safresh1xsreturn(two)
13305759b3d2Safresh1        int two
13315759b3d2Safresh1        PPCODE:
13325759b3d2Safresh1                mXPUSHp("test1", 5);
13335759b3d2Safresh1                if (two)
13345759b3d2Safresh1                  mXPUSHp("test2", 5);
13355759b3d2Safresh1                if (two)
13365759b3d2Safresh1                  XSRETURN(2);
13375759b3d2Safresh1                else
13385759b3d2Safresh1                  XSRETURN(1);
13395759b3d2Safresh1
13405759b3d2Safresh1SV*
13415759b3d2Safresh1boolSV(value)
13425759b3d2Safresh1        int value
13435759b3d2Safresh1        CODE:
13445759b3d2Safresh1                RETVAL = newSVsv(boolSV(value));
13455759b3d2Safresh1        OUTPUT:
13465759b3d2Safresh1                RETVAL
13475759b3d2Safresh1
13485759b3d2Safresh1SV*
13495759b3d2Safresh1DEFSV()
13505759b3d2Safresh1        CODE:
13515759b3d2Safresh1                RETVAL = newSVsv(DEFSV);
13525759b3d2Safresh1        OUTPUT:
13535759b3d2Safresh1                RETVAL
13545759b3d2Safresh1
13555759b3d2Safresh1void
13565759b3d2Safresh1DEFSV_modify()
13575759b3d2Safresh1        PPCODE:
13585759b3d2Safresh1                XPUSHs(sv_mortalcopy(DEFSV));
13595759b3d2Safresh1                ENTER;
13605759b3d2Safresh1                SAVE_DEFSV;
13615759b3d2Safresh1                DEFSV_set(newSVpvs("DEFSV"));
13625759b3d2Safresh1                XPUSHs(sv_mortalcopy(DEFSV));
13635759b3d2Safresh1                /* Yes, this leaks the above scalar; 5.005 with threads for some reason */
13645759b3d2Safresh1                /* frees it upon LEAVE, thus mortalizing it causes "attempt to free..." */
13655759b3d2Safresh1                /* sv_2mortal(DEFSV); */
13665759b3d2Safresh1                LEAVE;
13675759b3d2Safresh1                XPUSHs(sv_mortalcopy(DEFSV));
13685759b3d2Safresh1                XSRETURN(3);
13695759b3d2Safresh1
13705759b3d2Safresh1int
13715759b3d2Safresh1ERRSV()
13725759b3d2Safresh1        CODE:
1373de8cc8edSafresh1                RETVAL = SvTRUEx(ERRSV);
13745759b3d2Safresh1        OUTPUT:
13755759b3d2Safresh1                RETVAL
13765759b3d2Safresh1
13775759b3d2Safresh1SV*
13785759b3d2Safresh1UNDERBAR()
13795759b3d2Safresh1        CODE:
13805759b3d2Safresh1                {
13815759b3d2Safresh1                  dUNDERBAR;
13825759b3d2Safresh1                  RETVAL = newSVsv(UNDERBAR);
13835759b3d2Safresh1                }
13845759b3d2Safresh1        OUTPUT:
13855759b3d2Safresh1                RETVAL
13865759b3d2Safresh1
13875759b3d2Safresh1void
13885759b3d2Safresh1prepush()
13895759b3d2Safresh1        CODE:
13905759b3d2Safresh1                {
13915759b3d2Safresh1                  dXSTARG;
13925759b3d2Safresh1                  XSprePUSH;
13935759b3d2Safresh1                  PUSHi(42);
13945759b3d2Safresh1                  XSRETURN(1);
13955759b3d2Safresh1                }
13965759b3d2Safresh1
13975759b3d2Safresh1int
13985759b3d2Safresh1PERL_ABS(a)
13995759b3d2Safresh1        int a
14005759b3d2Safresh1
14015759b3d2Safresh1void
14025759b3d2Safresh1SVf(x)
14035759b3d2Safresh1        SV *x
14045759b3d2Safresh1        PPCODE:
14055759b3d2Safresh1#if { VERSION >= 5.004 }
14065759b3d2Safresh1                x = sv_2mortal(newSVpvf("[%" SVf "]", SVfARG(x)));
14075759b3d2Safresh1#endif
14085759b3d2Safresh1                XPUSHs(x);
14095759b3d2Safresh1                XSRETURN(1);
14105759b3d2Safresh1
14115759b3d2Safresh1void
14125759b3d2Safresh1Perl_ppaddr_t(string)
14135759b3d2Safresh1        char *string
14145759b3d2Safresh1        PREINIT:
14155759b3d2Safresh1                Perl_ppaddr_t lower;
14165759b3d2Safresh1        PPCODE:
14175759b3d2Safresh1                lower = PL_ppaddr[OP_LC];
14185759b3d2Safresh1                mXPUSHs(newSVpv(string, 0));
14195759b3d2Safresh1                PUTBACK;
14205759b3d2Safresh1                ENTER;
14215759b3d2Safresh1                (void)*(lower)(aTHXR);
14225759b3d2Safresh1                SPAGAIN;
14235759b3d2Safresh1                LEAVE;
14245759b3d2Safresh1                XSRETURN(1);
14255759b3d2Safresh1
14265759b3d2Safresh1#if { VERSION >= 5.8.0 }
14275759b3d2Safresh1
14285759b3d2Safresh1void
14295759b3d2Safresh1check_HeUTF8(utf8_key)
14305759b3d2Safresh1        SV *utf8_key;
14315759b3d2Safresh1        PREINIT:
14325759b3d2Safresh1                HV *hash;
14335759b3d2Safresh1                HE *ent;
14345759b3d2Safresh1                STRLEN klen;
14355759b3d2Safresh1                char *key;
14365759b3d2Safresh1        PPCODE:
14375759b3d2Safresh1                hash = newHV();
14385759b3d2Safresh1
14395759b3d2Safresh1                key = SvPV(utf8_key, klen);
1440e0680481Safresh1                hv_store(hash, key, SvUTF8(utf8_key) ? -klen : klen,
1441e0680481Safresh1                    newSVpvs("string"), 0);
14425759b3d2Safresh1                hv_iterinit(hash);
14435759b3d2Safresh1                ent = hv_iternext(hash);
14445759b3d2Safresh1                assert(ent);
14455759b3d2Safresh1                mXPUSHp((HeUTF8(ent) == 0 ? "norm" : "utf8"), 4);
14465759b3d2Safresh1                hv_undef(hash);
14475759b3d2Safresh1
14485759b3d2Safresh1
14495759b3d2Safresh1#endif
14505759b3d2Safresh1
14515759b3d2Safresh1void
14525759b3d2Safresh1check_c_array()
14535759b3d2Safresh1        PREINIT:
14545759b3d2Safresh1                int x[] = { 10, 11, 12, 13 };
14555759b3d2Safresh1        PPCODE:
14565759b3d2Safresh1                mXPUSHi(C_ARRAY_LENGTH(x));  /* 4 */
14575759b3d2Safresh1                mXPUSHi(*(C_ARRAY_END(x)-1)); /* 13 */
14585759b3d2Safresh1
1459f3efcd01Safresh1bool
1460de8cc8edSafresh1isBLANK(ord)
1461de8cc8edSafresh1    UV ord
1462f3efcd01Safresh1    CODE:
1463f3efcd01Safresh1        RETVAL = isBLANK(ord);
1464f3efcd01Safresh1    OUTPUT:
1465f3efcd01Safresh1        RETVAL
1466f3efcd01Safresh1
1467f3efcd01Safresh1bool
1468de8cc8edSafresh1isBLANK_A(ord)
1469de8cc8edSafresh1    UV ord
1470f3efcd01Safresh1    CODE:
1471f3efcd01Safresh1        RETVAL = isBLANK_A(ord);
1472f3efcd01Safresh1    OUTPUT:
1473f3efcd01Safresh1        RETVAL
1474f3efcd01Safresh1
1475f3efcd01Safresh1bool
1476de8cc8edSafresh1isBLANK_L1(ord)
1477de8cc8edSafresh1    UV ord
1478de8cc8edSafresh1    CODE:
1479de8cc8edSafresh1        RETVAL = isBLANK_L1(ord);
1480de8cc8edSafresh1    OUTPUT:
1481de8cc8edSafresh1        RETVAL
1482de8cc8edSafresh1
1483de8cc8edSafresh1bool
1484de8cc8edSafresh1isUPPER(ord)
1485de8cc8edSafresh1    UV ord
1486f3efcd01Safresh1    CODE:
1487f3efcd01Safresh1        RETVAL = isUPPER(ord);
1488f3efcd01Safresh1    OUTPUT:
1489f3efcd01Safresh1        RETVAL
1490f3efcd01Safresh1
1491f3efcd01Safresh1bool
1492de8cc8edSafresh1isUPPER_A(ord)
1493de8cc8edSafresh1    UV ord
1494f3efcd01Safresh1    CODE:
1495f3efcd01Safresh1        RETVAL = isUPPER_A(ord);
1496f3efcd01Safresh1    OUTPUT:
1497f3efcd01Safresh1        RETVAL
1498f3efcd01Safresh1
1499f3efcd01Safresh1bool
1500de8cc8edSafresh1isUPPER_L1(ord)
1501de8cc8edSafresh1    UV ord
1502de8cc8edSafresh1    CODE:
1503de8cc8edSafresh1        RETVAL = isUPPER_L1(ord);
1504de8cc8edSafresh1    OUTPUT:
1505de8cc8edSafresh1        RETVAL
1506de8cc8edSafresh1
1507de8cc8edSafresh1bool
1508de8cc8edSafresh1isLOWER(ord)
1509de8cc8edSafresh1    UV ord
1510f3efcd01Safresh1    CODE:
1511f3efcd01Safresh1        RETVAL = isLOWER(ord);
1512f3efcd01Safresh1    OUTPUT:
1513f3efcd01Safresh1        RETVAL
1514f3efcd01Safresh1
1515f3efcd01Safresh1bool
1516de8cc8edSafresh1isLOWER_A(ord)
1517de8cc8edSafresh1    UV ord
1518f3efcd01Safresh1    CODE:
1519f3efcd01Safresh1        RETVAL = isLOWER_A(ord);
1520f3efcd01Safresh1    OUTPUT:
1521f3efcd01Safresh1        RETVAL
1522f3efcd01Safresh1
1523f3efcd01Safresh1bool
1524de8cc8edSafresh1isLOWER_L1(ord)
1525de8cc8edSafresh1    UV ord
1526de8cc8edSafresh1    CODE:
1527de8cc8edSafresh1        RETVAL = isLOWER_L1(ord);
1528de8cc8edSafresh1    OUTPUT:
1529de8cc8edSafresh1        RETVAL
1530de8cc8edSafresh1
1531de8cc8edSafresh1bool
1532de8cc8edSafresh1isALPHA(ord)
1533de8cc8edSafresh1    UV ord
1534f3efcd01Safresh1    CODE:
1535f3efcd01Safresh1        RETVAL = isALPHA(ord);
1536f3efcd01Safresh1    OUTPUT:
1537f3efcd01Safresh1        RETVAL
1538f3efcd01Safresh1
1539f3efcd01Safresh1bool
1540de8cc8edSafresh1isALPHA_A(ord)
1541de8cc8edSafresh1    UV ord
1542f3efcd01Safresh1    CODE:
1543f3efcd01Safresh1        RETVAL = isALPHA_A(ord);
1544f3efcd01Safresh1    OUTPUT:
1545f3efcd01Safresh1        RETVAL
1546f3efcd01Safresh1
1547f3efcd01Safresh1bool
1548de8cc8edSafresh1isALPHA_L1(ord)
1549de8cc8edSafresh1    UV ord
1550de8cc8edSafresh1    CODE:
1551de8cc8edSafresh1        RETVAL = isALPHA_L1(ord);
1552de8cc8edSafresh1    OUTPUT:
1553de8cc8edSafresh1        RETVAL
1554de8cc8edSafresh1
1555de8cc8edSafresh1bool
1556de8cc8edSafresh1isWORDCHAR(ord)
1557de8cc8edSafresh1    UV ord
1558f3efcd01Safresh1    CODE:
1559f3efcd01Safresh1        RETVAL = isWORDCHAR(ord);
1560f3efcd01Safresh1    OUTPUT:
1561f3efcd01Safresh1        RETVAL
1562f3efcd01Safresh1
1563f3efcd01Safresh1bool
1564de8cc8edSafresh1isWORDCHAR_A(ord)
1565de8cc8edSafresh1    UV ord
1566f3efcd01Safresh1    CODE:
1567f3efcd01Safresh1        RETVAL = isWORDCHAR_A(ord);
1568f3efcd01Safresh1    OUTPUT:
1569f3efcd01Safresh1        RETVAL
1570f3efcd01Safresh1
1571f3efcd01Safresh1bool
1572de8cc8edSafresh1isWORDCHAR_L1(ord)
1573de8cc8edSafresh1    UV ord
1574de8cc8edSafresh1    CODE:
1575de8cc8edSafresh1        RETVAL = isWORDCHAR_L1(ord);
1576de8cc8edSafresh1    OUTPUT:
1577de8cc8edSafresh1        RETVAL
1578de8cc8edSafresh1
1579de8cc8edSafresh1bool
1580de8cc8edSafresh1isALPHANUMERIC(ord)
1581de8cc8edSafresh1    UV ord
1582f3efcd01Safresh1    CODE:
1583f3efcd01Safresh1        RETVAL = isALPHANUMERIC(ord);
1584f3efcd01Safresh1    OUTPUT:
1585f3efcd01Safresh1        RETVAL
1586f3efcd01Safresh1
1587f3efcd01Safresh1bool
1588de8cc8edSafresh1isALPHANUMERIC_A(ord)
1589de8cc8edSafresh1    UV ord
1590f3efcd01Safresh1    CODE:
1591f3efcd01Safresh1        RETVAL = isALPHANUMERIC_A(ord);
1592f3efcd01Safresh1    OUTPUT:
1593f3efcd01Safresh1        RETVAL
1594f3efcd01Safresh1
1595f3efcd01Safresh1bool
1596de8cc8edSafresh1isALNUM(ord)
1597de8cc8edSafresh1    UV ord
1598f3efcd01Safresh1    CODE:
1599f3efcd01Safresh1        RETVAL = isALNUM(ord);
1600f3efcd01Safresh1    OUTPUT:
1601f3efcd01Safresh1        RETVAL
1602f3efcd01Safresh1
1603f3efcd01Safresh1bool
1604de8cc8edSafresh1isALNUM_A(ord)
1605de8cc8edSafresh1    UV ord
1606f3efcd01Safresh1    CODE:
1607f3efcd01Safresh1        RETVAL = isALNUM_A(ord);
1608f3efcd01Safresh1    OUTPUT:
1609f3efcd01Safresh1        RETVAL
1610f3efcd01Safresh1
1611f3efcd01Safresh1bool
1612de8cc8edSafresh1isDIGIT(ord)
1613de8cc8edSafresh1    UV ord
1614f3efcd01Safresh1    CODE:
1615f3efcd01Safresh1        RETVAL = isDIGIT(ord);
1616f3efcd01Safresh1    OUTPUT:
1617f3efcd01Safresh1        RETVAL
1618f3efcd01Safresh1
1619f3efcd01Safresh1bool
1620de8cc8edSafresh1isDIGIT_A(ord)
1621de8cc8edSafresh1    UV ord
1622f3efcd01Safresh1    CODE:
1623f3efcd01Safresh1        RETVAL = isDIGIT_A(ord);
1624f3efcd01Safresh1    OUTPUT:
1625f3efcd01Safresh1        RETVAL
1626f3efcd01Safresh1
1627f3efcd01Safresh1bool
1628de8cc8edSafresh1isOCTAL(ord)
1629de8cc8edSafresh1    UV ord
1630f3efcd01Safresh1    CODE:
1631f3efcd01Safresh1        RETVAL = isOCTAL(ord);
1632f3efcd01Safresh1    OUTPUT:
1633f3efcd01Safresh1        RETVAL
1634f3efcd01Safresh1
1635f3efcd01Safresh1bool
1636de8cc8edSafresh1isOCTAL_A(ord)
1637de8cc8edSafresh1    UV ord
1638f3efcd01Safresh1    CODE:
1639f3efcd01Safresh1        RETVAL = isOCTAL_A(ord);
1640f3efcd01Safresh1    OUTPUT:
1641f3efcd01Safresh1        RETVAL
1642f3efcd01Safresh1
1643f3efcd01Safresh1bool
1644de8cc8edSafresh1isIDFIRST(ord)
1645de8cc8edSafresh1    UV ord
1646f3efcd01Safresh1    CODE:
1647f3efcd01Safresh1        RETVAL = isIDFIRST(ord);
1648f3efcd01Safresh1    OUTPUT:
1649f3efcd01Safresh1        RETVAL
1650f3efcd01Safresh1
1651f3efcd01Safresh1bool
1652de8cc8edSafresh1isIDFIRST_A(ord)
1653de8cc8edSafresh1    UV ord
1654f3efcd01Safresh1    CODE:
1655f3efcd01Safresh1        RETVAL = isIDFIRST_A(ord);
1656f3efcd01Safresh1    OUTPUT:
1657f3efcd01Safresh1        RETVAL
1658f3efcd01Safresh1
1659f3efcd01Safresh1bool
1660de8cc8edSafresh1isIDCONT(ord)
1661de8cc8edSafresh1    UV ord
1662f3efcd01Safresh1    CODE:
1663f3efcd01Safresh1        RETVAL = isIDCONT(ord);
1664f3efcd01Safresh1    OUTPUT:
1665f3efcd01Safresh1        RETVAL
1666f3efcd01Safresh1
1667f3efcd01Safresh1bool
1668de8cc8edSafresh1isIDCONT_A(ord)
1669de8cc8edSafresh1    UV ord
1670f3efcd01Safresh1    CODE:
1671f3efcd01Safresh1        RETVAL = isIDCONT_A(ord);
1672f3efcd01Safresh1    OUTPUT:
1673f3efcd01Safresh1        RETVAL
1674f3efcd01Safresh1
1675f3efcd01Safresh1bool
1676de8cc8edSafresh1isSPACE(ord)
1677de8cc8edSafresh1    UV ord
1678f3efcd01Safresh1    CODE:
1679f3efcd01Safresh1        RETVAL = isSPACE(ord);
1680f3efcd01Safresh1    OUTPUT:
1681f3efcd01Safresh1        RETVAL
1682f3efcd01Safresh1
1683f3efcd01Safresh1bool
1684de8cc8edSafresh1isSPACE_A(ord)
1685de8cc8edSafresh1    UV ord
1686f3efcd01Safresh1    CODE:
1687f3efcd01Safresh1        RETVAL = isSPACE_A(ord);
1688f3efcd01Safresh1    OUTPUT:
1689f3efcd01Safresh1        RETVAL
1690f3efcd01Safresh1
1691f3efcd01Safresh1bool
1692de8cc8edSafresh1isASCII(ord)
1693de8cc8edSafresh1    UV ord
1694f3efcd01Safresh1    CODE:
1695f3efcd01Safresh1        RETVAL = isASCII(ord);
1696f3efcd01Safresh1    OUTPUT:
1697f3efcd01Safresh1        RETVAL
1698f3efcd01Safresh1
1699f3efcd01Safresh1bool
1700de8cc8edSafresh1isASCII_A(ord)
1701de8cc8edSafresh1    UV ord
1702f3efcd01Safresh1    CODE:
1703f3efcd01Safresh1        RETVAL = isASCII_A(ord);
1704f3efcd01Safresh1    OUTPUT:
1705f3efcd01Safresh1        RETVAL
1706f3efcd01Safresh1
1707f3efcd01Safresh1bool
1708de8cc8edSafresh1isCNTRL(ord)
1709de8cc8edSafresh1    UV ord
1710f3efcd01Safresh1    CODE:
1711f3efcd01Safresh1        RETVAL = isCNTRL(ord);
1712f3efcd01Safresh1    OUTPUT:
1713f3efcd01Safresh1        RETVAL
1714f3efcd01Safresh1
1715f3efcd01Safresh1bool
1716de8cc8edSafresh1isCNTRL_A(ord)
1717de8cc8edSafresh1    UV ord
1718f3efcd01Safresh1    CODE:
1719f3efcd01Safresh1        RETVAL = isCNTRL_A(ord);
1720f3efcd01Safresh1    OUTPUT:
1721f3efcd01Safresh1        RETVAL
1722f3efcd01Safresh1
1723f3efcd01Safresh1bool
1724de8cc8edSafresh1isPRINT(ord)
1725de8cc8edSafresh1    UV ord
1726f3efcd01Safresh1    CODE:
1727f3efcd01Safresh1        RETVAL = isPRINT(ord);
1728f3efcd01Safresh1    OUTPUT:
1729f3efcd01Safresh1        RETVAL
1730f3efcd01Safresh1
1731f3efcd01Safresh1bool
1732de8cc8edSafresh1isPRINT_A(ord)
1733de8cc8edSafresh1    UV ord
1734f3efcd01Safresh1    CODE:
1735f3efcd01Safresh1        RETVAL = isPRINT_A(ord);
1736f3efcd01Safresh1    OUTPUT:
1737f3efcd01Safresh1        RETVAL
1738f3efcd01Safresh1
1739f3efcd01Safresh1bool
1740de8cc8edSafresh1isGRAPH(ord)
1741de8cc8edSafresh1    UV ord
1742f3efcd01Safresh1    CODE:
1743f3efcd01Safresh1        RETVAL = isGRAPH(ord);
1744f3efcd01Safresh1    OUTPUT:
1745f3efcd01Safresh1        RETVAL
1746f3efcd01Safresh1
1747f3efcd01Safresh1bool
1748de8cc8edSafresh1isGRAPH_A(ord)
1749de8cc8edSafresh1    UV ord
1750f3efcd01Safresh1    CODE:
1751f3efcd01Safresh1        RETVAL = isGRAPH_A(ord);
1752f3efcd01Safresh1    OUTPUT:
1753f3efcd01Safresh1        RETVAL
1754f3efcd01Safresh1
1755f3efcd01Safresh1bool
1756de8cc8edSafresh1isPUNCT(ord)
1757de8cc8edSafresh1    UV ord
1758f3efcd01Safresh1    CODE:
1759f3efcd01Safresh1        RETVAL = isPUNCT(ord);
1760f3efcd01Safresh1    OUTPUT:
1761f3efcd01Safresh1        RETVAL
1762f3efcd01Safresh1
1763f3efcd01Safresh1bool
1764de8cc8edSafresh1isPUNCT_A(ord)
1765de8cc8edSafresh1    UV ord
1766f3efcd01Safresh1    CODE:
1767f3efcd01Safresh1        RETVAL = isPUNCT_A(ord);
1768f3efcd01Safresh1    OUTPUT:
1769f3efcd01Safresh1        RETVAL
1770f3efcd01Safresh1
1771f3efcd01Safresh1bool
1772de8cc8edSafresh1isXDIGIT(ord)
1773de8cc8edSafresh1    UV ord
1774f3efcd01Safresh1    CODE:
1775f3efcd01Safresh1        RETVAL = isXDIGIT(ord);
1776f3efcd01Safresh1    OUTPUT:
1777f3efcd01Safresh1        RETVAL
1778f3efcd01Safresh1
1779f3efcd01Safresh1bool
1780de8cc8edSafresh1isXDIGIT_A(ord)
1781de8cc8edSafresh1    UV ord
1782f3efcd01Safresh1    CODE:
1783f3efcd01Safresh1        RETVAL = isXDIGIT_A(ord);
1784f3efcd01Safresh1    OUTPUT:
1785f3efcd01Safresh1        RETVAL
1786f3efcd01Safresh1
1787f3efcd01Safresh1bool
1788de8cc8edSafresh1isPSXSPC(ord)
1789de8cc8edSafresh1    UV ord
1790f3efcd01Safresh1    CODE:
1791f3efcd01Safresh1        RETVAL = isPSXSPC(ord);
1792f3efcd01Safresh1    OUTPUT:
1793f3efcd01Safresh1        RETVAL
1794f3efcd01Safresh1
1795f3efcd01Safresh1bool
1796de8cc8edSafresh1isPSXSPC_A(ord)
1797de8cc8edSafresh1    UV ord
1798f3efcd01Safresh1    CODE:
1799f3efcd01Safresh1        RETVAL = isPSXSPC_A(ord);
1800f3efcd01Safresh1    OUTPUT:
1801f3efcd01Safresh1        RETVAL
1802f3efcd01Safresh1
1803de8cc8edSafresh1bool
1804de8cc8edSafresh1isALPHANUMERIC_L1(ord)
1805de8cc8edSafresh1    UV ord
1806de8cc8edSafresh1    CODE:
1807de8cc8edSafresh1        RETVAL = isALPHANUMERIC_L1(ord);
1808de8cc8edSafresh1    OUTPUT:
1809de8cc8edSafresh1        RETVAL
1810de8cc8edSafresh1
1811de8cc8edSafresh1bool
1812de8cc8edSafresh1isALNUMC_L1(ord)
1813de8cc8edSafresh1    UV ord
1814de8cc8edSafresh1    CODE:
1815de8cc8edSafresh1        RETVAL = isALNUMC_L1(ord);
1816de8cc8edSafresh1    OUTPUT:
1817de8cc8edSafresh1        RETVAL
1818de8cc8edSafresh1
1819de8cc8edSafresh1bool
1820de8cc8edSafresh1isDIGIT_L1(ord)
1821de8cc8edSafresh1    UV ord
1822de8cc8edSafresh1    CODE:
1823de8cc8edSafresh1        RETVAL = isDIGIT_L1(ord);
1824de8cc8edSafresh1    OUTPUT:
1825de8cc8edSafresh1        RETVAL
1826de8cc8edSafresh1
1827de8cc8edSafresh1bool
1828de8cc8edSafresh1isOCTAL_L1(ord)
1829de8cc8edSafresh1    UV ord
1830de8cc8edSafresh1    CODE:
1831de8cc8edSafresh1        RETVAL = isOCTAL_L1(ord);
1832de8cc8edSafresh1    OUTPUT:
1833de8cc8edSafresh1        RETVAL
1834de8cc8edSafresh1
1835de8cc8edSafresh1bool
1836de8cc8edSafresh1isIDFIRST_L1(ord)
1837de8cc8edSafresh1    UV ord
1838de8cc8edSafresh1    CODE:
1839de8cc8edSafresh1        RETVAL = isIDFIRST_L1(ord);
1840de8cc8edSafresh1    OUTPUT:
1841de8cc8edSafresh1        RETVAL
1842de8cc8edSafresh1
1843de8cc8edSafresh1bool
1844de8cc8edSafresh1isIDCONT_L1(ord)
1845de8cc8edSafresh1    UV ord
1846de8cc8edSafresh1    CODE:
1847de8cc8edSafresh1        RETVAL = isIDCONT_L1(ord);
1848de8cc8edSafresh1    OUTPUT:
1849de8cc8edSafresh1        RETVAL
1850de8cc8edSafresh1
1851de8cc8edSafresh1bool
1852de8cc8edSafresh1isSPACE_L1(ord)
1853de8cc8edSafresh1    UV ord
1854de8cc8edSafresh1    CODE:
1855de8cc8edSafresh1        RETVAL = isSPACE_L1(ord);
1856de8cc8edSafresh1    OUTPUT:
1857de8cc8edSafresh1        RETVAL
1858de8cc8edSafresh1
1859de8cc8edSafresh1bool
1860de8cc8edSafresh1isASCII_L1(ord)
1861de8cc8edSafresh1    UV ord
1862de8cc8edSafresh1    CODE:
1863de8cc8edSafresh1        RETVAL = isASCII_L1(ord);
1864de8cc8edSafresh1    OUTPUT:
1865de8cc8edSafresh1        RETVAL
1866de8cc8edSafresh1
1867de8cc8edSafresh1bool
1868de8cc8edSafresh1isCNTRL_L1(ord)
1869de8cc8edSafresh1    UV ord
1870de8cc8edSafresh1    CODE:
1871de8cc8edSafresh1        RETVAL = isCNTRL_L1(ord);
1872de8cc8edSafresh1    OUTPUT:
1873de8cc8edSafresh1        RETVAL
1874de8cc8edSafresh1
1875de8cc8edSafresh1bool
1876de8cc8edSafresh1isPRINT_L1(ord)
1877de8cc8edSafresh1    UV ord
1878de8cc8edSafresh1    CODE:
1879de8cc8edSafresh1        RETVAL = isPRINT_L1(ord);
1880de8cc8edSafresh1    OUTPUT:
1881de8cc8edSafresh1        RETVAL
1882de8cc8edSafresh1
1883de8cc8edSafresh1bool
1884de8cc8edSafresh1isGRAPH_L1(ord)
1885de8cc8edSafresh1    UV ord
1886de8cc8edSafresh1    CODE:
1887de8cc8edSafresh1        RETVAL = isGRAPH_L1(ord);
1888de8cc8edSafresh1    OUTPUT:
1889de8cc8edSafresh1        RETVAL
1890de8cc8edSafresh1
1891de8cc8edSafresh1bool
1892de8cc8edSafresh1isPUNCT_L1(ord)
1893de8cc8edSafresh1    UV ord
1894de8cc8edSafresh1    CODE:
1895de8cc8edSafresh1        RETVAL = isPUNCT_L1(ord);
1896de8cc8edSafresh1    OUTPUT:
1897de8cc8edSafresh1        RETVAL
1898de8cc8edSafresh1
1899de8cc8edSafresh1bool
1900de8cc8edSafresh1isXDIGIT_L1(ord)
1901de8cc8edSafresh1    UV ord
1902de8cc8edSafresh1    CODE:
1903de8cc8edSafresh1        RETVAL = isXDIGIT_L1(ord);
1904de8cc8edSafresh1    OUTPUT:
1905de8cc8edSafresh1        RETVAL
1906de8cc8edSafresh1
1907de8cc8edSafresh1bool
1908de8cc8edSafresh1isPSXSPC_L1(ord)
1909de8cc8edSafresh1    UV ord
1910de8cc8edSafresh1    CODE:
1911de8cc8edSafresh1        RETVAL = isPSXSPC_L1(ord);
1912de8cc8edSafresh1    OUTPUT:
1913de8cc8edSafresh1        RETVAL
1914de8cc8edSafresh1
1915de8cc8edSafresh1bool
1916de8cc8edSafresh1isASCII_uvchr(ord)
1917de8cc8edSafresh1    UV ord
1918de8cc8edSafresh1    CODE:
1919de8cc8edSafresh1        RETVAL = isASCII_uvchr(ord);
1920de8cc8edSafresh1    OUTPUT:
1921de8cc8edSafresh1        RETVAL
1922de8cc8edSafresh1
1923de8cc8edSafresh1bool
1924de8cc8edSafresh1isASCII_utf8_safe(s, offset)
1925de8cc8edSafresh1    unsigned char * s
1926de8cc8edSafresh1    int offset
1927de8cc8edSafresh1    CODE:
1928de8cc8edSafresh1        PERL_UNUSED_ARG(offset);
1929de8cc8edSafresh1        RETVAL = isASCII_utf8_safe(s, s + 1 + offset);
1930de8cc8edSafresh1    OUTPUT:
1931de8cc8edSafresh1        RETVAL
1932de8cc8edSafresh1
1933de8cc8edSafresh1#if { VERSION >= 5.006 }
1934de8cc8edSafresh1
1935de8cc8edSafresh1bool
1936de8cc8edSafresh1isBLANK_uvchr(ord)
1937de8cc8edSafresh1    UV ord
1938de8cc8edSafresh1    CODE:
1939de8cc8edSafresh1        RETVAL = isBLANK_uvchr(ord);
1940de8cc8edSafresh1    OUTPUT:
1941de8cc8edSafresh1        RETVAL
1942de8cc8edSafresh1
1943de8cc8edSafresh1bool
1944de8cc8edSafresh1isALPHA_uvchr(ord)
1945de8cc8edSafresh1    UV ord
1946de8cc8edSafresh1    CODE:
1947de8cc8edSafresh1        RETVAL = isALPHA_uvchr(ord);
1948de8cc8edSafresh1    OUTPUT:
1949de8cc8edSafresh1        RETVAL
1950de8cc8edSafresh1
1951de8cc8edSafresh1bool
1952de8cc8edSafresh1isALPHANUMERIC_uvchr(ord)
1953de8cc8edSafresh1    UV ord
1954de8cc8edSafresh1    CODE:
1955de8cc8edSafresh1        RETVAL = isALPHANUMERIC_uvchr(ord);
1956de8cc8edSafresh1    OUTPUT:
1957de8cc8edSafresh1        RETVAL
1958de8cc8edSafresh1
1959de8cc8edSafresh1bool
1960de8cc8edSafresh1isCNTRL_uvchr(ord)
1961de8cc8edSafresh1    UV ord
1962de8cc8edSafresh1    CODE:
1963de8cc8edSafresh1        RETVAL = isCNTRL_uvchr(ord);
1964de8cc8edSafresh1    OUTPUT:
1965de8cc8edSafresh1        RETVAL
1966de8cc8edSafresh1
1967de8cc8edSafresh1bool
1968de8cc8edSafresh1isDIGIT_uvchr(ord)
1969de8cc8edSafresh1    UV ord
1970de8cc8edSafresh1    CODE:
1971de8cc8edSafresh1        RETVAL = isDIGIT_uvchr(ord);
1972de8cc8edSafresh1    OUTPUT:
1973de8cc8edSafresh1        RETVAL
1974de8cc8edSafresh1
1975de8cc8edSafresh1bool
1976de8cc8edSafresh1isIDFIRST_uvchr(ord)
1977de8cc8edSafresh1    UV ord
1978de8cc8edSafresh1    CODE:
1979de8cc8edSafresh1        RETVAL = isIDFIRST_uvchr(ord);
1980de8cc8edSafresh1    OUTPUT:
1981de8cc8edSafresh1        RETVAL
1982de8cc8edSafresh1
1983de8cc8edSafresh1bool
1984de8cc8edSafresh1isIDCONT_uvchr(ord)
1985de8cc8edSafresh1    UV ord
1986de8cc8edSafresh1    CODE:
1987de8cc8edSafresh1        RETVAL = isIDCONT_uvchr(ord);
1988de8cc8edSafresh1    OUTPUT:
1989de8cc8edSafresh1        RETVAL
1990de8cc8edSafresh1
1991de8cc8edSafresh1bool
1992de8cc8edSafresh1isGRAPH_uvchr(ord)
1993de8cc8edSafresh1    UV ord
1994de8cc8edSafresh1    CODE:
1995de8cc8edSafresh1        RETVAL = isGRAPH_uvchr(ord);
1996de8cc8edSafresh1    OUTPUT:
1997de8cc8edSafresh1        RETVAL
1998de8cc8edSafresh1
1999de8cc8edSafresh1bool
2000de8cc8edSafresh1isLOWER_uvchr(ord)
2001de8cc8edSafresh1    UV ord
2002de8cc8edSafresh1    CODE:
2003de8cc8edSafresh1        RETVAL = isLOWER_uvchr(ord);
2004de8cc8edSafresh1    OUTPUT:
2005de8cc8edSafresh1        RETVAL
2006de8cc8edSafresh1
2007de8cc8edSafresh1bool
2008de8cc8edSafresh1isPRINT_uvchr(ord)
2009de8cc8edSafresh1    UV ord
2010de8cc8edSafresh1    CODE:
2011de8cc8edSafresh1        RETVAL = isPRINT_uvchr(ord);
2012de8cc8edSafresh1    OUTPUT:
2013de8cc8edSafresh1        RETVAL
2014de8cc8edSafresh1
2015de8cc8edSafresh1bool
2016de8cc8edSafresh1isPSXSPC_uvchr(ord)
2017de8cc8edSafresh1    UV ord
2018de8cc8edSafresh1    CODE:
2019de8cc8edSafresh1        RETVAL = isPSXSPC_uvchr(ord);
2020de8cc8edSafresh1    OUTPUT:
2021de8cc8edSafresh1        RETVAL
2022de8cc8edSafresh1
2023de8cc8edSafresh1bool
2024de8cc8edSafresh1isPUNCT_uvchr(ord)
2025de8cc8edSafresh1    UV ord
2026de8cc8edSafresh1    CODE:
2027de8cc8edSafresh1        RETVAL = isPUNCT_uvchr(ord);
2028de8cc8edSafresh1    OUTPUT:
2029de8cc8edSafresh1        RETVAL
2030de8cc8edSafresh1
2031de8cc8edSafresh1bool
2032de8cc8edSafresh1isSPACE_uvchr(ord)
2033de8cc8edSafresh1    UV ord
2034de8cc8edSafresh1    CODE:
2035de8cc8edSafresh1        RETVAL = isSPACE_uvchr(ord);
2036de8cc8edSafresh1    OUTPUT:
2037de8cc8edSafresh1        RETVAL
2038de8cc8edSafresh1
2039de8cc8edSafresh1bool
2040de8cc8edSafresh1isUPPER_uvchr(ord)
2041de8cc8edSafresh1    UV ord
2042de8cc8edSafresh1    CODE:
2043de8cc8edSafresh1        RETVAL = isUPPER_uvchr(ord);
2044de8cc8edSafresh1    OUTPUT:
2045de8cc8edSafresh1        RETVAL
2046de8cc8edSafresh1
2047de8cc8edSafresh1bool
2048de8cc8edSafresh1isWORDCHAR_uvchr(ord)
2049de8cc8edSafresh1    UV ord
2050de8cc8edSafresh1    CODE:
2051de8cc8edSafresh1        RETVAL = isWORDCHAR_uvchr(ord);
2052de8cc8edSafresh1    OUTPUT:
2053de8cc8edSafresh1        RETVAL
2054de8cc8edSafresh1
2055de8cc8edSafresh1bool
2056de8cc8edSafresh1isXDIGIT_uvchr(ord)
2057de8cc8edSafresh1    UV ord
2058de8cc8edSafresh1    CODE:
2059de8cc8edSafresh1        RETVAL = isXDIGIT_uvchr(ord);
2060de8cc8edSafresh1    OUTPUT:
2061de8cc8edSafresh1        RETVAL
2062de8cc8edSafresh1
2063de8cc8edSafresh1bool
2064de8cc8edSafresh1isALPHA_utf8_safe(s, offset)
2065de8cc8edSafresh1    unsigned char * s
2066de8cc8edSafresh1    int offset
2067de8cc8edSafresh1    CODE:
2068de8cc8edSafresh1        RETVAL = isALPHA_utf8_safe(s, s + UTF8SKIP(s) + offset);
2069de8cc8edSafresh1    OUTPUT:
2070de8cc8edSafresh1        RETVAL
2071de8cc8edSafresh1
2072de8cc8edSafresh1bool
2073de8cc8edSafresh1isALPHANUMERIC_utf8_safe(s, offset)
2074de8cc8edSafresh1    unsigned char * s
2075de8cc8edSafresh1    int offset
2076de8cc8edSafresh1    CODE:
2077de8cc8edSafresh1        RETVAL = isALPHANUMERIC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2078de8cc8edSafresh1    OUTPUT:
2079de8cc8edSafresh1        RETVAL
2080de8cc8edSafresh1
2081de8cc8edSafresh1bool
2082de8cc8edSafresh1isBLANK_utf8_safe(s, offset)
2083de8cc8edSafresh1    unsigned char * s
2084de8cc8edSafresh1    int offset
2085de8cc8edSafresh1    CODE:
2086de8cc8edSafresh1        RETVAL = isBLANK_utf8_safe(s, s + UTF8SKIP(s) + offset);
2087de8cc8edSafresh1    OUTPUT:
2088de8cc8edSafresh1        RETVAL
2089de8cc8edSafresh1
2090de8cc8edSafresh1bool
2091de8cc8edSafresh1isCNTRL_utf8_safe(s, offset)
2092de8cc8edSafresh1    unsigned char * s
2093de8cc8edSafresh1    int offset
2094de8cc8edSafresh1    CODE:
2095de8cc8edSafresh1        RETVAL = isCNTRL_utf8_safe(s, s + UTF8SKIP(s) + offset);
2096de8cc8edSafresh1    OUTPUT:
2097de8cc8edSafresh1        RETVAL
2098de8cc8edSafresh1
2099de8cc8edSafresh1bool
2100de8cc8edSafresh1isDIGIT_utf8_safe(s, offset)
2101de8cc8edSafresh1    unsigned char * s
2102de8cc8edSafresh1    int offset
2103de8cc8edSafresh1    CODE:
2104de8cc8edSafresh1        RETVAL = isDIGIT_utf8_safe(s, s + UTF8SKIP(s) + offset);
2105de8cc8edSafresh1    OUTPUT:
2106de8cc8edSafresh1        RETVAL
2107de8cc8edSafresh1
2108de8cc8edSafresh1bool
2109de8cc8edSafresh1isGRAPH_utf8_safe(s, offset)
2110de8cc8edSafresh1    unsigned char * s
2111de8cc8edSafresh1    int offset
2112de8cc8edSafresh1    CODE:
2113de8cc8edSafresh1        RETVAL = isGRAPH_utf8_safe(s, s + UTF8SKIP(s) + offset);
2114de8cc8edSafresh1    OUTPUT:
2115de8cc8edSafresh1        RETVAL
2116de8cc8edSafresh1
2117de8cc8edSafresh1bool
2118de8cc8edSafresh1isIDCONT_utf8_safe(s, offset)
2119de8cc8edSafresh1    unsigned char * s
2120de8cc8edSafresh1    int offset
2121de8cc8edSafresh1    CODE:
2122de8cc8edSafresh1        RETVAL = isIDCONT_utf8_safe(s, s + UTF8SKIP(s) + offset);
2123de8cc8edSafresh1    OUTPUT:
2124de8cc8edSafresh1        RETVAL
2125de8cc8edSafresh1
2126de8cc8edSafresh1bool
2127de8cc8edSafresh1isIDFIRST_utf8_safe(s, offset)
2128de8cc8edSafresh1    unsigned char * s
2129de8cc8edSafresh1    int offset
2130de8cc8edSafresh1    CODE:
2131de8cc8edSafresh1        RETVAL = isIDFIRST_utf8_safe(s, s + UTF8SKIP(s) + offset);
2132de8cc8edSafresh1    OUTPUT:
2133de8cc8edSafresh1        RETVAL
2134de8cc8edSafresh1
2135de8cc8edSafresh1bool
2136de8cc8edSafresh1isLOWER_utf8_safe(s, offset)
2137de8cc8edSafresh1    unsigned char * s
2138de8cc8edSafresh1    int offset
2139de8cc8edSafresh1    CODE:
2140de8cc8edSafresh1        RETVAL = isLOWER_utf8_safe(s, s + UTF8SKIP(s) + offset);
2141de8cc8edSafresh1    OUTPUT:
2142de8cc8edSafresh1        RETVAL
2143de8cc8edSafresh1
2144de8cc8edSafresh1bool
2145de8cc8edSafresh1isPRINT_utf8_safe(s, offset)
2146de8cc8edSafresh1    unsigned char * s
2147de8cc8edSafresh1    int offset
2148de8cc8edSafresh1    CODE:
2149de8cc8edSafresh1        RETVAL = isPRINT_utf8_safe(s, s + UTF8SKIP(s) + offset);
2150de8cc8edSafresh1    OUTPUT:
2151de8cc8edSafresh1        RETVAL
2152de8cc8edSafresh1
2153de8cc8edSafresh1bool
2154de8cc8edSafresh1isPSXSPC_utf8_safe(s, offset)
2155de8cc8edSafresh1    unsigned char * s
2156de8cc8edSafresh1    int offset
2157de8cc8edSafresh1    CODE:
2158de8cc8edSafresh1        RETVAL = isPSXSPC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2159de8cc8edSafresh1    OUTPUT:
2160de8cc8edSafresh1        RETVAL
2161de8cc8edSafresh1
2162de8cc8edSafresh1bool
2163de8cc8edSafresh1isPUNCT_utf8_safe(s, offset)
2164de8cc8edSafresh1    unsigned char * s
2165de8cc8edSafresh1    int offset
2166de8cc8edSafresh1    CODE:
2167de8cc8edSafresh1        RETVAL = isPUNCT_utf8_safe(s, s + UTF8SKIP(s) + offset);
2168de8cc8edSafresh1    OUTPUT:
2169de8cc8edSafresh1        RETVAL
2170de8cc8edSafresh1
2171de8cc8edSafresh1bool
2172de8cc8edSafresh1isSPACE_utf8_safe(s, offset)
2173de8cc8edSafresh1    unsigned char * s
2174de8cc8edSafresh1    int offset
2175de8cc8edSafresh1    CODE:
2176de8cc8edSafresh1        RETVAL = isSPACE_utf8_safe(s, s + UTF8SKIP(s) + offset);
2177de8cc8edSafresh1    OUTPUT:
2178de8cc8edSafresh1        RETVAL
2179de8cc8edSafresh1
2180de8cc8edSafresh1bool
2181de8cc8edSafresh1isUPPER_utf8_safe(s, offset)
2182de8cc8edSafresh1    unsigned char * s
2183de8cc8edSafresh1    int offset
2184de8cc8edSafresh1    CODE:
2185de8cc8edSafresh1        RETVAL = isUPPER_utf8_safe(s, s + UTF8SKIP(s) + offset);
2186de8cc8edSafresh1    OUTPUT:
2187de8cc8edSafresh1        RETVAL
2188de8cc8edSafresh1
2189de8cc8edSafresh1bool
2190de8cc8edSafresh1isWORDCHAR_utf8_safe(s, offset)
2191de8cc8edSafresh1    unsigned char * s
2192de8cc8edSafresh1    int offset
2193de8cc8edSafresh1    CODE:
2194de8cc8edSafresh1        RETVAL = isWORDCHAR_utf8_safe(s, s + UTF8SKIP(s) + offset);
2195de8cc8edSafresh1    OUTPUT:
2196de8cc8edSafresh1        RETVAL
2197de8cc8edSafresh1
2198de8cc8edSafresh1bool
2199de8cc8edSafresh1isXDIGIT_utf8_safe(s, offset)
2200de8cc8edSafresh1    unsigned char * s
2201de8cc8edSafresh1    int offset
2202de8cc8edSafresh1    CODE:
2203de8cc8edSafresh1        RETVAL = isXDIGIT_utf8_safe(s, s + UTF8SKIP(s) + offset);
2204de8cc8edSafresh1    OUTPUT:
2205de8cc8edSafresh1        RETVAL
2206de8cc8edSafresh1
2207de8cc8edSafresh1bool
2208de8cc8edSafresh1isALPHA_LC_utf8_safe(s, offset)
2209de8cc8edSafresh1    unsigned char * s
2210de8cc8edSafresh1    int offset
2211de8cc8edSafresh1    CODE:
2212de8cc8edSafresh1        RETVAL = isALPHA_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2213de8cc8edSafresh1    OUTPUT:
2214de8cc8edSafresh1        RETVAL
2215de8cc8edSafresh1
2216de8cc8edSafresh1bool
2217de8cc8edSafresh1isALPHANUMERIC_LC_utf8_safe(s, offset)
2218de8cc8edSafresh1    unsigned char * s
2219de8cc8edSafresh1    int offset
2220de8cc8edSafresh1    CODE:
2221de8cc8edSafresh1        RETVAL = isALPHANUMERIC_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2222de8cc8edSafresh1    OUTPUT:
2223de8cc8edSafresh1        RETVAL
2224de8cc8edSafresh1
2225de8cc8edSafresh1bool
2226de8cc8edSafresh1isASCII_LC_utf8_safe(s, offset)
2227de8cc8edSafresh1    unsigned char * s
2228de8cc8edSafresh1    int offset
2229de8cc8edSafresh1    CODE:
2230de8cc8edSafresh1        PERL_UNUSED_ARG(offset);
2231de8cc8edSafresh1        RETVAL = isASCII_utf8_safe(s, s + UTF8SKIP(s) + offset);
2232de8cc8edSafresh1    OUTPUT:
2233de8cc8edSafresh1        RETVAL
2234de8cc8edSafresh1
2235de8cc8edSafresh1bool
2236de8cc8edSafresh1isBLANK_LC_utf8_safe(s, offset)
2237de8cc8edSafresh1    unsigned char * s
2238de8cc8edSafresh1    int offset
2239de8cc8edSafresh1    CODE:
2240de8cc8edSafresh1        RETVAL = isBLANK_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2241de8cc8edSafresh1    OUTPUT:
2242de8cc8edSafresh1        RETVAL
2243de8cc8edSafresh1
2244de8cc8edSafresh1bool
2245de8cc8edSafresh1isCNTRL_LC_utf8_safe(s, offset)
2246de8cc8edSafresh1    unsigned char * s
2247de8cc8edSafresh1    int offset
2248de8cc8edSafresh1    CODE:
2249de8cc8edSafresh1        RETVAL = isCNTRL_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2250de8cc8edSafresh1    OUTPUT:
2251de8cc8edSafresh1        RETVAL
2252de8cc8edSafresh1
2253de8cc8edSafresh1bool
2254de8cc8edSafresh1isDIGIT_LC_utf8_safe(s, offset)
2255de8cc8edSafresh1    unsigned char * s
2256de8cc8edSafresh1    int offset
2257de8cc8edSafresh1    CODE:
2258de8cc8edSafresh1        RETVAL = isDIGIT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2259de8cc8edSafresh1    OUTPUT:
2260de8cc8edSafresh1        RETVAL
2261de8cc8edSafresh1
2262de8cc8edSafresh1bool
2263de8cc8edSafresh1isGRAPH_LC_utf8_safe(s, offset)
2264de8cc8edSafresh1    unsigned char * s
2265de8cc8edSafresh1    int offset
2266de8cc8edSafresh1    CODE:
2267de8cc8edSafresh1        RETVAL = isGRAPH_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2268de8cc8edSafresh1    OUTPUT:
2269de8cc8edSafresh1        RETVAL
2270de8cc8edSafresh1
2271de8cc8edSafresh1bool
2272de8cc8edSafresh1isIDCONT_LC_utf8_safe(s, offset)
2273de8cc8edSafresh1    unsigned char * s
2274de8cc8edSafresh1    int offset
2275de8cc8edSafresh1    CODE:
2276de8cc8edSafresh1        RETVAL = isIDCONT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2277de8cc8edSafresh1    OUTPUT:
2278de8cc8edSafresh1        RETVAL
2279de8cc8edSafresh1
2280de8cc8edSafresh1bool
2281de8cc8edSafresh1isIDFIRST_LC_utf8_safe(s, offset)
2282de8cc8edSafresh1    unsigned char * s
2283de8cc8edSafresh1    int offset
2284de8cc8edSafresh1    CODE:
2285de8cc8edSafresh1        RETVAL = isIDFIRST_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2286de8cc8edSafresh1    OUTPUT:
2287de8cc8edSafresh1        RETVAL
2288de8cc8edSafresh1
2289de8cc8edSafresh1bool
2290de8cc8edSafresh1isLOWER_LC_utf8_safe(s, offset)
2291de8cc8edSafresh1    unsigned char * s
2292de8cc8edSafresh1    int offset
2293de8cc8edSafresh1    CODE:
2294de8cc8edSafresh1        RETVAL = isLOWER_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2295de8cc8edSafresh1    OUTPUT:
2296de8cc8edSafresh1        RETVAL
2297de8cc8edSafresh1
2298de8cc8edSafresh1bool
2299de8cc8edSafresh1isPRINT_LC_utf8_safe(s, offset)
2300de8cc8edSafresh1    unsigned char * s
2301de8cc8edSafresh1    int offset
2302de8cc8edSafresh1    CODE:
2303de8cc8edSafresh1        RETVAL = isPRINT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2304de8cc8edSafresh1    OUTPUT:
2305de8cc8edSafresh1        RETVAL
2306de8cc8edSafresh1
2307de8cc8edSafresh1bool
2308de8cc8edSafresh1isPSXSPC_LC_utf8_safe(s, offset)
2309de8cc8edSafresh1    unsigned char * s
2310de8cc8edSafresh1    int offset
2311de8cc8edSafresh1    CODE:
2312de8cc8edSafresh1        RETVAL = isPSXSPC_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2313de8cc8edSafresh1    OUTPUT:
2314de8cc8edSafresh1        RETVAL
2315de8cc8edSafresh1
2316de8cc8edSafresh1bool
2317de8cc8edSafresh1isPUNCT_LC_utf8_safe(s, offset)
2318de8cc8edSafresh1    unsigned char * s
2319de8cc8edSafresh1    int offset
2320de8cc8edSafresh1    CODE:
2321de8cc8edSafresh1        RETVAL = isPUNCT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2322de8cc8edSafresh1    OUTPUT:
2323de8cc8edSafresh1        RETVAL
2324de8cc8edSafresh1
2325de8cc8edSafresh1bool
2326de8cc8edSafresh1isSPACE_LC_utf8_safe(s, offset)
2327de8cc8edSafresh1    unsigned char * s
2328de8cc8edSafresh1    int offset
2329de8cc8edSafresh1    CODE:
2330de8cc8edSafresh1        RETVAL = isSPACE_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2331de8cc8edSafresh1    OUTPUT:
2332de8cc8edSafresh1        RETVAL
2333de8cc8edSafresh1
2334de8cc8edSafresh1bool
2335de8cc8edSafresh1isUPPER_LC_utf8_safe(s, offset)
2336de8cc8edSafresh1    unsigned char * s
2337de8cc8edSafresh1    int offset
2338de8cc8edSafresh1    CODE:
2339de8cc8edSafresh1        RETVAL = isUPPER_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2340de8cc8edSafresh1    OUTPUT:
2341de8cc8edSafresh1        RETVAL
2342de8cc8edSafresh1
2343de8cc8edSafresh1bool
2344de8cc8edSafresh1isWORDCHAR_LC_utf8_safe(s, offset)
2345de8cc8edSafresh1    unsigned char * s
2346de8cc8edSafresh1    int offset
2347de8cc8edSafresh1    CODE:
2348de8cc8edSafresh1        RETVAL = isWORDCHAR_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2349de8cc8edSafresh1    OUTPUT:
2350de8cc8edSafresh1        RETVAL
2351de8cc8edSafresh1
2352de8cc8edSafresh1bool
2353de8cc8edSafresh1isXDIGIT_LC_utf8_safe(s, offset)
2354de8cc8edSafresh1    unsigned char * s
2355de8cc8edSafresh1    int offset
2356de8cc8edSafresh1    CODE:
2357de8cc8edSafresh1        RETVAL = isXDIGIT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
2358de8cc8edSafresh1    OUTPUT:
2359de8cc8edSafresh1        RETVAL
2360de8cc8edSafresh1
2361de8cc8edSafresh1AV *
2362de8cc8edSafresh1toLOWER_utf8_safe(s, offset)
2363de8cc8edSafresh1    unsigned char * s
2364de8cc8edSafresh1    int offset
2365de8cc8edSafresh1    PREINIT:
2366de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2367de8cc8edSafresh1        Size_t len;
2368de8cc8edSafresh1        UV ret;
2369de8cc8edSafresh1        SV* utf8;
2370de8cc8edSafresh1        AV * av;
2371de8cc8edSafresh1    CODE:
2372de8cc8edSafresh1        av = newAV();
2373de8cc8edSafresh1        ret = toLOWER_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
2374de8cc8edSafresh1        av_push(av, newSVuv(ret));
2375de8cc8edSafresh1
2376de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2377de8cc8edSafresh1        SvUTF8_on(utf8);
2378de8cc8edSafresh1        av_push(av, utf8);
2379de8cc8edSafresh1
2380de8cc8edSafresh1        av_push(av, newSVuv(len));
2381de8cc8edSafresh1        RETVAL = av;
2382de8cc8edSafresh1    OUTPUT:
2383de8cc8edSafresh1        RETVAL
2384de8cc8edSafresh1
2385de8cc8edSafresh1AV *
2386de8cc8edSafresh1toTITLE_utf8_safe(s, offset)
2387de8cc8edSafresh1    unsigned char * s
2388de8cc8edSafresh1    int offset
2389de8cc8edSafresh1    PREINIT:
2390de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2391de8cc8edSafresh1        Size_t len;
2392de8cc8edSafresh1        UV ret;
2393de8cc8edSafresh1        SV* utf8;
2394de8cc8edSafresh1        AV * av;
2395de8cc8edSafresh1    CODE:
2396de8cc8edSafresh1        av = newAV();
2397de8cc8edSafresh1        ret = toTITLE_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
2398de8cc8edSafresh1        av_push(av, newSVuv(ret));
2399de8cc8edSafresh1
2400de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2401de8cc8edSafresh1        SvUTF8_on(utf8);
2402de8cc8edSafresh1        av_push(av, utf8);
2403de8cc8edSafresh1
2404de8cc8edSafresh1        av_push(av, newSVuv(len));
2405de8cc8edSafresh1        RETVAL = av;
2406de8cc8edSafresh1    OUTPUT:
2407de8cc8edSafresh1        RETVAL
2408de8cc8edSafresh1
2409de8cc8edSafresh1AV *
2410de8cc8edSafresh1toUPPER_utf8_safe(s, offset)
2411de8cc8edSafresh1    unsigned char * s
2412de8cc8edSafresh1    int offset
2413de8cc8edSafresh1    PREINIT:
2414de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2415de8cc8edSafresh1        Size_t len;
2416de8cc8edSafresh1        UV ret;
2417de8cc8edSafresh1        SV* utf8;
2418de8cc8edSafresh1        AV * av;
2419de8cc8edSafresh1    CODE:
2420de8cc8edSafresh1        av = newAV();
2421de8cc8edSafresh1        ret = toUPPER_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
2422de8cc8edSafresh1        av_push(av, newSVuv(ret));
2423de8cc8edSafresh1
2424de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2425de8cc8edSafresh1        SvUTF8_on(utf8);
2426de8cc8edSafresh1        av_push(av, utf8);
2427de8cc8edSafresh1
2428de8cc8edSafresh1        av_push(av, newSVuv(len));
2429de8cc8edSafresh1        RETVAL = av;
2430de8cc8edSafresh1    OUTPUT:
2431de8cc8edSafresh1        RETVAL
2432de8cc8edSafresh1
2433de8cc8edSafresh1AV *
2434de8cc8edSafresh1toFOLD_utf8_safe(s, offset)
2435de8cc8edSafresh1    unsigned char * s
2436de8cc8edSafresh1    int offset
2437de8cc8edSafresh1    PREINIT:
2438de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2439de8cc8edSafresh1        Size_t len;
2440de8cc8edSafresh1        UV ret;
2441de8cc8edSafresh1        SV* utf8;
2442de8cc8edSafresh1        AV * av;
2443de8cc8edSafresh1    CODE:
2444de8cc8edSafresh1        av = newAV();
2445de8cc8edSafresh1        ret = toFOLD_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
2446de8cc8edSafresh1        av_push(av, newSVuv(ret));
2447de8cc8edSafresh1
2448de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2449de8cc8edSafresh1        SvUTF8_on(utf8);
2450de8cc8edSafresh1        av_push(av, utf8);
2451de8cc8edSafresh1
2452de8cc8edSafresh1        av_push(av, newSVuv(len));
2453de8cc8edSafresh1        RETVAL = av;
2454de8cc8edSafresh1    OUTPUT:
2455de8cc8edSafresh1        RETVAL
2456de8cc8edSafresh1
2457de8cc8edSafresh1AV *
2458de8cc8edSafresh1toLOWER_uvchr(c)
2459de8cc8edSafresh1    UV c
2460de8cc8edSafresh1    PREINIT:
2461de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2462de8cc8edSafresh1        Size_t len;
2463de8cc8edSafresh1        UV ret;
2464de8cc8edSafresh1        SV* utf8;
2465de8cc8edSafresh1        AV * av;
2466de8cc8edSafresh1    CODE:
2467de8cc8edSafresh1        av = newAV();
2468de8cc8edSafresh1        ret = toLOWER_uvchr(c, u, &len);
2469de8cc8edSafresh1        av_push(av, newSVuv(ret));
2470de8cc8edSafresh1
2471de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2472de8cc8edSafresh1        SvUTF8_on(utf8);
2473de8cc8edSafresh1        av_push(av, utf8);
2474de8cc8edSafresh1
2475de8cc8edSafresh1        av_push(av, newSVuv(len));
2476de8cc8edSafresh1        RETVAL = av;
2477de8cc8edSafresh1    OUTPUT:
2478de8cc8edSafresh1        RETVAL
2479de8cc8edSafresh1
2480de8cc8edSafresh1AV *
2481de8cc8edSafresh1toTITLE_uvchr(c)
2482de8cc8edSafresh1    UV c
2483de8cc8edSafresh1    PREINIT:
2484de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2485de8cc8edSafresh1        Size_t len;
2486de8cc8edSafresh1        UV ret;
2487de8cc8edSafresh1        SV* utf8;
2488de8cc8edSafresh1        AV * av;
2489de8cc8edSafresh1    CODE:
2490de8cc8edSafresh1        av = newAV();
2491de8cc8edSafresh1        ret = toTITLE_uvchr(c, u, &len);
2492de8cc8edSafresh1        av_push(av, newSVuv(ret));
2493de8cc8edSafresh1
2494de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2495de8cc8edSafresh1        SvUTF8_on(utf8);
2496de8cc8edSafresh1        av_push(av, utf8);
2497de8cc8edSafresh1
2498de8cc8edSafresh1        av_push(av, newSVuv(len));
2499de8cc8edSafresh1        RETVAL = av;
2500de8cc8edSafresh1    OUTPUT:
2501de8cc8edSafresh1        RETVAL
2502de8cc8edSafresh1
2503de8cc8edSafresh1AV *
2504de8cc8edSafresh1toUPPER_uvchr(c)
2505de8cc8edSafresh1    UV c
2506de8cc8edSafresh1    PREINIT:
2507de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2508de8cc8edSafresh1        Size_t len;
2509de8cc8edSafresh1        UV ret;
2510de8cc8edSafresh1        SV* utf8;
2511de8cc8edSafresh1        AV * av;
2512de8cc8edSafresh1    CODE:
2513de8cc8edSafresh1        av = newAV();
2514de8cc8edSafresh1        ret = toUPPER_uvchr(c, u, &len);
2515de8cc8edSafresh1        av_push(av, newSVuv(ret));
2516de8cc8edSafresh1
2517de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2518de8cc8edSafresh1        SvUTF8_on(utf8);
2519de8cc8edSafresh1        av_push(av, utf8);
2520de8cc8edSafresh1
2521de8cc8edSafresh1        av_push(av, newSVuv(len));
2522de8cc8edSafresh1        RETVAL = av;
2523de8cc8edSafresh1    OUTPUT:
2524de8cc8edSafresh1        RETVAL
2525de8cc8edSafresh1
2526de8cc8edSafresh1AV *
2527de8cc8edSafresh1toFOLD_uvchr(c)
2528de8cc8edSafresh1    UV c
2529de8cc8edSafresh1    PREINIT:
2530de8cc8edSafresh1        U8 u[UTF8_MAXBYTES+1];
2531de8cc8edSafresh1        Size_t len;
2532de8cc8edSafresh1        UV ret;
2533de8cc8edSafresh1        SV* utf8;
2534de8cc8edSafresh1        AV * av;
2535de8cc8edSafresh1    CODE:
2536de8cc8edSafresh1        av = newAV();
2537de8cc8edSafresh1        ret = toFOLD_uvchr(c, u, &len);
2538de8cc8edSafresh1        av_push(av, newSVuv(ret));
2539de8cc8edSafresh1
2540de8cc8edSafresh1        utf8 = newSVpvn((char *) u, len);
2541de8cc8edSafresh1        SvUTF8_on(utf8);
2542de8cc8edSafresh1        av_push(av, utf8);
2543de8cc8edSafresh1
2544de8cc8edSafresh1        av_push(av, newSVuv(len));
2545de8cc8edSafresh1        RETVAL = av;
2546de8cc8edSafresh1    OUTPUT:
2547de8cc8edSafresh1        RETVAL
2548de8cc8edSafresh1
2549de8cc8edSafresh1#endif
2550de8cc8edSafresh1
2551de8cc8edSafresh1UV
2552de8cc8edSafresh1LATIN1_TO_NATIVE(cp)
2553de8cc8edSafresh1        UV cp
2554de8cc8edSafresh1        CODE:
2555de8cc8edSafresh1                if (cp > 255) RETVAL= cp;
2556de8cc8edSafresh1                else RETVAL= LATIN1_TO_NATIVE(cp);
2557de8cc8edSafresh1        OUTPUT:
2558de8cc8edSafresh1                RETVAL
2559de8cc8edSafresh1
2560de8cc8edSafresh1UV
2561de8cc8edSafresh1NATIVE_TO_LATIN1(cp)
2562de8cc8edSafresh1        UV cp
2563de8cc8edSafresh1        CODE:
2564de8cc8edSafresh1                RETVAL= NATIVE_TO_LATIN1(cp);
2565de8cc8edSafresh1        OUTPUT:
2566de8cc8edSafresh1                RETVAL
2567de8cc8edSafresh1
2568f3efcd01Safresh1STRLEN
2569f3efcd01Safresh1av_tindex(av)
2570de8cc8edSafresh1        SV *av
2571f3efcd01Safresh1        CODE:
2572de8cc8edSafresh1                RETVAL = av_tindex((AV*)SvRV(av));
2573f3efcd01Safresh1        OUTPUT:
2574f3efcd01Safresh1                RETVAL
2575f3efcd01Safresh1
2576f3efcd01Safresh1STRLEN
2577f3efcd01Safresh1av_top_index(av)
2578de8cc8edSafresh1        SV *av
2579f3efcd01Safresh1        CODE:
2580de8cc8edSafresh1                RETVAL = av_top_index((AV*)SvRV(av));
2581f3efcd01Safresh1        OUTPUT:
2582f3efcd01Safresh1                RETVAL
2583f3efcd01Safresh1
25849a4edab6SbluhmSTRLEN
25859a4edab6Sbluhmav_count(av)
25869a4edab6Sbluhm        SV *av
25879a4edab6Sbluhm        CODE:
25889a4edab6Sbluhm                RETVAL = av_count((AV*)SvRV(av));
25899a4edab6Sbluhm        OUTPUT:
25909a4edab6Sbluhm                RETVAL
25919a4edab6Sbluhm
2592*3d61058aSafresh1STRLEN
2593*3d61058aSafresh1mark_size_ok()
2594*3d61058aSafresh1        CODE:
2595*3d61058aSafresh1                RETVAL = sizeof(*PL_markstack_ptr) == sizeof(Stack_off_t);
2596*3d61058aSafresh1        OUTPUT:
2597*3d61058aSafresh1                RETVAL
2598*3d61058aSafresh1
2599*3d61058aSafresh1UV
2600*3d61058aSafresh1mark_max()
2601*3d61058aSafresh1        CODE:
2602*3d61058aSafresh1                RETVAL = Stack_off_t_MAX;
2603*3d61058aSafresh1        OUTPUT:
2604*3d61058aSafresh1                RETVAL
2605*3d61058aSafresh1
2606*3d61058aSafresh1=tests plan => 26829
26075759b3d2Safresh1
26085759b3d2Safresh1use vars qw($my_sv @my_av %my_hv);
26095759b3d2Safresh1
2610de8cc8edSafresh1ok(&Devel::PPPort::boolSV(1), "Verify boolSV(1) is true");
2611de8cc8edSafresh1ok(!&Devel::PPPort::boolSV(0), "Verify boolSV(0) is false");
26125759b3d2Safresh1
26135759b3d2Safresh1$_ = "Fred";
2614de8cc8edSafresh1is(&Devel::PPPort::DEFSV(), "Fred", '$_ is FRED; Verify DEFSV is FRED');
2615de8cc8edSafresh1is(&Devel::PPPort::UNDERBAR(), "Fred", 'And verify UNDERBAR is FRED');
26165759b3d2Safresh1
2617de8cc8edSafresh1if (ivers($]) >= ivers(5.9.2) && ivers($]) < ivers(5.23)) {
26185759b3d2Safresh1  eval q{
26195759b3d2Safresh1    no warnings "deprecated";
2620de8cc8edSafresh1    no if $^V >= v5.17.9, warnings => "experimental::lexical_topic";
26215759b3d2Safresh1    my $_ = "Tony";
2622de8cc8edSafresh1    is(&Devel::PPPort::DEFSV(), "Fred", 'lexical_topic eval: $_ is Tony; Verify DEFSV is Fred');
2623de8cc8edSafresh1    is(&Devel::PPPort::UNDERBAR(), "Tony", 'And verify UNDERBAR is Tony');
26245759b3d2Safresh1  };
2625de8cc8edSafresh1  die __FILE__ . __LINE__ . ": $@" if $@;
26265759b3d2Safresh1}
26275759b3d2Safresh1else {
2628de8cc8edSafresh1  skip("perl version outside testing range of lexical_topic", 2);
26295759b3d2Safresh1}
26305759b3d2Safresh1
26315759b3d2Safresh1my @r = &Devel::PPPort::DEFSV_modify();
26325759b3d2Safresh1
2633de8cc8edSafresh1ok(@r == 3, "Verify got 3 elements");
2634de8cc8edSafresh1is($r[0], 'Fred');
2635de8cc8edSafresh1is($r[1], 'DEFSV');
2636de8cc8edSafresh1is($r[2], 'Fred');
26375759b3d2Safresh1
2638de8cc8edSafresh1is(&Devel::PPPort::DEFSV(), "Fred");
26395759b3d2Safresh1
26405759b3d2Safresh1eval { 1 };
2641de8cc8edSafresh1ok(!&Devel::PPPort::ERRSV(), "Verify ERRSV on true is false");
26425759b3d2Safresh1eval { cannot_call_this_one() };
2643de8cc8edSafresh1ok(&Devel::PPPort::ERRSV(), "Verify ERRSV on false is true");
26445759b3d2Safresh1
26455759b3d2Safresh1ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
26465759b3d2Safresh1ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
26475759b3d2Safresh1ok(&Devel::PPPort::gv_stashpvn('does::not::exist', 1));
26485759b3d2Safresh1
26495759b3d2Safresh1$my_sv = 1;
26505759b3d2Safresh1ok(&Devel::PPPort::get_sv('my_sv', 0));
26515759b3d2Safresh1ok(!&Devel::PPPort::get_sv('not_my_sv', 0));
26525759b3d2Safresh1ok(&Devel::PPPort::get_sv('not_my_sv', 1));
26535759b3d2Safresh1
26545759b3d2Safresh1@my_av = (1);
26555759b3d2Safresh1ok(&Devel::PPPort::get_av('my_av', 0));
26565759b3d2Safresh1ok(!&Devel::PPPort::get_av('not_my_av', 0));
26575759b3d2Safresh1ok(&Devel::PPPort::get_av('not_my_av', 1));
26585759b3d2Safresh1
26595759b3d2Safresh1%my_hv = (a=>1);
26605759b3d2Safresh1ok(&Devel::PPPort::get_hv('my_hv', 0));
26615759b3d2Safresh1ok(!&Devel::PPPort::get_hv('not_my_hv', 0));
26625759b3d2Safresh1ok(&Devel::PPPort::get_hv('not_my_hv', 1));
26635759b3d2Safresh1
26645759b3d2Safresh1sub my_cv { 1 };
26655759b3d2Safresh1ok(&Devel::PPPort::get_cv('my_cv', 0));
26665759b3d2Safresh1ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
26675759b3d2Safresh1ok(&Devel::PPPort::get_cv('not_my_cv', 1));
26685759b3d2Safresh1
2669de8cc8edSafresh1is(Devel::PPPort::dXSTARG(42), 43);
2670de8cc8edSafresh1is(Devel::PPPort::dAXMARK(4711), 4710);
26715759b3d2Safresh1
2672de8cc8edSafresh1is(Devel::PPPort::prepush(), 42);
26735759b3d2Safresh1
2674de8cc8edSafresh1is(join(':', Devel::PPPort::xsreturn(0)), 'test1');
2675de8cc8edSafresh1is(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
26765759b3d2Safresh1
2677de8cc8edSafresh1is(Devel::PPPort::PERL_ABS(42), 42, "Verify PERL_ABS(42) is 42");
2678de8cc8edSafresh1is(Devel::PPPort::PERL_ABS(-13), 13, "Verify PERL_ABS(-13) is 13");
26795759b3d2Safresh1
2680de8cc8edSafresh1is(Devel::PPPort::SVf(42), ivers($]) >= ivers(5.4) ? '[42]' : '42');
2681de8cc8edSafresh1is(Devel::PPPort::SVf('abc'), ivers($]) >= ivers(5.4) ? '[abc]' : 'abc');
26825759b3d2Safresh1
2683de8cc8edSafresh1is(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
26845759b3d2Safresh1
2685de8cc8edSafresh1is(&Devel::PPPort::ptrtests(), 63);
26865759b3d2Safresh1
2687de8cc8edSafresh1is(&Devel::PPPort::OpSIBLING_tests(), 0);
26885759b3d2Safresh1
2689de8cc8edSafresh1if (ivers($]) >= ivers(5.9)) {
26905759b3d2Safresh1  eval q{
2691de8cc8edSafresh1    is(&Devel::PPPort::check_HeUTF8("hello"), "norm");
2692de8cc8edSafresh1    is(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
26935759b3d2Safresh1  };
26945759b3d2Safresh1} else {
2695de8cc8edSafresh1  skip("Too early perl version", 2);
26965759b3d2Safresh1}
26975759b3d2Safresh1
26985759b3d2Safresh1@r = &Devel::PPPort::check_c_array();
2699de8cc8edSafresh1is($r[0], 4);
2700de8cc8edSafresh1is($r[1], "13");
27015759b3d2Safresh1
27025759b3d2Safresh1ok(!Devel::PPPort::SvRXOK(""));
27035759b3d2Safresh1ok(!Devel::PPPort::SvRXOK(bless [], "Regexp"));
27045759b3d2Safresh1
2705de8cc8edSafresh1if (ivers($]) < ivers(5.5)) {
2706de8cc8edSafresh1        skip 'no qr// objects in this perl', 2;
27075759b3d2Safresh1} else {
27085759b3d2Safresh1        my $qr = eval 'qr/./';
2709de8cc8edSafresh1        ok(Devel::PPPort::SvRXOK($qr), "SVRXOK(qr) is true");
27105759b3d2Safresh1        ok(Devel::PPPort::SvRXOK(bless $qr, "Surprise"));
27115759b3d2Safresh1}
2712f3efcd01Safresh1
2713de8cc8edSafresh1ok( Devel::PPPort::NATIVE_TO_LATIN1(0xB6) == 0xB6);
2714de8cc8edSafresh1ok( Devel::PPPort::NATIVE_TO_LATIN1(0x1) == 0x1);
2715de8cc8edSafresh1ok( Devel::PPPort::NATIVE_TO_LATIN1(ord("A")) == 0x41);
2716de8cc8edSafresh1ok( Devel::PPPort::NATIVE_TO_LATIN1(ord("0")) == 0x30);
2717f3efcd01Safresh1
2718de8cc8edSafresh1ok( Devel::PPPort::LATIN1_TO_NATIVE(0xB6) == 0xB6, "Verify LATIN1_TO_NATIVE(0xB6) is 0xB6");
2719de8cc8edSafresh1if (ord("A") == 65) {
2720de8cc8edSafresh1    ok( Devel::PPPort::LATIN1_TO_NATIVE(0x41) == 0x41);
2721de8cc8edSafresh1    ok( Devel::PPPort::LATIN1_TO_NATIVE(0x30) == 0x30);
2722de8cc8edSafresh1}
2723de8cc8edSafresh1else {
2724de8cc8edSafresh1    ok( Devel::PPPort::LATIN1_TO_NATIVE(0x41) == 0xC1);
2725de8cc8edSafresh1    ok( Devel::PPPort::LATIN1_TO_NATIVE(0x30) == 0xF0);
2726de8cc8edSafresh1}
2727f3efcd01Safresh1
2728de8cc8edSafresh1ok(  Devel::PPPort::isALNUMC_L1(ord("5")));
2729de8cc8edSafresh1ok(  Devel::PPPort::isALNUMC_L1(0xFC));
2730de8cc8edSafresh1ok(! Devel::PPPort::isALNUMC_L1(0xB6));
2731f3efcd01Safresh1
2732de8cc8edSafresh1ok(  Devel::PPPort::isOCTAL(ord("7")), "Verify '7' is OCTAL");
2733de8cc8edSafresh1ok(! Devel::PPPort::isOCTAL(ord("8")), "Verify '8' isn't OCTAL");
2734f3efcd01Safresh1
2735de8cc8edSafresh1ok(  Devel::PPPort::isOCTAL_A(ord("0")), "Verify '0' is OCTAL_A");
2736de8cc8edSafresh1ok(! Devel::PPPort::isOCTAL_A(ord("9")), "Verify '9' isn't OCTAL_A");
2737f3efcd01Safresh1
2738de8cc8edSafresh1ok(  Devel::PPPort::isOCTAL_L1(ord("2")), "Verify '2' is OCTAL_L1");
2739de8cc8edSafresh1ok(! Devel::PPPort::isOCTAL_L1(ord("8")), "Verify '8' isn't OCTAL_L1");
2740f3efcd01Safresh1
2741de8cc8edSafresh1my $way_too_early_msg = 'UTF-8 not implemented on this perl';
2742f3efcd01Safresh1
2743de8cc8edSafresh1# For the other properties, we test every code point from 0.255, and a
2744de8cc8edSafresh1# smattering of higher ones.  First populate a hash with keys like '65:ALPHA'
2745de8cc8edSafresh1# to indicate that the code point there is alphabetic
2746de8cc8edSafresh1my $i;
2747de8cc8edSafresh1my %types;
2748de8cc8edSafresh1for $i (0x41..0x5A, 0x61..0x7A, 0xAA, 0xB5, 0xBA, 0xC0..0xD6, 0xD8..0xF6,
2749de8cc8edSafresh1        0xF8..0x101)
2750de8cc8edSafresh1{
2751de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2752de8cc8edSafresh1    $types{"$native:ALPHA"} = 1;
2753de8cc8edSafresh1    $types{"$native:ALPHANUMERIC"} = 1;
2754de8cc8edSafresh1    $types{"$native:IDFIRST"} = 1;
2755de8cc8edSafresh1    $types{"$native:IDCONT"} = 1;
2756de8cc8edSafresh1    $types{"$native:PRINT"} = 1;
2757de8cc8edSafresh1    $types{"$native:WORDCHAR"} = 1;
2758de8cc8edSafresh1}
2759de8cc8edSafresh1for $i (0x30..0x39, 0x660, 0xFF19) {
2760de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2761de8cc8edSafresh1    $types{"$native:ALPHANUMERIC"} = 1;
2762de8cc8edSafresh1    $types{"$native:DIGIT"} = 1;
2763de8cc8edSafresh1    $types{"$native:IDCONT"} = 1;
2764de8cc8edSafresh1    $types{"$native:WORDCHAR"} = 1;
2765de8cc8edSafresh1    $types{"$native:GRAPH"} = 1;
2766de8cc8edSafresh1    $types{"$native:PRINT"} = 1;
2767de8cc8edSafresh1    $types{"$native:XDIGIT"} = 1 if $i < 255 || ($i >= 0xFF10 && $i <= 0xFF19);
2768de8cc8edSafresh1}
2769f3efcd01Safresh1
2770de8cc8edSafresh1for $i (0..0x7F) {
2771de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2772de8cc8edSafresh1    $types{"$native:ASCII"} = 1;
2773de8cc8edSafresh1}
2774de8cc8edSafresh1for $i (0..0x1f, 0x7F..0x9F) {
2775de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2776de8cc8edSafresh1    $types{"$native:CNTRL"} = 1;
2777de8cc8edSafresh1}
2778de8cc8edSafresh1for $i (0x21..0x7E, 0xA1..0x101, 0x660) {
2779de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2780de8cc8edSafresh1    $types{"$native:GRAPH"} = 1;
2781de8cc8edSafresh1    $types{"$native:PRINT"} = 1;
2782de8cc8edSafresh1}
2783de8cc8edSafresh1for $i (0x09, 0x20, 0xA0) {
2784de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2785de8cc8edSafresh1    $types{"$native:BLANK"} = 1;
2786de8cc8edSafresh1    $types{"$native:SPACE"} = 1;
2787de8cc8edSafresh1    $types{"$native:PSXSPC"} = 1;
2788de8cc8edSafresh1    $types{"$native:PRINT"} = 1 if $i > 0x09;
2789de8cc8edSafresh1}
2790de8cc8edSafresh1for $i (0x09..0x0D, 0x85, 0x2029) {
2791de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2792de8cc8edSafresh1    $types{"$native:SPACE"} = 1;
2793de8cc8edSafresh1    $types{"$native:PSXSPC"} = 1;
2794de8cc8edSafresh1}
2795de8cc8edSafresh1for $i (0x41..0x5A, 0xC0..0xD6, 0xD8..0xDE, 0x100) {
2796de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2797de8cc8edSafresh1    $types{"$native:UPPER"} = 1;
2798de8cc8edSafresh1    $types{"$native:XDIGIT"} = 1 if $i < 0x47;
2799de8cc8edSafresh1}
2800de8cc8edSafresh1for $i (0x61..0x7A, 0xAA, 0xB5, 0xBA, 0xDF..0xF6, 0xF8..0xFF, 0x101) {
2801de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2802de8cc8edSafresh1    $types{"$native:LOWER"} = 1;
2803de8cc8edSafresh1    $types{"$native:XDIGIT"} = 1 if $i < 0x67;
2804de8cc8edSafresh1}
2805de8cc8edSafresh1for $i (0x21..0x2F, 0x3A..0x40, 0x5B..0x60, 0x7B..0x7E, 0xB6, 0xA1, 0xA7, 0xAB,
2806de8cc8edSafresh1        0xB7, 0xBB, 0xBF, 0x5BE)
2807de8cc8edSafresh1{
2808de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2809de8cc8edSafresh1    $types{"$native:PUNCT"} = 1;
2810de8cc8edSafresh1    $types{"$native:GRAPH"} = 1;
2811de8cc8edSafresh1    $types{"$native:PRINT"} = 1;
2812de8cc8edSafresh1}
2813f3efcd01Safresh1
2814de8cc8edSafresh1$i = ord('_');
2815de8cc8edSafresh1$types{"$i:WORDCHAR"} = 1;
2816de8cc8edSafresh1$types{"$i:IDFIRST"} = 1;
2817de8cc8edSafresh1$types{"$i:IDCONT"} = 1;
2818f3efcd01Safresh1
2819de8cc8edSafresh1# Now find all the unique code points included above.
2820de8cc8edSafresh1my %code_points_to_test;
2821de8cc8edSafresh1my $key;
2822de8cc8edSafresh1for $key (keys %types) {
2823de8cc8edSafresh1    $key =~ s/:.*//;
2824de8cc8edSafresh1    $code_points_to_test{$key} = 1;
2825de8cc8edSafresh1}
2826f3efcd01Safresh1
2827de8cc8edSafresh1# And test each one
2828de8cc8edSafresh1for $i (sort { $a <=> $b } keys %code_points_to_test) {
2829de8cc8edSafresh1    my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
2830de8cc8edSafresh1    my $hex = sprintf("0x%02X", $native);
2831f3efcd01Safresh1
2832de8cc8edSafresh1    # And for each code point test each of the classes
2833de8cc8edSafresh1    my $class;
2834de8cc8edSafresh1    for $class (qw(ALPHA ALPHANUMERIC ASCII BLANK CNTRL DIGIT GRAPH IDCONT
2835de8cc8edSafresh1                   IDFIRST LOWER PRINT PSXSPC PUNCT SPACE UPPER WORDCHAR
2836de8cc8edSafresh1                   XDIGIT))
2837de8cc8edSafresh1    {
2838de8cc8edSafresh1        if ($i < 256) {  # For the ones that can fit in a byte, test each of
2839de8cc8edSafresh1                         # three macros.
2840de8cc8edSafresh1            my $suffix;
2841de8cc8edSafresh1            for $suffix ("", "_A", "_L1", "_uvchr") {
2842de8cc8edSafresh1                my $should_be = ($i > 0x7F && $suffix !~ /_(uvchr|L1)/)
2843de8cc8edSafresh1                                ? 0     # Fail on non-ASCII unless unicode
2844de8cc8edSafresh1                                : ($types{"$native:$class"} || 0);
2845de8cc8edSafresh1                if (ivers($]) < ivers(5.6) && $suffix eq '_uvchr') {
2846de8cc8edSafresh1                    skip("No UTF-8 on this perl", 1);
2847de8cc8edSafresh1                    next;
2848de8cc8edSafresh1                }
2849f3efcd01Safresh1
2850de8cc8edSafresh1                my $eval_string = "Devel::PPPort::is${class}$suffix($hex)";
2851de8cc8edSafresh1                local $SIG{__WARN__} = sub {};
2852de8cc8edSafresh1                my $is = eval $eval_string || 0;
2853de8cc8edSafresh1                die "eval 'For $i: $eval_string' gave $@" if $@;
2854de8cc8edSafresh1                is($is, $should_be, "'$eval_string'");
2855de8cc8edSafresh1            }
2856de8cc8edSafresh1        }
2857f3efcd01Safresh1
2858de8cc8edSafresh1        # For all code points, test the '_utf8' macros
2859de8cc8edSafresh1        my $sub_fcn;
2860de8cc8edSafresh1        for $sub_fcn ("", "_LC") {
2861de8cc8edSafresh1            my $skip = "";
2862de8cc8edSafresh1            if (ivers($]) < ivers(5.6)) {
2863de8cc8edSafresh1                $skip = $way_too_early_msg;
2864de8cc8edSafresh1            }
2865de8cc8edSafresh1            elsif (ivers($]) < ivers(5.7) && $native > 255) {
2866de8cc8edSafresh1                $skip = "Perls earlier than 5.7 give wrong answers for above Latin1 code points";
2867de8cc8edSafresh1            }
2868de8cc8edSafresh1            elsif (ivers($]) <= ivers(5.11.3) && $native == 0x2029 && ($class eq 'PRINT' || $class eq 'GRAPH')) {
2869de8cc8edSafresh1                $skip = "Perls earlier than 5.11.3 considered high space characters as isPRINT and isGRAPH";
2870de8cc8edSafresh1            }
2871de8cc8edSafresh1            elsif ($sub_fcn eq '_LC' && $i < 256) {
2872de8cc8edSafresh1                $skip = "Testing of code points whose results depend on locale is skipped ";
2873de8cc8edSafresh1            }
2874de8cc8edSafresh1            my $fcn = "Devel::PPPort::is${class}${sub_fcn}_utf8_safe";
2875de8cc8edSafresh1            my $utf8;
2876f3efcd01Safresh1
2877de8cc8edSafresh1            if ($skip) {
2878de8cc8edSafresh1                skip $skip, 1;
2879de8cc8edSafresh1            }
2880de8cc8edSafresh1            else {
2881de8cc8edSafresh1                $utf8 = quotemeta Devel::PPPort::uvchr_to_utf8($native);
2882de8cc8edSafresh1                my $should_be = $types{"$native:$class"} || 0;
2883de8cc8edSafresh1                my $eval_string = "$fcn(\"$utf8\", 0)";
2884de8cc8edSafresh1                local $SIG{__WARN__} = sub {};
2885de8cc8edSafresh1                my $is = eval $eval_string || 0;
2886de8cc8edSafresh1                die "eval 'For $i, $eval_string' gave $@" if $@;
2887de8cc8edSafresh1                is($is, $should_be, sprintf("For U+%04X '%s'", $native, $eval_string));
2888de8cc8edSafresh1            }
2889f3efcd01Safresh1
2890de8cc8edSafresh1            # And for the high code points, test that a too short malformation (the
2891de8cc8edSafresh1            # -1) causes it to fail
2892de8cc8edSafresh1            if ($i > 255) {
2893de8cc8edSafresh1                if ($skip) {
2894de8cc8edSafresh1                    skip $skip, 1;
2895de8cc8edSafresh1                }
2896de8cc8edSafresh1                elsif (ivers($]) >= ivers(5.25.9)) {
2897de8cc8edSafresh1                    skip("Prints an annoying error message that khw doesn't know how to easily suppress", 1);
2898de8cc8edSafresh1                }
2899de8cc8edSafresh1                else {
2900de8cc8edSafresh1                    my $eval_string = "$fcn(\"$utf8\", -1)";
2901de8cc8edSafresh1                    local $SIG{__WARN__} = sub {};
2902de8cc8edSafresh1                    my $is = eval "$eval_string" || 0;
2903de8cc8edSafresh1                    die "eval '$eval_string' gave $@" if $@;
2904de8cc8edSafresh1                    is($is, 0, sprintf("For U+%04X '%s'", $native, $eval_string));
2905de8cc8edSafresh1                }
2906de8cc8edSafresh1            }
2907de8cc8edSafresh1        }
2908de8cc8edSafresh1    }
2909de8cc8edSafresh1}
2910f3efcd01Safresh1
2911de8cc8edSafresh1my %case_changing = ( 'LOWER' => [ [ ord('A'), ord('a') ],
2912de8cc8edSafresh1                                   [ Devel::PPPort::LATIN1_TO_NATIVE(0xC0),
2913de8cc8edSafresh1                                     Devel::PPPort::LATIN1_TO_NATIVE(0xE0) ],
2914de8cc8edSafresh1                                   [ 0x100, 0x101 ],
2915de8cc8edSafresh1                                 ],
2916de8cc8edSafresh1                      'FOLD'  => [ [ ord('C'), ord('c') ],
2917de8cc8edSafresh1                                   [ Devel::PPPort::LATIN1_TO_NATIVE(0xC0),
2918de8cc8edSafresh1                                     Devel::PPPort::LATIN1_TO_NATIVE(0xE0) ],
2919de8cc8edSafresh1                                   [ 0x104, 0x105 ],
2920de8cc8edSafresh1                                   [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
2921de8cc8edSafresh1                                     'ss' ],
2922de8cc8edSafresh1                                 ],
2923de8cc8edSafresh1                      'UPPER' => [ [ ord('a'), ord('A'),  ],
2924de8cc8edSafresh1                                   [ Devel::PPPort::LATIN1_TO_NATIVE(0xE0),
2925de8cc8edSafresh1                                     Devel::PPPort::LATIN1_TO_NATIVE(0xC0) ],
2926de8cc8edSafresh1                                   [ 0x101, 0x100 ],
2927de8cc8edSafresh1                                   [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
2928de8cc8edSafresh1                                     'SS' ],
2929de8cc8edSafresh1                                 ],
2930de8cc8edSafresh1                      'TITLE' => [ [ ord('c'), ord('C'),  ],
2931de8cc8edSafresh1                                   [ Devel::PPPort::LATIN1_TO_NATIVE(0xE2),
2932de8cc8edSafresh1                                     Devel::PPPort::LATIN1_TO_NATIVE(0xC2) ],
2933de8cc8edSafresh1                                   [ 0x103, 0x102 ],
2934de8cc8edSafresh1                                   [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
2935de8cc8edSafresh1                                     'Ss' ],
2936de8cc8edSafresh1                                 ],
2937de8cc8edSafresh1                    );
2938f3efcd01Safresh1
2939de8cc8edSafresh1my $name;
2940de8cc8edSafresh1for $name (keys %case_changing) {
2941de8cc8edSafresh1    my @code_points_to_test = @{$case_changing{$name}};
2942de8cc8edSafresh1    my $unchanged;
2943de8cc8edSafresh1    for $unchanged (@code_points_to_test) {
2944de8cc8edSafresh1        my @pair = @$unchanged;
2945de8cc8edSafresh1        my $original = $pair[0];
2946de8cc8edSafresh1        my $changed = $pair[1];
2947de8cc8edSafresh1        my $utf8_changed = $changed;
2948de8cc8edSafresh1        my $is_cp = $utf8_changed =~ /^\d+$/;
2949de8cc8edSafresh1        my $should_be_bytes;
2950de8cc8edSafresh1        if (ivers($]) >= ivers(5.6)) {
2951de8cc8edSafresh1            if ($is_cp) {
2952de8cc8edSafresh1                $utf8_changed = Devel::PPPort::uvchr_to_utf8($changed);
2953de8cc8edSafresh1                $should_be_bytes = Devel::PPPort::UTF8_SAFE_SKIP($utf8_changed, 0);
2954de8cc8edSafresh1            }
2955de8cc8edSafresh1            else {
2956de8cc8edSafresh1                die("Test currently doesn't work for non-ASCII multi-char case changes") if eval '$utf8_changed =~ /[[:^ascii:]]/';
2957de8cc8edSafresh1                $should_be_bytes = length $utf8_changed;
2958de8cc8edSafresh1            }
2959de8cc8edSafresh1        }
2960f3efcd01Safresh1
2961de8cc8edSafresh1        my $fcn = "to${name}_uvchr";
2962de8cc8edSafresh1        my $skip = "";
2963f3efcd01Safresh1
2964de8cc8edSafresh1        if (ivers($]) < ivers(5.6)) {
2965de8cc8edSafresh1            $skip = $way_too_early_msg;
2966de8cc8edSafresh1        }
2967de8cc8edSafresh1        elsif (! $is_cp) {
2968de8cc8edSafresh1            $skip = "Can't do uvchr on a multi-char string";
2969de8cc8edSafresh1        }
2970de8cc8edSafresh1        if ($skip) {
2971de8cc8edSafresh1            skip $skip, 4;
2972de8cc8edSafresh1        }
2973de8cc8edSafresh1        else {
2974de8cc8edSafresh1            if ($is_cp) {
2975de8cc8edSafresh1                $utf8_changed = Devel::PPPort::uvchr_to_utf8($changed);
2976de8cc8edSafresh1                $should_be_bytes = Devel::PPPort::UTF8_SAFE_SKIP($utf8_changed, 0);
2977de8cc8edSafresh1            }
2978de8cc8edSafresh1            else {
2979de8cc8edSafresh1                my $non_ascii_re = (ivers($]) >= ivers(5.6)) ? '[[:^ascii:]]' : '[^\x00-\x7F]';
2980de8cc8edSafresh1                die("Test currently doesn't work for non-ASCII multi-char case changes") if eval '$utf8_changed =~ /$non_ascii_re/';
2981de8cc8edSafresh1                $should_be_bytes = length $utf8_changed;
2982de8cc8edSafresh1            }
2983f3efcd01Safresh1
2984de8cc8edSafresh1            my $ret = eval "Devel::PPPort::$fcn($original)";
2985de8cc8edSafresh1            my $fail = $@;  # Have to save $@, as it gets destroyed
2986de8cc8edSafresh1            is ($fail, "", "$fcn($original) didn't fail");
2987de8cc8edSafresh1            my $first = (ivers($]) != ivers(5.6))
2988de8cc8edSafresh1                        ? substr($utf8_changed, 0, 1)
2989de8cc8edSafresh1                        : $utf8_changed, 0, 1;
2990de8cc8edSafresh1            is($ret->[0], ord $first,
2991de8cc8edSafresh1               "ord of $fcn($original) is $changed");
2992de8cc8edSafresh1            is($ret->[1], $utf8_changed,
2993de8cc8edSafresh1               "UTF-8 of of $fcn($original) is correct");
2994de8cc8edSafresh1            is($ret->[2], $should_be_bytes,
2995de8cc8edSafresh1               "Length of $fcn($original) is $should_be_bytes");
2996de8cc8edSafresh1        }
2997f3efcd01Safresh1
2998de8cc8edSafresh1        my $truncate;
2999de8cc8edSafresh1        for $truncate (0..2) {
3000de8cc8edSafresh1            my $skip;
3001de8cc8edSafresh1            if (ivers($]) < ivers(5.6)) {
3002de8cc8edSafresh1                $skip = $way_too_early_msg;
3003de8cc8edSafresh1            }
3004de8cc8edSafresh1            elsif (! $is_cp && ivers($]) < ivers(5.7.3)) {
3005de8cc8edSafresh1                $skip = "Multi-character case change not implemented until 5.7.3";
3006de8cc8edSafresh1            }
3007de8cc8edSafresh1            elsif ($truncate == 2 && ivers($]) > ivers(5.25.8)) {
3008de8cc8edSafresh1                $skip = "Zero length inputs cause assertion failure; test dies in modern perls";
3009de8cc8edSafresh1            }
3010de8cc8edSafresh1            elsif ($truncate > 0 && length $changed > 1) {
3011de8cc8edSafresh1                $skip = "Don't test shortened multi-char case changes";
3012de8cc8edSafresh1            }
3013de8cc8edSafresh1            elsif ($truncate > 0 && Devel::PPPort::UVCHR_IS_INVARIANT($original)) {
3014de8cc8edSafresh1                $skip = "Don't try to test shortened single bytes";
3015de8cc8edSafresh1            }
3016de8cc8edSafresh1            if ($skip) {
3017de8cc8edSafresh1                skip $skip, 4;
3018de8cc8edSafresh1            }
3019de8cc8edSafresh1            else {
3020de8cc8edSafresh1                my $fcn = "to${name}_utf8_safe";
3021de8cc8edSafresh1                my $utf8 = quotemeta Devel::PPPort::uvchr_to_utf8($original);
3022de8cc8edSafresh1                my $real_truncate = ($truncate < 2)
3023de8cc8edSafresh1                                    ? $truncate : $should_be_bytes;
3024de8cc8edSafresh1                my $eval_string = "Devel::PPPort::$fcn(\"$utf8\", $real_truncate)";
3025de8cc8edSafresh1                my $ret = eval "no warnings; $eval_string" || 0;
3026de8cc8edSafresh1                my $fail = $@;  # Have to save $@, as it gets destroyed
3027de8cc8edSafresh1                if ($truncate == 0) {
3028de8cc8edSafresh1                    is ($fail, "", "Didn't fail on full length input");
3029de8cc8edSafresh1                    my $first = (ivers($]) != ivers(5.6))
3030de8cc8edSafresh1                                ? substr($utf8_changed, 0, 1)
3031de8cc8edSafresh1                                : $utf8_changed, 0, 1;
3032de8cc8edSafresh1                    is($ret->[0], ord $first,
3033de8cc8edSafresh1                       "ord of $fcn($original) is $changed");
3034de8cc8edSafresh1                    is($ret->[1], $utf8_changed,
3035de8cc8edSafresh1                       "UTF-8 of of $fcn($original) is correct");
3036de8cc8edSafresh1                    is($ret->[2], $should_be_bytes,
3037de8cc8edSafresh1                    "Length of $fcn($original) is $should_be_bytes");
3038de8cc8edSafresh1                }
3039de8cc8edSafresh1                else {
3040de8cc8edSafresh1                    is ($fail, eval 'qr/Malformed UTF-8 character/',
3041de8cc8edSafresh1                        "Gave appropriate error for short char: $original");
3042de8cc8edSafresh1                    skip("Expected failure means remaining tests for"
3043de8cc8edSafresh1                       . " this aren't relevant", 3);
3044de8cc8edSafresh1                }
3045de8cc8edSafresh1            }
3046de8cc8edSafresh1        }
3047de8cc8edSafresh1    }
3048de8cc8edSafresh1}
3049f3efcd01Safresh1
3050de8cc8edSafresh1is(&Devel::PPPort::av_top_index([1,2,3]), 2);
3051de8cc8edSafresh1is(&Devel::PPPort::av_tindex([1,2,3,4]), 3);
30529a4edab6Sbluhmis(&Devel::PPPort::av_count([1,2,3,4]), 4);
3053*3d61058aSafresh1
3054*3d61058aSafresh1ok(&Devel::PPPort::mark_size_ok(), "check mark type size");
3055*3d61058aSafresh1ok(&Devel::PPPort::mark_max(), "got a mark max");
3056