X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FSub-Op.git;a=blobdiff_plain;f=Op.xs;fp=Op.xs;h=b5417de40a3b002e426f8a82019f17dcad661909;hp=91f07cc2aeec34ed2a457e38e506e9b813fc442f;hb=95275fe70b3a1b3a6ea0d76676dbb55afe8b8b73;hpb=45db99eaea3d62c21f1f9ca9503b671a4040af6f diff --git a/Op.xs b/Op.xs index 91f07cc..b5417de 100644 --- a/Op.xs +++ b/Op.xs @@ -115,29 +115,28 @@ void sub_op_register(pTHX_ const sub_op_config_t *c, U32 flags) { (void) hv_store(MY_CXT.map, c->name, c->namelen, newSViv(PTR2IV(c)), 0); } +STATIC const char *so_strndup(pTHX_ const char *s, STRLEN len) { +#define so_strndup(S, L) so_strndup(aTHX_ (S), (L)) + const char *d; + + if (!s) + return NULL; + + d = PerlMemShared_malloc(len + 1); + Copy(s, d, len, char); + ((char *) d)[len] = '\0'; + + return d; +} + sub_op_config_t *sub_op_dup(pTHX_ const sub_op_config_t *orig) { - STRLEN len; sub_op_config_t *dupe = PerlMemShared_malloc(sizeof *dupe); - len = orig->namelen; - if (orig->name) { - dupe->name = PerlMemShared_malloc(len + 1); - Copy(orig->name, dupe->name, len, char); - ((char *) dupe->name)[len] = '\0'; - } else { - dupe->name = NULL; - } - 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->name = so_strndup(orig->name, orig->namelen); + dupe->namelen = orig->namelen; + + dupe->proto = so_strndup(orig->proto, orig->protolen); + dupe->protolen = orig->protolen; dupe->call = orig->call; dupe->ref = orig->ref;