X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fruntime.c;h=cacc9c78760ea91a48948ab826baeb1900d9dd33;hb=092fae0666f1472c919b8ecf1a011d3869c0c6a5;hp=24782399f65943d12ab816a88cc3deabd4fbfea5;hpb=1b6d885eaf7872b41947e0ea0da134cceee4cc0f;p=sbcl.git diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 2478239..cacc9c7 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -95,7 +95,7 @@ void sigint_init(void) { SHOW("entering sigint_init()"); - install_handler(SIGINT, sigint_handler); + install_handler(SIGINT, sigint_handler, 1); SHOW("leaving sigint_init()"); } @@ -287,6 +287,18 @@ search_for_executable(const char *argv0) return search; } } + /* The above for-loop fails to process the last part of PATH if PATH does + * not end with ':'. We may consider appending an extra ':' to the end of + * SEARCH. -- houjingyi 2013-05-24 */ + if (start != NULL && *start != '\0') { + snprintf(buf, PATH_MAX + 1, "%s/%s", start, argv0); + if (access(buf, F_OK) == 0) { + free(search); + search = copied_realpath(buf); + free(buf); + return search; + } + } free(search); free(buf); @@ -294,10 +306,11 @@ search_for_executable(const char *argv0) } #endif /* LISP_FEATURE_WIN32 */ -unsigned long parse_size_arg(char *arg, char *arg_name) +size_t +parse_size_arg(char *arg, char *arg_name) { char *tail, *power_name; - unsigned long power, res; + size_t power, res; res = strtoul(arg, &tail, 0); @@ -329,7 +342,7 @@ unsigned long parse_size_arg(char *arg, char *arg_name) free(power_name); } if ((res <= 0) || - (res > (ULONG_MAX >> power))) { + (res >= (SIZE_MAX >> power))) { lose("%s argument is out of range: %s", arg_name, arg); } res <<= power; @@ -346,6 +359,50 @@ char *saved_runtime_path = NULL; void pthreads_win32_init(); #endif +void print_locale_variable(const char *name) +{ + char *value = getenv(name); + + if (value) { + fprintf(stderr, "\n %s=%s", name, value); + } +} + +void setup_locale() +{ + if(setlocale(LC_ALL, "") == NULL) { +#ifndef LISP_FEATURE_WIN32 + + fprintf(stderr, "WARNING: Setting locale failed.\n"); + fprintf(stderr, " Check the following variables for correct values:"); + + if (setlocale(LC_CTYPE, "") == NULL) { + print_locale_variable("LC_ALL"); + print_locale_variable("LC_CTYPE"); + print_locale_variable("LANG"); + } + + if (setlocale(LC_MESSAGES, "") == NULL) { + print_locale_variable("LC_MESSAGES"); + } + if (setlocale(LC_COLLATE, "") == NULL) { + print_locale_variable("LC_COLLATE"); + } + if (setlocale(LC_MONETARY, "") == NULL) { + print_locale_variable("LC_MONETARY"); + } + if (setlocale(LC_NUMERIC, "") == NULL) { + print_locale_variable("LC_NUMERIC"); + } + if (setlocale(LC_TIME, "") == NULL) { + print_locale_variable("LC_TIME"); + } + fprintf(stderr, "\n"); + +#endif + } +} + int main(int argc, char *argv[], char *envp[]) @@ -378,8 +435,6 @@ main(int argc, char *argv[], char *envp[]) interrupt_init(); block_blockable_signals(0, 0); - setlocale(LC_ALL, ""); - runtime_options = NULL; /* Save the argv[0] derived runtime path in case @@ -560,6 +615,8 @@ main(int argc, char *argv[], char *envp[]) gc_init(); validate(); + setup_locale(); + /* If no core file was specified, look for one. */ if (!core) { core = search_for_core();