If a Perl patch can be made available for this purpose, then why not
an XS/C module?

On Tue, Apr 21, 2009 at 8:17 PM, Peter Pentchev <r...@ringlet.net> wrote:
> On Tue, Apr 21, 2009 at 10:24:10AM +0100, Paul LeoNerd Evans wrote:
>> I find lately I've been doing a lot of binary protocol work, taking
>> messages that live in TCP streams or files or similar, and doing lots of
>> pack()/unpack() on them.
> [snip]
>>
>> Is there some neater way to do this? Can I either:
>>
>>  a: Get unpack() to consume bytes from the LVALUE
>>
>>  b: Ask unpack() how much it ate in a generic fashion?
>
> Brief answer:
> - it's possible by patching the Perl source, see the last paragraph
>  for an explanation about a possible patch;
> - it could be done as an external module that must be kept in sync
>  with Perl's pp_pack.c.
>
> From a quick look at pp_pack.c in both Perl 5.8.9 and Perl 5.10.0,
> both options are possible in theory, but both of them require
> modifying the Perl source in some way :(
>
> The least intrusive way IMHO would be to un-staticize the unpack_rec()
> routine, so either another part of core Perl or a module that
> "promises" to stay in sync with pp_pack's unpackstr() routine actually
> *can* make use of unpack_rec's last argument.
>
> Of course, it is still possible for an external module to duplicate
> the whole of pp_pack.c and take great pains to stay in sync with core,
> but I'm not sure anyone would actually *want* to do that :>  Although,
> actually, I hereby volunteer to do it - to try to make a separate Perl
> module out of a copy of 5.10.0's pp_pack.c, and then follow Perl's
> development and update it as needed - that is, if there's anyone who
> actually thinks this would be a good idea and if there's no-one who
> thinks it would be a very bad idea.   I can see why it could be a bad
> idea, but here's a call for opinions / votes / whatever :)  If people
> want it, I can try.
>
> An easier (from a programmer's point of view) and nightmarish
> (from a module writer's point of view) solution would be a patch to
> Perl that adds another function (say, lunpack()) to pp_pack.c, that
> does pretty much the same as the current unpack(), but also return
> (or store somewhere) the number of bytes consumed.  It would only
> be useful if it is actually accepted into the core Perl and makes it
> into a release that you can "require".  I think I could write a patch
> like that tomorrow after I've actually had some sleep :)
>
> G'luck,
> Peter
>
> --
> Peter Pentchev  r...@ringlet.net    r...@space.bg    r...@freebsd.org
> PGP key:        http://people.FreeBSD.org/~roam/roam.key.asc
> Key fingerprint FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
> I am the meaning of this sentence.
>

Reply via email to