|
Packit |
7d6a7d |
################################################################################
|
|
Packit |
7d6a7d |
##
|
|
Packit |
7d6a7d |
## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
|
|
Packit |
7d6a7d |
## Version 2.x, Copyright (C) 2001, Paul Marquess.
|
|
Packit |
7d6a7d |
## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
|
|
Packit |
7d6a7d |
##
|
|
Packit |
7d6a7d |
## This program is free software; you can redistribute it and/or
|
|
Packit |
7d6a7d |
## modify it under the same terms as Perl itself.
|
|
Packit |
7d6a7d |
##
|
|
Packit |
7d6a7d |
################################################################################
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=provides
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
newSVpvn_share
|
|
Packit |
7d6a7d |
__UNDEFINED__
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=implementation
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
/* Hint: newSVpvn_share
|
|
Packit |
7d6a7d |
* The SVs created by this function only mimic the behaviour of
|
|
Packit |
7d6a7d |
* shared PVs without really being shared. Only use if you know
|
|
Packit |
7d6a7d |
* what you're doing.
|
|
Packit |
7d6a7d |
*/
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#ifndef newSVpvn_share
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#if { NEED newSVpvn_share }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
SV *
|
|
Packit |
7d6a7d |
newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
SV *sv;
|
|
Packit |
7d6a7d |
if (len < 0)
|
|
Packit |
7d6a7d |
len = -len;
|
|
Packit |
7d6a7d |
if (!hash)
|
|
Packit |
7d6a7d |
PERL_HASH(hash, (char*) src, len);
|
|
Packit |
7d6a7d |
sv = newSVpvn((char *) src, len);
|
|
Packit |
7d6a7d |
sv_upgrade(sv, SVt_PVIV);
|
|
Packit |
7d6a7d |
SvIVX(sv) = hash;
|
|
Packit |
7d6a7d |
SvREADONLY_on(sv);
|
|
Packit |
7d6a7d |
SvPOK_on(sv);
|
|
Packit |
7d6a7d |
return sv;
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
__UNDEFINED__ SvSHARED_HASH(sv) (0 + SvUVX(sv))
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=xsinit
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#define NEED_newSVpvn_share
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=xsubs
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
int
|
|
Packit |
7d6a7d |
newSVpvn_share()
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
const char *s;
|
|
Packit |
7d6a7d |
SV *sv;
|
|
Packit |
7d6a7d |
STRLEN len;
|
|
Packit |
7d6a7d |
U32 hash;
|
|
Packit |
7d6a7d |
CODE:
|
|
Packit |
7d6a7d |
RETVAL = 0;
|
|
Packit |
7d6a7d |
s = "mhx";
|
|
Packit |
7d6a7d |
len = 3;
|
|
Packit |
7d6a7d |
PERL_HASH(hash, (char *) s, len);
|
|
Packit |
7d6a7d |
sv = newSVpvn_share(s, len, 0);
|
|
Packit |
7d6a7d |
s = 0;
|
|
Packit |
7d6a7d |
RETVAL += strEQ(SvPV_nolen_const(sv), "mhx");
|
|
Packit |
7d6a7d |
RETVAL += SvCUR(sv) == len;
|
|
Packit |
7d6a7d |
RETVAL += SvSHARED_HASH(sv) == hash;
|
|
Packit |
7d6a7d |
SvREFCNT_dec(sv);
|
|
Packit |
7d6a7d |
s = "foobar";
|
|
Packit |
7d6a7d |
len = 6;
|
|
Packit |
7d6a7d |
PERL_HASH(hash, (char *) s, len);
|
|
Packit |
7d6a7d |
sv = newSVpvn_share(s, -(I32) len, hash);
|
|
Packit |
7d6a7d |
s = 0;
|
|
Packit |
7d6a7d |
RETVAL += strEQ(SvPV_nolen_const(sv), "foobar");
|
|
Packit |
7d6a7d |
RETVAL += SvCUR(sv) == len;
|
|
Packit |
7d6a7d |
RETVAL += SvSHARED_HASH(sv) == hash;
|
|
Packit |
7d6a7d |
SvREFCNT_dec(sv);
|
|
Packit |
7d6a7d |
OUTPUT:
|
|
Packit |
7d6a7d |
RETVAL
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=tests plan => 1
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
ok(&Devel::PPPort::newSVpvn_share(), 6);
|