in reply to Re: Re: Re: Re: Re: Re: Re: Win32 Shared Memory
in thread Win32 Shared Memory

Ah, I'd thought this was XS...from Perl there's no good way to inspect the string buffer beyond the actual end of the perl string. But it does look like it unintentionally modifies the caller's parameter; probably not a good thing. Is there a better way to unalias one parameter than:
splice(@_, 1, 1, unpack("Z*", $_[1]))

Replies are listed 'Best First'.
Re+: Win32 Shared Memory
by BrowserUk (Patriarch) on May 16, 2004 at 07:28 UTC

    The code the goes on to return the modified $_[1],

    sub Pack { my $type = $_[0]; if(packing($type) eq 'c' and is_pointer($type)) { $_[1] = pack("Z*", $_[1]); return $_[1]; } $_[1] = pack( packing($type), $_[1]); return $_[1]; }

    so a simple  return unpack'Z*',''.$_[1]; would probably do the job in the case where the parameter is a constant string or other IN parameter.

    But that solution falls down when the parameter being passed is an OUT or INOUT buffer. In that case, the calling code need for its copy of the buffer to be modifiable by the OS, so copying the buffer to null terminate it, would be a problem.


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail