Commit | Line | Data |
adfe19db |
1 | ################################################################################ |
2 | ## |
0d0f8426 |
3 | ## $Revision: 13 $ |
adfe19db |
4 | ## $Author: mhx $ |
0d0f8426 |
5 | ## $Date: 2006/01/14 18:08:01 +0100 $ |
adfe19db |
6 | ## |
7 | ################################################################################ |
8 | ## |
0d0f8426 |
9 | ## Version 3.x, Copyright (C) 2004-2006, Marcus Holland-Moritz. |
adfe19db |
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 | |
20 | SvPV_nolen |
21 | sv_2pv_nolen |
22 | SvPVbyte |
23 | sv_2pvbyte |
24 | sv_pvn |
25 | sv_pvn_force |
26 | |
27 | =implementation |
28 | |
29 | #ifndef SvPV_nolen |
30 | |
31 | #if { NEED sv_2pv_nolen } |
32 | |
33 | char * |
34 | sv_2pv_nolen(pTHX_ register SV *sv) |
4a582685 |
35 | { |
adfe19db |
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 | |
64 | char * |
65 | sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp) |
4a582685 |
66 | { |
adfe19db |
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 | |
04fc8b94 |
101 | /* Hint: sv_pvn_force |
adfe19db |
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 | |
113 | IV |
114 | SvPVbyte(sv) |
115 | SV *sv |
116 | PREINIT: |
117 | STRLEN len; |
118 | const char *str; |
119 | CODE: |
120 | str = SvPVbyte(sv, len); |
0d0f8426 |
121 | RETVAL = strEQ(str, "mhx") ? (IV) len : (IV) -1; |
adfe19db |
122 | OUTPUT: |
123 | RETVAL |
124 | |
125 | IV |
126 | SvPV_nolen(sv) |
127 | SV *sv |
128 | PREINIT: |
129 | const char *str; |
130 | CODE: |
131 | str = SvPV_nolen(sv); |
9132e1a3 |
132 | RETVAL = strEQ(str, "mhx") ? 42 : 0; |
adfe19db |
133 | OUTPUT: |
134 | RETVAL |
135 | |
136 | =tests plan => 2 |
137 | |
138 | ok(&Devel::PPPort::SvPVbyte("mhx"), 3); |
9132e1a3 |
139 | ok(&Devel::PPPort::SvPV_nolen("mhx"), 42); |
adfe19db |
140 | |