* 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
This commit is contained in:
nobu 2010-11-09 12:57:53 +00:00
Родитель 6f4bfdc115
Коммит 5ddcc93a3f
2 изменённых файлов: 30 добавлений и 22 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Tue Nov 9 21:57:45 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* dln.c (init_funcname): allocate and build initialization
funciton name at once.
Tue Nov 9 21:14:54 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> Tue Nov 9 21:14:54 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (AC_FUNC_GETPGRP, AC_FUNC_SETPGRP): no need when * configure.in (AC_FUNC_GETPGRP, AC_FUNC_SETPGRP): no need when

47
dln.c
Просмотреть файл

@ -107,43 +107,46 @@ dln_loaderror(const char *format, ...)
#ifndef FUNCNAME_PATTERN #ifndef FUNCNAME_PATTERN
# if defined(__hp9000s300) || ((defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)) && !defined(__ELF__)) || defined(__BORLANDC__) || defined(NeXT) || defined(__WATCOMC__) || defined(MACOSX_DYLD) # 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 # else
# define FUNCNAME_PATTERN "Init_%s" # define FUNCNAME_PREFIX "Init_"
# endif # endif
#endif #endif
#if defined __CYGWIN__ || defined DOSISH
#define isdirsep(x) ((x) == '/' || (x) == '\\')
#else
#define isdirsep(x) ((x) == '/')
#endif
static size_t static size_t
init_funcname_len(char **buf, const char *file) init_funcname_len(const char **file)
{ {
char *p; const char *p = *file, *base, *dot = NULL;
const char *slash;
size_t len;
/* Load the file as an object one */ /* Load the file as an object one */
for (slash = file-1; *file; file++) /* Find position of last '/' */ for (base = p; *p; p++) { /* Find position of last '/' */
if (*file == '/') slash = file; if (*p == '.') dot = p;
if (isdirsep(*p)) base = p+1;
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;
}
} }
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 {\ #define init_funcname(buf, file) do {\
size_t len = init_funcname_len(buf, file);\ const char *base = file;\
char *tmp = ALLOCA_N(char, len+1);\ 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) {\ if (!tmp) {\
free(*buf);\
dln_memerror();\ dln_memerror();\
}\ }\
strlcpy(tmp, *buf, len + 1);\ memcpy(tmp, funcname_prefix, plen);\
free(*buf);\ memcpy(tmp+plen, base, flen);\
tmp[plen+flen] = '\0';\
*buf = tmp;\ *buf = tmp;\
} while (0) } while (0)