From 5ddcc93a3f9ffaeed5a78aa0fa7a847880102600 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 9 Nov 2010 12:57:53 +0000 Subject: * dln.c (init_funcname): allocate and build initialization funciton name at once. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29737 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- dln.c | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) (limited to 'dln.c') diff --git a/dln.c b/dln.c index 4e7addd7cb..aa9f029ec9 100644 --- a/dln.c +++ b/dln.c @@ -107,43 +107,46 @@ dln_loaderror(const char *format, ...) #ifndef FUNCNAME_PATTERN # if defined(__hp9000s300) || ((defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)) && !defined(__ELF__)) || defined(__BORLANDC__) || defined(NeXT) || defined(__WATCOMC__) || defined(MACOSX_DYLD) -# define FUNCNAME_PATTERN "_Init_%s" +# define FUNCNAME_PREFIX "_Init_" # else -# define FUNCNAME_PATTERN "Init_%s" +# define FUNCNAME_PREFIX "Init_" # endif #endif +#if defined __CYGWIN__ || defined DOSISH +#define isdirsep(x) ((x) == '/' || (x) == '\\') +#else +#define isdirsep(x) ((x) == '/') +#endif + static size_t -init_funcname_len(char **buf, const char *file) +init_funcname_len(const char **file) { - char *p; - const char *slash; - size_t len; + const char *p = *file, *base, *dot = NULL; /* Load the file as an object one */ - for (slash = file-1; *file; file++) /* Find position of last '/' */ - if (*file == '/') slash = file; - - len = strlen(FUNCNAME_PATTERN) + strlen(slash + 1); - *buf = xmalloc(len); - snprintf(*buf, len, FUNCNAME_PATTERN, slash + 1); - for (p = *buf; *p; p++) { /* Delete suffix if it exists */ - if (*p == '.') { - *p = '\0'; break; - } + for (base = p; *p; p++) { /* Find position of last '/' */ + if (*p == '.') dot = p; + if (isdirsep(*p)) base = p+1; } - return p - *buf; + *file = base; + /* Delete suffix if it exists */ + return (dot && dot > base ? dot : p) - base; } +static const char funcname_prefix[sizeof(FUNCNAME_PREFIX) - 1] = FUNCNAME_PREFIX; + #define init_funcname(buf, file) do {\ - size_t len = init_funcname_len(buf, file);\ - char *tmp = ALLOCA_N(char, len+1);\ + const char *base = file;\ + const size_t flen = init_funcname_len(&base);\ + const size_t plen = sizeof(funcname_prefix);\ + char *const tmp = ALLOCA_N(char, plen+flen+1);\ if (!tmp) {\ - free(*buf);\ dln_memerror();\ }\ - strlcpy(tmp, *buf, len + 1);\ - free(*buf);\ + memcpy(tmp, funcname_prefix, plen);\ + memcpy(tmp+plen, base, flen);\ + tmp[plen+flen] = '\0';\ *buf = tmp;\ } while (0) -- cgit v1.2.3