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 145759b3d2Safresh1vnewSVpvf 155759b3d2Safresh1sv_vcatpvf 165759b3d2Safresh1sv_vsetpvf 175759b3d2Safresh1 185759b3d2Safresh1sv_catpvf_mg 195759b3d2Safresh1sv_catpvf_mg_nocontext 205759b3d2Safresh1sv_vcatpvf_mg 215759b3d2Safresh1 225759b3d2Safresh1sv_setpvf_mg 235759b3d2Safresh1sv_setpvf_mg_nocontext 245759b3d2Safresh1sv_vsetpvf_mg 255759b3d2Safresh1 265759b3d2Safresh1=implementation 275759b3d2Safresh1 285759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(vnewSVpvf) 29*9a4edab6Sbluhm#if defined(PERL_USE_GCC_BRACE_GROUPS) 30de8cc8edSafresh1# define vnewSVpvf(pat, args) ({ SV *_sv = newSV(0); sv_vsetpvfn(_sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)); _sv; }) 31de8cc8edSafresh1#else 32de8cc8edSafresh1# define vnewSVpvf(pat, args) ((PL_Sv = newSV(0)), sv_vsetpvfn(PL_Sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)), PL_Sv) 335759b3d2Safresh1#endif 345759b3d2Safresh1#endif 355759b3d2Safresh1 365759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_vcatpvf) 375759b3d2Safresh1# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) 385759b3d2Safresh1#endif 395759b3d2Safresh1 405759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_vsetpvf) 415759b3d2Safresh1# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) 425759b3d2Safresh1#endif 435759b3d2Safresh1 445759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_catpvf_mg) 455759b3d2Safresh1#if { NEED sv_catpvf_mg } 465759b3d2Safresh1 475759b3d2Safresh1void 48de8cc8edSafresh1sv_catpvf_mg(pTHX_ SV * const sv, const char * const pat, ...) 495759b3d2Safresh1{ 505759b3d2Safresh1 va_list args; 515759b3d2Safresh1 va_start(args, pat); 525759b3d2Safresh1 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); 535759b3d2Safresh1 SvSETMAGIC(sv); 545759b3d2Safresh1 va_end(args); 555759b3d2Safresh1} 565759b3d2Safresh1 575759b3d2Safresh1#endif 585759b3d2Safresh1#endif 595759b3d2Safresh1 605759b3d2Safresh1#ifdef PERL_IMPLICIT_CONTEXT 615759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_catpvf_mg_nocontext) 625759b3d2Safresh1#if { NEED sv_catpvf_mg_nocontext } 635759b3d2Safresh1 645759b3d2Safresh1void 65de8cc8edSafresh1sv_catpvf_mg_nocontext(SV * const sv, const char * const pat, ...) 665759b3d2Safresh1{ 675759b3d2Safresh1 dTHX; 685759b3d2Safresh1 va_list args; 695759b3d2Safresh1 va_start(args, pat); 705759b3d2Safresh1 sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); 715759b3d2Safresh1 SvSETMAGIC(sv); 725759b3d2Safresh1 va_end(args); 735759b3d2Safresh1} 745759b3d2Safresh1 755759b3d2Safresh1#endif 765759b3d2Safresh1#endif 775759b3d2Safresh1#endif 785759b3d2Safresh1 795759b3d2Safresh1/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ 805759b3d2Safresh1#ifndef sv_catpvf_mg 815759b3d2Safresh1# ifdef PERL_IMPLICIT_CONTEXT 825759b3d2Safresh1# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext 835759b3d2Safresh1# else 845759b3d2Safresh1# define sv_catpvf_mg Perl_sv_catpvf_mg 855759b3d2Safresh1# endif 865759b3d2Safresh1#endif 875759b3d2Safresh1 885759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_vcatpvf_mg) 895759b3d2Safresh1# define sv_vcatpvf_mg(sv, pat, args) \ 905759b3d2Safresh1 STMT_START { \ 915759b3d2Safresh1 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ 925759b3d2Safresh1 SvSETMAGIC(sv); \ 935759b3d2Safresh1 } STMT_END 945759b3d2Safresh1#endif 955759b3d2Safresh1 965759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_setpvf_mg) 975759b3d2Safresh1#if { NEED sv_setpvf_mg } 985759b3d2Safresh1 995759b3d2Safresh1void 100de8cc8edSafresh1sv_setpvf_mg(pTHX_ SV * const sv, const char * const pat, ...) 1015759b3d2Safresh1{ 1025759b3d2Safresh1 va_list args; 1035759b3d2Safresh1 va_start(args, pat); 1045759b3d2Safresh1 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); 1055759b3d2Safresh1 SvSETMAGIC(sv); 1065759b3d2Safresh1 va_end(args); 1075759b3d2Safresh1} 1085759b3d2Safresh1 1095759b3d2Safresh1#endif 1105759b3d2Safresh1#endif 1115759b3d2Safresh1 1125759b3d2Safresh1#ifdef PERL_IMPLICIT_CONTEXT 1135759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_setpvf_mg_nocontext) 1145759b3d2Safresh1#if { NEED sv_setpvf_mg_nocontext } 1155759b3d2Safresh1 1165759b3d2Safresh1void 117de8cc8edSafresh1sv_setpvf_mg_nocontext(SV * const sv, const char * const pat, ...) 1185759b3d2Safresh1{ 1195759b3d2Safresh1 dTHX; 1205759b3d2Safresh1 va_list args; 1215759b3d2Safresh1 va_start(args, pat); 1225759b3d2Safresh1 sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); 1235759b3d2Safresh1 SvSETMAGIC(sv); 1245759b3d2Safresh1 va_end(args); 1255759b3d2Safresh1} 1265759b3d2Safresh1 1275759b3d2Safresh1#endif 1285759b3d2Safresh1#endif 1295759b3d2Safresh1#endif 1305759b3d2Safresh1 1315759b3d2Safresh1/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ 1325759b3d2Safresh1#ifndef sv_setpvf_mg 1335759b3d2Safresh1# ifdef PERL_IMPLICIT_CONTEXT 1345759b3d2Safresh1# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext 1355759b3d2Safresh1# else 1365759b3d2Safresh1# define sv_setpvf_mg Perl_sv_setpvf_mg 1375759b3d2Safresh1# endif 1385759b3d2Safresh1#endif 1395759b3d2Safresh1 1405759b3d2Safresh1#if { VERSION >= 5.004 } && !defined(sv_vsetpvf_mg) 1415759b3d2Safresh1# define sv_vsetpvf_mg(sv, pat, args) \ 1425759b3d2Safresh1 STMT_START { \ 1435759b3d2Safresh1 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ 1445759b3d2Safresh1 SvSETMAGIC(sv); \ 1455759b3d2Safresh1 } STMT_END 1465759b3d2Safresh1#endif 1475759b3d2Safresh1 1485759b3d2Safresh1=xsinit 1495759b3d2Safresh1 1505759b3d2Safresh1#define NEED_sv_catpvf_mg 1515759b3d2Safresh1#define NEED_sv_catpvf_mg_nocontext 1525759b3d2Safresh1#define NEED_sv_setpvf_mg 1535759b3d2Safresh1#define NEED_sv_setpvf_mg_nocontext 1545759b3d2Safresh1 1555759b3d2Safresh1=xsmisc 1565759b3d2Safresh1 1575759b3d2Safresh1static SV * test_vnewSVpvf(pTHX_ const char *pat, ...) 1585759b3d2Safresh1{ 1595759b3d2Safresh1 SV *sv; 1605759b3d2Safresh1 va_list args; 1615759b3d2Safresh1 va_start(args, pat); 1625759b3d2Safresh1#if { VERSION >= 5.004 } 1635759b3d2Safresh1 sv = vnewSVpvf(pat, &args); 1645759b3d2Safresh1#else 1655759b3d2Safresh1 sv = newSVpv((char *) pat, 0); 1665759b3d2Safresh1#endif 1675759b3d2Safresh1 va_end(args); 1685759b3d2Safresh1 return sv; 1695759b3d2Safresh1} 1705759b3d2Safresh1 1715759b3d2Safresh1static void test_sv_vcatpvf(pTHX_ SV *sv, const char *pat, ...) 1725759b3d2Safresh1{ 1735759b3d2Safresh1 va_list args; 1745759b3d2Safresh1 va_start(args, pat); 1755759b3d2Safresh1#if { VERSION >= 5.004 } 1765759b3d2Safresh1 sv_vcatpvf(sv, pat, &args); 1775759b3d2Safresh1#else 1785759b3d2Safresh1 sv_catpv(sv, (char *) pat); 1795759b3d2Safresh1#endif 1805759b3d2Safresh1 va_end(args); 1815759b3d2Safresh1} 1825759b3d2Safresh1 1835759b3d2Safresh1static void test_sv_vsetpvf(pTHX_ SV *sv, const char *pat, ...) 1845759b3d2Safresh1{ 1855759b3d2Safresh1 va_list args; 1865759b3d2Safresh1 va_start(args, pat); 1875759b3d2Safresh1#if { VERSION >= 5.004 } 1885759b3d2Safresh1 sv_vsetpvf(sv, pat, &args); 1895759b3d2Safresh1#else 1905759b3d2Safresh1 sv_setpv(sv, (char *) pat); 1915759b3d2Safresh1#endif 1925759b3d2Safresh1 va_end(args); 1935759b3d2Safresh1} 1945759b3d2Safresh1 1955759b3d2Safresh1=xsubs 1965759b3d2Safresh1 1975759b3d2Safresh1SV * 1985759b3d2Safresh1vnewSVpvf() 1995759b3d2Safresh1 CODE: 2005759b3d2Safresh1 RETVAL = test_vnewSVpvf(aTHX_ "%s-%d", "Perl", 42); 2015759b3d2Safresh1 OUTPUT: 2025759b3d2Safresh1 RETVAL 2035759b3d2Safresh1 2045759b3d2Safresh1SV * 2055759b3d2Safresh1sv_vcatpvf(sv) 2065759b3d2Safresh1 SV *sv 2075759b3d2Safresh1 CODE: 2085759b3d2Safresh1 RETVAL = newSVsv(sv); 2095759b3d2Safresh1 test_sv_vcatpvf(aTHX_ RETVAL, "%s-%d", "Perl", 42); 2105759b3d2Safresh1 OUTPUT: 2115759b3d2Safresh1 RETVAL 2125759b3d2Safresh1 2135759b3d2Safresh1SV * 2145759b3d2Safresh1sv_vsetpvf(sv) 2155759b3d2Safresh1 SV *sv 2165759b3d2Safresh1 CODE: 2175759b3d2Safresh1 RETVAL = newSVsv(sv); 2185759b3d2Safresh1 test_sv_vsetpvf(aTHX_ RETVAL, "%s-%d", "Perl", 42); 2195759b3d2Safresh1 OUTPUT: 2205759b3d2Safresh1 RETVAL 2215759b3d2Safresh1 2225759b3d2Safresh1void 2235759b3d2Safresh1sv_catpvf_mg(sv) 2245759b3d2Safresh1 SV *sv 2255759b3d2Safresh1 CODE: 2265759b3d2Safresh1#if { VERSION >= 5.004 } 2275759b3d2Safresh1 sv_catpvf_mg(sv, "%s-%d", "Perl", 42); 2285759b3d2Safresh1#endif 2295759b3d2Safresh1 2305759b3d2Safresh1void 2315759b3d2Safresh1Perl_sv_catpvf_mg(sv) 2325759b3d2Safresh1 SV *sv 2335759b3d2Safresh1 CODE: 2345759b3d2Safresh1#if { VERSION >= 5.004 } 2355759b3d2Safresh1 Perl_sv_catpvf_mg(aTHX_ sv, "%s-%d", "-Perl", 43); 2365759b3d2Safresh1#endif 2375759b3d2Safresh1 2385759b3d2Safresh1void 2395759b3d2Safresh1sv_catpvf_mg_nocontext(sv) 2405759b3d2Safresh1 SV *sv 2415759b3d2Safresh1 CODE: 2425759b3d2Safresh1#if { VERSION >= 5.004 } 2435759b3d2Safresh1#ifdef PERL_IMPLICIT_CONTEXT 2445759b3d2Safresh1 sv_catpvf_mg_nocontext(sv, "%s-%d", "-Perl", 44); 2455759b3d2Safresh1#else 2465759b3d2Safresh1 sv_catpvf_mg(sv, "%s-%d", "-Perl", 44); 2475759b3d2Safresh1#endif 2485759b3d2Safresh1#endif 2495759b3d2Safresh1 2505759b3d2Safresh1void 2515759b3d2Safresh1sv_setpvf_mg(sv) 2525759b3d2Safresh1 SV *sv 2535759b3d2Safresh1 CODE: 2545759b3d2Safresh1#if { VERSION >= 5.004 } 2555759b3d2Safresh1 sv_setpvf_mg(sv, "%s-%d", "mhx", 42); 2565759b3d2Safresh1#endif 2575759b3d2Safresh1 2585759b3d2Safresh1void 2595759b3d2Safresh1Perl_sv_setpvf_mg(sv) 2605759b3d2Safresh1 SV *sv 2615759b3d2Safresh1 CODE: 2625759b3d2Safresh1#if { VERSION >= 5.004 } 2635759b3d2Safresh1 Perl_sv_setpvf_mg(aTHX_ sv, "%s-%d", "foo", 43); 2645759b3d2Safresh1#endif 2655759b3d2Safresh1 2665759b3d2Safresh1void 2675759b3d2Safresh1sv_setpvf_mg_nocontext(sv) 2685759b3d2Safresh1 SV *sv 2695759b3d2Safresh1 CODE: 2705759b3d2Safresh1#if { VERSION >= 5.004 } 2715759b3d2Safresh1#ifdef PERL_IMPLICIT_CONTEXT 2725759b3d2Safresh1 sv_setpvf_mg_nocontext(sv, "%s-%d", "bar", 44); 2735759b3d2Safresh1#else 2745759b3d2Safresh1 sv_setpvf_mg(sv, "%s-%d", "bar", 44); 2755759b3d2Safresh1#endif 2765759b3d2Safresh1#endif 2775759b3d2Safresh1 2785759b3d2Safresh1=tests plan => 9 2795759b3d2Safresh1 2805759b3d2Safresh1use Tie::Hash; 2815759b3d2Safresh1my %h; 2825759b3d2Safresh1tie %h, 'Tie::StdHash'; 2835759b3d2Safresh1$h{foo} = 'foo-'; 2845759b3d2Safresh1$h{bar} = ''; 2855759b3d2Safresh1 286*9a4edab6Sbluhmis(&Devel::PPPort::vnewSVpvf(), ivers($]) >= ivers("5.004") ? 'Perl-42' : '%s-%d'); 287*9a4edab6Sbluhmis(&Devel::PPPort::sv_vcatpvf('1-2-3-'), ivers($]) >= ivers("5.004") ? '1-2-3-Perl-42' : '1-2-3-%s-%d'); 288*9a4edab6Sbluhmis(&Devel::PPPort::sv_vsetpvf('1-2-3-'), ivers($]) >= ivers("5.004") ? 'Perl-42' : '%s-%d'); 2895759b3d2Safresh1 2905759b3d2Safresh1&Devel::PPPort::sv_catpvf_mg($h{foo}); 291*9a4edab6Sbluhmis($h{foo}, ivers($]) >= ivers("5.004") ? 'foo-Perl-42' : 'foo-'); 2925759b3d2Safresh1 2935759b3d2Safresh1&Devel::PPPort::Perl_sv_catpvf_mg($h{foo}); 294*9a4edab6Sbluhmis($h{foo}, ivers($]) >= ivers("5.004") ? 'foo-Perl-42-Perl-43' : 'foo-'); 2955759b3d2Safresh1 2965759b3d2Safresh1&Devel::PPPort::sv_catpvf_mg_nocontext($h{foo}); 297*9a4edab6Sbluhmis($h{foo}, ivers($]) >= ivers("5.004") ? 'foo-Perl-42-Perl-43-Perl-44' : 'foo-'); 2985759b3d2Safresh1 2995759b3d2Safresh1&Devel::PPPort::sv_setpvf_mg($h{bar}); 300*9a4edab6Sbluhmis($h{bar}, ivers($]) >= ivers("5.004") ? 'mhx-42' : ''); 3015759b3d2Safresh1 3025759b3d2Safresh1&Devel::PPPort::Perl_sv_setpvf_mg($h{bar}); 303*9a4edab6Sbluhmis($h{bar}, ivers($]) >= ivers("5.004") ? 'foo-43' : ''); 3045759b3d2Safresh1 3055759b3d2Safresh1&Devel::PPPort::sv_setpvf_mg_nocontext($h{bar}); 306*9a4edab6Sbluhmis($h{bar}, ivers($]) >= ivers("5.004") ? 'bar-44' : ''); 307