Rename ext/Devel/PPPort to ext/Devel-PPPort
[p5sagit/p5-mst-13.2.git] / ext / Devel-PPPort / parts / inc / shared_pv
CommitLineData
c83e6f19 1################################################################################
2##
51d6c659 3## $Revision: 5 $
c83e6f19 4## $Author: mhx $
51d6c659 5## $Date: 2009/01/18 14:10:52 +0100 $
c83e6f19 6##
7################################################################################
8##
51d6c659 9## Version 3.x, Copyright (C) 2004-2009, Marcus Holland-Moritz.
c83e6f19 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
20newSVpvn_share
21__UNDEFINED__
22
23=implementation
24
25#ifndef newSVpvn_share
26
27#if { NEED newSVpvn_share }
28
29SV *
30newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
31{
32 SV *sv;
33 if (len < 0)
34 len = -len;
35 if (!hash)
aab9a3b6 36 PERL_HASH(hash, (char*) src, len);
c83e6f19 37 sv = newSVpvn((char *) src, len);
38 sv_upgrade(sv, SVt_PVIV);
39 SvIVX(sv) = hash;
40 SvREADONLY_on(sv);
41 SvPOK_on(sv);
42 return sv;
43}
44
45#endif
46
47#endif
48
49__UNDEFINED__ SvSHARED_HASH(sv) (0 + SvUVX(sv))
50
51=xsinit
52
53#define NEED_newSVpvn_share
54
55=xsubs
56
57int
58newSVpvn_share()
59 PREINIT:
60 const char *s;
61 SV *sv;
62 STRLEN len;
63 U32 hash;
64 CODE:
65 RETVAL = 0;
66 s = "mhx";
67 len = 3;
aab9a3b6 68 PERL_HASH(hash, (char *) s, len);
c83e6f19 69 sv = newSVpvn_share(s, len, 0);
70 s = 0;
71 RETVAL += strEQ(SvPV_nolen_const(sv), "mhx");
72 RETVAL += SvCUR(sv) == len;
73 RETVAL += SvSHARED_HASH(sv) == hash;
74 SvREFCNT_dec(sv);
75 s = "foobar";
76 len = 6;
aab9a3b6 77 PERL_HASH(hash, (char *) s, len);
78 sv = newSVpvn_share(s, -(I32) len, hash);
c83e6f19 79 s = 0;
80 RETVAL += strEQ(SvPV_nolen_const(sv), "foobar");
81 RETVAL += SvCUR(sv) == len;
82 RETVAL += SvSHARED_HASH(sv) == hash;
83 SvREFCNT_dec(sv);
84 OUTPUT:
85 RETVAL
86
87
88=tests plan => 1
89
90ok(&Devel::PPPort::newSVpvn_share(), 6);
91