This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Devel::PPPort 3.00_03.
[perl5.git] / ext / Devel / PPPort / parts / inc / SvPV
CommitLineData
adfe19db
MHM
1################################################################################
2##
3## $Revision: 7 $
4## $Author: mhx $
5## $Date: 2004/08/13 12:47:16 +0200 $
6##
7################################################################################
8##
9## Version 3.x, Copyright (C) 2004, Marcus Holland-Moritz.
10## Version 2.x, Copyright (C) 2001, Paul Marquess.
11## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
12##
13## This program is free software; you can redistribute it and/or
14## modify it under the same terms as Perl itself.
15##
16################################################################################
17
18=provides
19
20SvPV_nolen
21sv_2pv_nolen
22SvPVbyte
23sv_2pvbyte
24sv_pvn
25sv_pvn_force
26
27=implementation
28
29#ifndef SvPV_nolen
30
31#if { NEED sv_2pv_nolen }
32
33char *
34sv_2pv_nolen(pTHX_ register SV *sv)
35{
36 STRLEN n_a;
37 return sv_2pv(sv, &n_a);
38}
39
40#endif
41
42/* Hint: sv_2pv_nolen
43 * Use the SvPV_nolen() macro instead of sv_2pv_nolen().
44 */
45
46/* SvPV_nolen depends on sv_2pv_nolen */
47#define SvPV_nolen(sv) \
48 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
49 ? SvPVX(sv) : sv_2pv_nolen(sv))
50
51#endif
52
53#ifdef SvPVbyte
54
55/* Hint: SvPVbyte
56 * Does not work in perl-5.6.1, ppport.h implements a version
57 * borrowed from perl-5.7.3.
58 */
59
60#if { VERSION < 5.7.0 }
61
62#if { NEED sv_2pvbyte }
63
64char *
65sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
66{
67 sv_utf8_downgrade(sv,0);
68 return SvPV(sv,*lp);
69}
70
71#endif
72
73/* Hint: sv_2pvbyte
74 * Use the SvPVbyte() macro instead of sv_2pvbyte().
75 */
76
77#undef SvPVbyte
78
79/* SvPVbyte depends on sv_2pvbyte */
80#define SvPVbyte(sv, lp) \
81 ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
82 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
83
84#endif
85
86#else
87
88# define SvPVbyte SvPV
89# define sv_2pvbyte sv_2pv
90
91#endif
92
93/* sv_2pvbyte_nolen depends on sv_2pv_nolen */
94__UNDEFINED__ sv_2pvbyte_nolen sv_2pv_nolen
95
96/* Hint: sv_pvn
97 * Always use the SvPV() macro instead of sv_pvn().
98 */
99__UNDEFINED__ sv_pvn(sv, len) SvPV(sv, len)
100
101/* Hint: sv_pvn
102 * Always use the SvPV_force() macro instead of sv_pvn_force().
103 */
104__UNDEFINED__ sv_pvn_force(sv, len) SvPV_force(sv, len)
105
106=xsinit
107
108#define NEED_sv_2pv_nolen
109#define NEED_sv_2pvbyte
110
111=xsubs
112
113IV
114SvPVbyte(sv)
115 SV *sv
116 PREINIT:
117 STRLEN len;
118 const char *str;
119 CODE:
120 str = SvPVbyte(sv, len);
121 RETVAL = strEQ(str, "mhx") ? len : -1;
122 OUTPUT:
123 RETVAL
124
125IV
126SvPV_nolen(sv)
127 SV *sv
128 PREINIT:
129 const char *str;
130 CODE:
131 str = SvPV_nolen(sv);
132 RETVAL = strEQ(str, "mhx") ? 3 : 0;
133 OUTPUT:
134 RETVAL
135
136=tests plan => 2
137
138ok(&Devel::PPPort::SvPVbyte("mhx"), 3);
139ok(&Devel::PPPort::SvPVbyte("mhx"), 3);
140