This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Devel-PPPort to CPAN version 3.27
[perl5.git] / cpan / Devel-PPPort / parts / inc / misc
index a9093d2..c39acd0 100644 (file)
@@ -1,12 +1,6 @@
 ################################################################################
 ##
-##  $Revision: 56 $
-##  $Author: mhx $
-##  $Date: 2011/09/10 20:38:10 +0200 $
-##
-################################################################################
-##
-##  Version 3.x, Copyright (C) 2004-2010, Marcus Holland-Moritz.
+##  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
 ##  Version 2.x, Copyright (C) 2001, Paul Marquess.
 ##  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
 ##
@@ -41,7 +35,9 @@ EXTERN_C
 STMT_START
 STMT_END
 UTF8_MAXBYTES
+WIDEST_UTYPE
 XSRETURN
+HeUTF8
 
 =implementation
 
@@ -146,22 +142,22 @@ __UNDEFINED__  PTR2NV(p)       NUM2PTR(NV,p)
 #undef STMT_START
 #undef STMT_END
 #ifdef PERL_USE_GCC_BRACE_GROUPS
-#  define STMT_START   (void)( /* gcc supports ``({ STATEMENTS; })'' */
-#  define STMT_END     )
+#  define STMT_START    (void)( /* gcc supports ``({ STATEMENTS; })'' */
+#  define STMT_END      )
 #else
 #  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
-#    define STMT_START if (1)
-#    define STMT_END   else (void)0
+#    define STMT_START  if (1)
+#    define STMT_END    else (void)0
 #  else
-#    define STMT_START do
-#    define STMT_END   while (0)
+#    define STMT_START  do
+#    define STMT_END    while (0)
 #  endif
 #endif
 
 __UNDEFINED__  boolSV(b)    ((b) ? &PL_sv_yes : &PL_sv_no)
 
 /* DEFSV appears first in 5.004_56 */
-__UNDEFINED__  DEFSV       GvSV(PL_defgv)
+__UNDEFINED__  DEFSV        GvSV(PL_defgv)
 __UNDEFINED__  SAVE_DEFSV   SAVESPTR(GvSV(PL_defgv))
 __UNDEFINED__  DEFSV_set(sv) (DEFSV = (sv))
 
@@ -223,13 +219,13 @@ __UNDEFINED__  UTF8_MAXBYTES   UTF8_MAXLEN
 __UNDEFINED__  CPERLscope(x)   x
 
 __UNDEFINED__  PERL_HASH(hash,str,len) \
-     STMT_START        { \
-       const char *s_PeRlHaSh = str; \
-       I32 i_PeRlHaSh = len; \
-       U32 hash_PeRlHaSh = 0; \
-       while (i_PeRlHaSh--) \
-           hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
-       (hash) = hash_PeRlHaSh; \
+     STMT_START { \
+        const char *s_PeRlHaSh = str; \
+        I32 i_PeRlHaSh = len; \
+        U32 hash_PeRlHaSh = 0; \
+        while (i_PeRlHaSh--) \
+            hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
+        (hash) = hash_PeRlHaSh; \
     } STMT_END
 
 #ifndef PERLIO_FUNCS_DECL
@@ -255,16 +251,16 @@ typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
 
 #endif
 
-__UNDEFINED__ isPSXSPC(c)      (isSPACE(c) || (c) == '\v')
-__UNDEFINED__ isBLANK(c)       ((c) == ' ' || (c) == '\t')
+__UNDEFINED__ isPSXSPC(c)       (isSPACE(c) || (c) == '\v')
+__UNDEFINED__ isBLANK(c)        ((c) == ' ' || (c) == '\t')
 #ifdef EBCDIC
-__UNDEFINED__ isALNUMC(c)      isalnum(c)
-__UNDEFINED__ isASCII(c)       isascii(c)
-__UNDEFINED__ isCNTRL(c)       iscntrl(c)
-__UNDEFINED__ isGRAPH(c)       isgraph(c)
-__UNDEFINED__ isPRINT(c)       isprint(c)
-__UNDEFINED__ isPUNCT(c)       ispunct(c)
-__UNDEFINED__ isXDIGIT(c)      isxdigit(c)
+__UNDEFINED__ isALNUMC(c)       isalnum(c)
+__UNDEFINED__ isASCII(c)        isascii(c)
+__UNDEFINED__ isCNTRL(c)        iscntrl(c)
+__UNDEFINED__ isGRAPH(c)        isgraph(c)
+__UNDEFINED__ isPRINT(c)        isprint(c)
+__UNDEFINED__ isPUNCT(c)        ispunct(c)
+__UNDEFINED__ isXDIGIT(c)       isxdigit(c)
 #else
 # if { VERSION < 5.10.0 }
 /* Hint: isPRINT
@@ -274,13 +270,33 @@ __UNDEFINED__ isXDIGIT(c) isxdigit(c)
  */
 #  undef isPRINT
 # endif
-__UNDEFINED__ isALNUMC(c)      (isALPHA(c) || isDIGIT(c))
-__UNDEFINED__ isASCII(c)       ((U8) (c) <= 127)
-__UNDEFINED__ isCNTRL(c)       ((U8) (c) < ' ' || (c) == 127)
-__UNDEFINED__ isGRAPH(c)       (isALNUM(c) || isPUNCT(c))
-__UNDEFINED__ isPRINT(c)       (((c) >= 32 && (c) < 127))
-__UNDEFINED__ isPUNCT(c)       (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64)  || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
-__UNDEFINED__ isXDIGIT(c)      (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+
+#ifdef HAS_QUAD
+# ifdef U64TYPE
+#  define WIDEST_UTYPE U64TYPE
+# else
+#  define WIDEST_UTYPE Quad_t
+# endif
+#else
+# define WIDEST_UTYPE U32
+#endif
+
+__UNDEFINED__ isALNUMC(c)       (isALPHA(c) || isDIGIT(c))
+__UNDEFINED__ isASCII(c)        ((WIDEST_UTYPE) (c) <= 127)
+__UNDEFINED__ isCNTRL(c)        ((WIDEST_UTYPE) (c) < ' ' || (c) == 127)
+__UNDEFINED__ isGRAPH(c)        (isALNUM(c) || isPUNCT(c))
+__UNDEFINED__ isPRINT(c)        (((c) >= 32 && (c) < 127))
+__UNDEFINED__ isPUNCT(c)        (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64)  || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+__UNDEFINED__ isXDIGIT(c)       (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+/* Until we figure out how to support this in older perls... */
+#if { VERSION >= 5.8.0 }
+
+__UNDEFINED__ HeUTF8(he)        ((HeKLEN(he) == HEf_SVKEY) ?            \
+                                 SvUTF8(HeKEY_sv(he)) :                 \
+                                 (U32)HeKUTF8(he))
+
 #endif
 
 =xsmisc
@@ -294,6 +310,8 @@ XS(XS_Devel__PPPort_dXSTARG)
   dXSARGS;
   dXSTARG;
   IV iv;
+
+  PERL_UNUSED_VAR(cv);
   SP -= items;
   iv = SvIV(ST(0)) + 1;
   PUSHi(iv);
@@ -307,6 +325,8 @@ XS(XS_Devel__PPPort_dAXMARK)
   dAXMARK;
   dITEMS;
   IV iv;
+
+  PERL_UNUSED_VAR(cv);
   SP -= items;
   iv = SvIV(ST(0)) - 1;
   mPUSHi(iv);
@@ -325,165 +345,189 @@ newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
 
 int
 ptrtests()
-       PREINIT:
-               int var, *p = &var;
+        PREINIT:
+                int var, *p = &var;
 
-       CODE:
-               RETVAL = 0;
-               RETVAL += PTR2nat(p) != 0       ?  1 : 0;
-               RETVAL += PTR2ul(p) != 0UL      ?  2 : 0;
-               RETVAL += PTR2UV(p) != (UV) 0   ?  4 : 0;
-               RETVAL += PTR2IV(p) != (IV) 0   ?  8 : 0;
-               RETVAL += PTR2NV(p) != (NV) 0   ? 16 : 0;
-               RETVAL += p > NUM2PTR(int *, 0) ? 32 : 0;
+        CODE:
+                RETVAL = 0;
+                RETVAL += PTR2nat(p) != 0       ?  1 : 0;
+                RETVAL += PTR2ul(p) != 0UL      ?  2 : 0;
+                RETVAL += PTR2UV(p) != (UV) 0   ?  4 : 0;
+                RETVAL += PTR2IV(p) != (IV) 0   ?  8 : 0;
+                RETVAL += PTR2NV(p) != (NV) 0   ? 16 : 0;
+                RETVAL += p > NUM2PTR(int *, 0) ? 32 : 0;
 
-       OUTPUT:
-               RETVAL
+        OUTPUT:
+                RETVAL
 
 int
 gv_stashpvn(name, create)
-       char *name
-       I32 create
-       CODE:
-               RETVAL = gv_stashpvn(name, strlen(name), create) != NULL;
-       OUTPUT:
-               RETVAL
+        char *name
+        I32 create
+        CODE:
+                RETVAL = gv_stashpvn(name, strlen(name), create) != NULL;
+        OUTPUT:
+                RETVAL
 
 int
 get_sv(name, create)
-       char *name
-       I32 create
-       CODE:
-               RETVAL = get_sv(name, create) != NULL;
-       OUTPUT:
-               RETVAL
+        char *name
+        I32 create
+        CODE:
+                RETVAL = get_sv(name, create) != NULL;
+        OUTPUT:
+                RETVAL
 
 int
 get_av(name, create)
-       char *name
-       I32 create
-       CODE:
-               RETVAL = get_av(name, create) != NULL;
-       OUTPUT:
-               RETVAL
+        char *name
+        I32 create
+        CODE:
+                RETVAL = get_av(name, create) != NULL;
+        OUTPUT:
+                RETVAL
 
 int
 get_hv(name, create)
-       char *name
-       I32 create
-       CODE:
-               RETVAL = get_hv(name, create) != NULL;
-       OUTPUT:
-               RETVAL
+        char *name
+        I32 create
+        CODE:
+                RETVAL = get_hv(name, create) != NULL;
+        OUTPUT:
+                RETVAL
 
 int
 get_cv(name, create)
-       char *name
-       I32 create
-       CODE:
-               RETVAL = get_cv(name, create) != NULL;
-       OUTPUT:
-               RETVAL
+        char *name
+        I32 create
+        CODE:
+                RETVAL = get_cv(name, create) != NULL;
+        OUTPUT:
+                RETVAL
 
 void
 xsreturn(two)
-       int two
-       PPCODE:
-               mXPUSHp("test1", 5);
-               if (two)
-                 mXPUSHp("test2", 5);
-               if (two)
-                 XSRETURN(2);
-               else
-                 XSRETURN(1);
+        int two
+        PPCODE:
+                mXPUSHp("test1", 5);
+                if (two)
+                  mXPUSHp("test2", 5);
+                if (two)
+                  XSRETURN(2);
+                else
+                  XSRETURN(1);
 
 SV*
 boolSV(value)
-       int value
-       CODE:
-               RETVAL = newSVsv(boolSV(value));
-       OUTPUT:
-               RETVAL
+        int value
+        CODE:
+                RETVAL = newSVsv(boolSV(value));
+        OUTPUT:
+                RETVAL
 
 SV*
 DEFSV()
-       CODE:
-               RETVAL = newSVsv(DEFSV);
-       OUTPUT:
-               RETVAL
+        CODE:
+                RETVAL = newSVsv(DEFSV);
+        OUTPUT:
+                RETVAL
 
 void
 DEFSV_modify()
-       PPCODE:
-               XPUSHs(sv_mortalcopy(DEFSV));
-               ENTER;
-               SAVE_DEFSV;
-               DEFSV_set(newSVpvs("DEFSV"));
-               XPUSHs(sv_mortalcopy(DEFSV));
-               /* Yes, this leaks the above scalar; 5.005 with threads for some reason */
-               /* frees it upon LEAVE, thus mortalizing it causes "attempt to free..." */
-               /* sv_2mortal(DEFSV); */
-               LEAVE;
-               XPUSHs(sv_mortalcopy(DEFSV));
-               XSRETURN(3);
+        PPCODE:
+                XPUSHs(sv_mortalcopy(DEFSV));
+                ENTER;
+                SAVE_DEFSV;
+                DEFSV_set(newSVpvs("DEFSV"));
+                XPUSHs(sv_mortalcopy(DEFSV));
+                /* Yes, this leaks the above scalar; 5.005 with threads for some reason */
+                /* frees it upon LEAVE, thus mortalizing it causes "attempt to free..." */
+                /* sv_2mortal(DEFSV); */
+                LEAVE;
+                XPUSHs(sv_mortalcopy(DEFSV));
+                XSRETURN(3);
 
 int
 ERRSV()
-       CODE:
-               RETVAL = SvTRUE(ERRSV);
-       OUTPUT:
-               RETVAL
+        CODE:
+                RETVAL = SvTRUE(ERRSV);
+        OUTPUT:
+                RETVAL
 
 SV*
 UNDERBAR()
-       CODE:
-               {
-                 dUNDERBAR;
-                 RETVAL = newSVsv(UNDERBAR);
-               }
-       OUTPUT:
-               RETVAL
+        CODE:
+                {
+                  dUNDERBAR;
+                  RETVAL = newSVsv(UNDERBAR);
+                }
+        OUTPUT:
+                RETVAL
 
 void
 prepush()
-       CODE:
-               {
-                 dXSTARG;
-                 XSprePUSH;
-                 PUSHi(42);
-                 XSRETURN(1);
-               }
+        CODE:
+                {
+                  dXSTARG;
+                  XSprePUSH;
+                  PUSHi(42);
+                  XSRETURN(1);
+                }
 
 int
 PERL_ABS(a)
-       int a
+        int a
 
 void
 SVf(x)
-       SV *x
-       PPCODE:
+        SV *x
+        PPCODE:
 #if { VERSION >= 5.004 }
-               x = sv_2mortal(newSVpvf("[%"SVf"]", SVfARG(x)));
+                x = sv_2mortal(newSVpvf("[%"SVf"]", SVfARG(x)));
 #endif
-               XPUSHs(x);
-               XSRETURN(1);
+                XPUSHs(x);
+                XSRETURN(1);
 
 void
 Perl_ppaddr_t(string)
-       char *string
-       PREINIT:
-               Perl_ppaddr_t lower;
-       PPCODE:
-               lower = PL_ppaddr[OP_LC];
-               mXPUSHs(newSVpv(string, 0));
-               PUTBACK;
-               ENTER;
-               (void)*(lower)(aTHXR);
-               SPAGAIN;
-               LEAVE;
-               XSRETURN(1);
-
-=tests plan => 39
+        char *string
+        PREINIT:
+                Perl_ppaddr_t lower;
+        PPCODE:
+                lower = PL_ppaddr[OP_LC];
+                mXPUSHs(newSVpv(string, 0));
+                PUTBACK;
+                ENTER;
+                (void)*(lower)(aTHXR);
+                SPAGAIN;
+                LEAVE;
+                XSRETURN(1);
+
+#if { VERSION >= 5.8.0 }
+
+void
+check_HeUTF8(utf8_key)
+        SV *utf8_key;
+        PREINIT:
+                HV *hash;
+                HE *ent;
+                STRLEN klen;
+                char *key;
+        PPCODE:
+                hash = newHV();
+
+                key = SvPV(utf8_key, klen);
+                if (SvUTF8(utf8_key)) klen *= -1;
+                hv_store(hash, key, klen, newSVpvs("string"), 0);
+                hv_iterinit(hash);
+                ent = hv_iternext(hash);
+                mXPUSHp((HeUTF8(ent) == 0 ? "norm" : "utf8"), 4);
+                hv_undef(hash);
+
+
+#endif
+
+=tests plan => 41
 
 use vars qw($my_sv @my_av %my_hv);
 
@@ -496,6 +540,7 @@ ok(&Devel::PPPort::UNDERBAR(), "Fred");
 
 if ($] >= 5.009002) {
   eval q{
+    no warnings "deprecated";
     no if $^V > v5.17.9, warnings => "experimental::lexical_topic";
     my $_ = "Tony";
     ok(&Devel::PPPort::DEFSV(), "Fred");
@@ -563,3 +608,12 @@ ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
 
 ok(&Devel::PPPort::ptrtests(), 63);
 
+if ($] >= 5.009000) {
+  eval q{
+    ok(&Devel::PPPort::check_HeUTF8("hello"), "norm");
+    ok(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
+  };
+} else {
+  ok(1, 1);
+  ok(1, 1);
+}