X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FSub-Op.git;a=blobdiff_plain;f=Op.xs;h=16b9f465f404264958d632c84c23b028564856a6;hp=d6dc30c3a9ebda75a9d9218b904bc1c2e58c89ec;hb=32384f24279ef75bc0b95279c093cf90d8c47195;hpb=984cdc340cbc0920a576e89f27fe9ea3ea50feba diff --git a/Op.xs b/Op.xs index d6dc30c..16b9f46 100644 --- a/Op.xs +++ b/Op.xs @@ -114,11 +114,13 @@ typedef struct { #include "sub_op.h" void sub_op_init(sub_op_config_t *c) { - c->name = NULL; - c->namelen = 0; - c->pp = 0; - c->check = 0; - c->ud = NULL; + c->name = NULL; + c->namelen = 0; + c->proto = NULL; + c->protolen = 0; + c->pp = 0; + c->check = 0; + c->ud = NULL; return; } @@ -159,6 +161,15 @@ sub_op_config_t *sub_op_dup(pTHX_ const sub_op_config_t *orig) { } dupe->namelen = len; + len = orig->protolen; + if (orig->proto) { + dupe->proto = PerlMemShared_malloc(len + 1); + Copy(orig->proto, dupe->proto, len, char); + ((char *) dupe->proto)[len] = '\0'; + } else { + dupe->proto = NULL; + } + dupe->protolen = len; dupe->pp = orig->pp; dupe->check = orig->check; @@ -425,3 +436,20 @@ PPCODE: XSRETURN_UNDEF; ST(0) = sv_2mortal(newSVuv(CvCONST(sv))); XSRETURN(1); + +SV * +_get_prototype(SV *name) +PROTOTYPE: $ +PREINIT: + HE *he; + const sub_op_config_t *c; +PPCODE: + dMY_CXT; + he = hv_fetch_ent(MY_CXT.map, name, 0, 0); + if (!he) + XSRETURN_UNDEF; + c = INT2PTR(const sub_op_config_t *, SvIVX(HeVAL(he))); + if (!c->proto) + XSRETURN_UNDEF; + ST(0) = sv_2mortal(newSVpvn(c->proto, c->protolen)); + XSRETURN(1);