Ahh, hell, sv_dump changes a lot over versions
[Data-Peek.git] / DDumper.xs
blob81bf49ac1c66581bcf13d2986e6d7347b2accb8a
1 /*  Copyright (c) 2007-2008 H.Merijn Brand.  All rights reserved.
2  *  This program is free software; you can redistribute it and/or
3  *  modify it under the same terms as Perl itself.
4  */
6 #include <EXTERN.h>
7 #include <perl.h>
8 #include <XSUB.h>
9 #include "ppport.h"
11 SV *_DDump (SV *sv)
13     int   err[3], n;
14     char  buf[128];
15     SV   *dd;
16     dTHX;
18     if (pipe (err)) return (NULL);
20     dd = sv_newmortal ();
21     err[2] = dup (2);
22     close (2);
23     if (dup (err[1]) == 2)
24         Perl_sv_dump (aTHX_ sv);
25     close (err[1]);
26     close (2);
27     err[1] = dup (err[2]);
28     close (err[2]);
30     Perl_sv_setpvn (aTHX_ dd, "", 0);
31     while ((n = read (err[0], buf, 128)) > 0)
32 #if PERL_VERSION >= 8
33         /* perl 5.8.0 did not export Perl_sv_catpvn */
34         Perl_sv_catpvn_flags (aTHX_ dd, buf, n, SV_GMAGIC);
35 #else
36         Perl_sv_catpvn       (aTHX_ dd, buf, n);
37 #endif
38     return (dd);
39     } /* _DDump */
41 MODULE = DDumper                PACKAGE = DDumper
43 PROTOTYPES: DISABLE
45 void
46 DPeek (sv)
47     SV   *sv
49   PPCODE:
50     ST (0) = newSVpv (Perl_sv_peek (aTHX_ sv), 0);
51     XSRETURN (1);
52     /* XS DPeek */
54 void
55 DDump_XS (sv)
56     SV   *sv
58   PPCODE:
59     SV   *dd = _DDump (sv);
61     if (dd) {
62         ST (0) = dd;
63         XSRETURN (1);
64         }
66     XSRETURN (0);
67     /* XS DDump */
69 #if PERL_VERSION >= 8
71 void
72 DDump_IO (io, sv, level)
73     PerlIO *io
74     SV     *sv
75     IV      level
77   PPCODE:
78     Perl_do_sv_dump (aTHX_ 0, io, sv, 1, level, 1, 0);
79     XSRETURN (1);
80     /* XS DDump */
82 #endif