--- Convert-Scalar/Scalar.xs 2001/09/27 18:32:22 1.1 +++ Convert-Scalar/Scalar.xs 2004/11/27 23:36:37 1.8 @@ -2,13 +2,18 @@ #include "perl.h" #include "XSUB.h" -#if PERL_VERSION < 7 -# define is_utf8_string(s,l) (croak ("utf8_valid requires perl 5.7 or higher"), 0) -#endif +#define RETCOPY(sv) \ + if (GIMME_V != G_VOID) \ + { \ + dXSTARG; \ + sv_setsv (TARG, (sv)); \ + EXTEND (SP, 1); \ + PUSHs (TARG); \ + } MODULE = Convert::Scalar PACKAGE = Convert::Scalar -int +bool utf8(scalar,mode=0) SV * scalar SV * mode @@ -18,6 +23,8 @@ RETVAL = !!SvUTF8 (scalar); if (items > 1) { + if (SvREADONLY (scalar)) + croak ("Convert::Scalar::utf8 called on read only scalar"); if (SvTRUE (mode)) SvUTF8_on (scalar); else @@ -31,20 +38,24 @@ SV * scalar PROTOTYPE: $ PPCODE: + if (SvREADONLY (scalar)) + croak ("Convert::Scalar::utf8_on called on read only scalar"); + SvGETMAGIC (scalar); SvUTF8_on (scalar); - if (GIMME_V != G_VOID) - XPUSHs (sv_2mortal (SvREFCNT_inc (scalar))); + RETCOPY (scalar); void utf8_off(scalar) SV * scalar PROTOTYPE: $ PPCODE: + if (SvREADONLY (scalar)) + croak ("Convert::Scalar::utf8_off called on read only scalar"); + SvGETMAGIC (scalar); SvUTF8_off (scalar); - if (GIMME_V != G_VOID) - XPUSHs (sv_2mortal (SvREFCNT_inc (scalar))); + RETCOPY (scalar); int utf8_valid(scalar) @@ -62,9 +73,11 @@ SV * scalar PROTOTYPE: $ PPCODE: + if (SvREADONLY (scalar)) + croak ("Convert::Scalar::utf8_upgrade called on read only scalar"); + sv_utf8_upgrade(scalar); - if (GIMME_V != G_VOID) - XPUSHs (sv_2mortal (SvREFCNT_inc (scalar))); + RETCOPY (scalar); bool utf8_downgrade(scalar, fail_ok = 0) @@ -72,6 +85,9 @@ bool fail_ok PROTOTYPE: $;$ CODE: + if (SvREADONLY (scalar)) + croak ("Convert::Scalar::utf8_downgrade called on read only scalar"); + RETVAL = sv_utf8_downgrade (scalar, fail_ok); OUTPUT: RETVAL @@ -81,16 +97,18 @@ SV * scalar PROTOTYPE: $ PPCODE: + if (SvREADONLY (scalar)) + croak ("Convert::Scalar::utf8_encode called on read only scalar"); + sv_utf8_encode (scalar); - if (GIMME_V != G_VOID) - XPUSHs (sv_2mortal (SvREFCNT_inc (scalar))); + RETCOPY (scalar); UV utf8_length(scalar) SV * scalar PROTOTYPE: $ CODE: - RETVAL = (UV) sv_len_utf8 (scalar); + RETVAL = (UV) utf8_length (SvPV_nolen (scalar), SvEND (scalar)); OUTPUT: RETVAL @@ -142,3 +160,104 @@ if (GIMME_V != G_VOID) XPUSHs (sv_2mortal (SvREFCNT_inc (scalar))); +int +refcnt(scalar,newrefcnt=0) + SV * scalar + int newrefcnt + PROTOTYPE: $;$ + ALIAS: + refcnt_rv = 1 + CODE: + if (ix) + { + if (!SvROK (scalar)) croak ("refcnt_rv requires a reference as it's first argument"); + scalar = SvRV (scalar); + } + RETVAL = SvREFCNT (scalar); + if (items > 1) + SvREFCNT (scalar) = newrefcnt; + OUTPUT: + RETVAL + +void +refcnt_inc(scalar) + SV * scalar + ALIAS: + refcnt_inc_rv = 1 + PROTOTYPE: $ + CODE: + if (ix) + { + if (!SvROK (scalar)) croak ("refcnt_inc_rv requires a reference as it's first argument"); + scalar = SvRV (scalar); + } + SvREFCNT_inc (scalar); + +void +refcnt_dec(scalar) + SV * scalar + ALIAS: + refcnt_dec_rv = 1 + PROTOTYPE: $ + CODE: + if (ix) + { + if (!SvROK (scalar)) croak ("refcnt_dec_rv requires a reference as it's first argument"); + scalar = SvRV (scalar); + } + SvREFCNT_dec (scalar); + +bool +ok(scalar) + SV * scalar + PROTOTYPE: $ + CODE: + RETVAL = SvOK (scalar); + OUTPUT: + RETVAL + +bool +uok(scalar) + SV * scalar + PROTOTYPE: $ + CODE: + RETVAL = SvUOK (scalar); + OUTPUT: + RETVAL + +bool +rok(scalar) + SV * scalar + PROTOTYPE: $ + CODE: + RETVAL = SvROK (scalar); + OUTPUT: + RETVAL + +bool +pok(scalar) + SV * scalar + PROTOTYPE: $ + CODE: + RETVAL = SvPOK (scalar); + OUTPUT: + RETVAL + +bool +nok(scalar) + SV * scalar + PROTOTYPE: $ + CODE: + RETVAL = SvNOK (scalar); + OUTPUT: + RETVAL + +bool +niok(scalar) + SV * scalar + PROTOTYPE: $ + CODE: + RETVAL = SvNIOK (scalar); + OUTPUT: + RETVAL +