1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
################################################################################
##
## $Revision: 1 $
## $Author: mhx $
## $Date: 2007/08/19 19:38:17 +0200 $
##
################################################################################
##
## Version 3.x, Copyright (C) 2004-2007, Marcus Holland-Moritz.
## Version 2.x, Copyright (C) 2001, Paul Marquess.
## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
##
## This program is free software; you can redistribute it and/or
## modify it under the same terms as Perl itself.
##
################################################################################
=provides
newSVpvn_share
__UNDEFINED__
=implementation
#ifndef newSVpvn_share
#if { NEED newSVpvn_share }
SV *
newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
{
SV *sv;
if (len < 0)
len = -len;
if (!hash)
PERL_HASH(hash, src, len);
sv = newSVpvn((char *) src, len);
sv_upgrade(sv, SVt_PVIV);
SvIVX(sv) = hash;
SvREADONLY_on(sv);
SvPOK_on(sv);
return sv;
}
#endif
#endif
__UNDEFINED__ SvSHARED_HASH(sv) (0 + SvUVX(sv))
=xsinit
#define NEED_newSVpvn_share
=xsubs
int
newSVpvn_share()
PREINIT:
const char *s;
SV *sv;
STRLEN len;
U32 hash;
CODE:
RETVAL = 0;
s = "mhx";
len = 3;
PERL_HASH(hash, s, len);
sv = newSVpvn_share(s, len, 0);
s = 0;
RETVAL += strEQ(SvPV_nolen_const(sv), "mhx");
RETVAL += SvCUR(sv) == len;
RETVAL += SvSHARED_HASH(sv) == hash;
SvREFCNT_dec(sv);
s = "foobar";
len = 6;
PERL_HASH(hash, s, len);
sv = newSVpvn_share(s, -len, hash);
s = 0;
RETVAL += strEQ(SvPV_nolen_const(sv), "foobar");
RETVAL += SvCUR(sv) == len;
RETVAL += SvSHARED_HASH(sv) == hash;
SvREFCNT_dec(sv);
OUTPUT:
RETVAL
=tests plan => 1
ok(&Devel::PPPort::newSVpvn_share(), 6);
|