On Tue, Apr 21, 2009 at 09:08:56PM -0400, Jonathan Yu wrote:
> 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 :)
> 
> If a Perl patch can be made available for this purpose, then why not
> an XS/C module?

Yes, I had originally written "(an XS one)" in my "external module"
paragraph above, but I decided to remove it since it seemed kind of
obvious that it would have to be a C module to tweak the internals
that much :)

See my reply to Ben Morrow for some more discussion on unpack(".").
I still think that a module could be useful for older versions of
Perl, and it could be implemented as a no-op for newer ones.

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
If the meanings of 'true' and 'false' were switched, then this sentence 
wouldn't be false.

Attachment: pgpkcGf4U1l0b.pgp
Description: PGP signature

Reply via email to