#include "compiler.h" /* There must be a function to do this already? */ void amd_require(const char *package) { char buf[512]; char *rp; char *wp; SV *sv; /* Leave space for ".pm" */ strncpy(buf, package, 509); buf[509] = '\0'; rp = buf; wp = buf; while (*rp) { if (*rp == ':' && *(rp + 1) == ':') { *wp++ = '/'; rp++; if (!*rp) break; rp++; } else { *wp++ = *rp++; } } *wp = '\0'; strcat(buf, ".pm"); require_pv(buf); sv = get_sv("@", FALSE); if (SvTRUE(sv)) { croak("Compilation failed in amd_require(%s):\n%s", package, SvPV_nolen(sv)); } } void amd_dump(const char *prefix, SV *sv) { dSP; int count; amd_require("Data::Dumper"); ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv); PUTBACK; count = call_pv("Data::Dumper::Dumper", G_SCALAR); SPAGAIN; if (count != 1) croak("Didn't get a return value from Dumper\n"); printf("%s: %s\n", prefix, POPp); fflush(stdout); PUTBACK; FREETMPS; LEAVE; } void amd_peek(const char *prefix, SV *sv) { dSP; int count; amd_require("Devel::Peek"); printf("Peeking at %s\n", prefix); fflush(stdout); ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs(sv); PUTBACK; count = call_pv("Devel::Peek::Dump", G_DISCARD); FREETMPS; LEAVE; }