PREOP => "pod2text $file > \$(DISTVNAME)/README",
COMPRESS => 'gzip -9f', SUFFIX => 'gz'
},
- FUNCLIST => [ qw/sub_op_register boot_Sub__Op/ ],
+ FUNCLIST => [ qw[
+ boot_Sub__Op
+ sub_op_init
+ sub_op_register
+ sub_op_dup
+ sub_op_free
+ ] ],
%ed_vars,
);
#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;
+
+ return;
+}
+
void sub_op_register(pTHX_ const sub_op_config_t *c) {
SV *key = newSViv(PTR2IV(c->pp));
}
}
+sub_op_config_t *sub_op_dup(pTHX_ const sub_op_config_t *orig) {
+ sub_op_config_t *dupe = PerlMemShared_malloc(sizeof *dupe);
+
+ dupe->namelen = orig->namelen;
+ dupe->name = PerlMemShared_malloc(dupe->namelen);
+ Copy(orig->name, dupe->name, dupe->namelen, char);
+
+ dupe->pp = orig->pp;
+ dupe->check = orig->check;
+ dupe->ud = orig->ud;
+
+ return dupe;
+}
+
+void sub_op_free(pTHX_ sub_op_config_t *c) {
+ PerlMemShared_free((char *) c->name);
+ PerlMemShared_free(c);
+
+ return;
+}
+
/* --- Private helpers ----------------------------------------------------- */
STATIC IV so_hint(pTHX) {
BOOT:
{
sub_op_config_t c;
+ sub_op_init(&c);
c.name = "reftype";
c.namelen = sizeof("reftype")-1;
c.pp = scalar_util_reftype;
=back
+=head2 C<void sub_op_init(sub_op_config_t *c)>
+
+Initializes the fields of the C<sub_op_config_t> object.
+For future compatibility, it is required to call this function with your config object before storing your actual values.
+It will store safe defaults for members you won't set.
+
=head2 C<void sub_op_register(pTHX_ const sub_op_config_t *c)>
Registers a name and its configuration into L<Sub::Op>.
The caller is responsible for allocating and freeing the C<sub_op_config_t> object.
No pointer to it or to its members is kept.
+=head2 C<sub_op_config_t *sub_op_dup(pTHX_ const sub_op_config_t *orig)>
+
+Deeply clones the specified C<sub_op_config_t> object.
+
+=head2 C<void sub_op_free(pTHX_ sub_op_config_t *c)>
+
+Free the memory associated with the specified C<sub_op_config_t> object.
+
=head1 PERL API
=head2 C<enable $name, [ $pkg ]>
void *ud;
} sub_op_config_t;
-void sub_op_register(pTHX_ const sub_op_config_t *c);
+void sub_op_init (sub_op_config_t *c);
+void sub_op_register(pTHX_ const sub_op_config_t *c);
+sub_op_config_t *sub_op_dup (pTHX_ const sub_op_config_t *c);
+void sub_op_free (pTHX_ sub_op_config_t *c);
#endif /* SUB_OP_H */
if (SvROK(cb)) {
cb = SvRV(cb);
if (SvTYPE(cb) >= SVt_PVCV) {
+ sub_op_init(&c);
c.name = SvPV_const(name, c.namelen);
c.check = sols_check;
c.ud = SvREFCNT_inc(cb);