From: Vincent Pit Date: Fri, 23 Apr 2010 21:46:39 +0000 (+0200) Subject: Factor the string duplication logic into a new so_strndup X-Git-Url: http://git.vpit.fr/?a=commitdiff_plain;h=95275fe70b3a1b3a6ea0d76676dbb55afe8b8b73;p=perl%2Fmodules%2FSub-Op.git Factor the string duplication logic into a new so_strndup --- 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;