* 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>
* 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
# 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)