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