#endif
#include <errno.h>
#include <locale.h>
+#include <limits.h>
#if defined(SVR4) || defined(__linux__)
#include <time.h>
#endif
#ifndef SBCL_HOME
-#define SBCL_HOME "/usr/local/lib/sbcl/"
+#define SBCL_HOME SBCL_PREFIX"/lib/sbcl/"
#endif
#ifdef LISP_FEATURE_HPUX
--userinit <filename> Per-user init-file to use instead of default.\n\
--no-sysinit Inhibit processing of any system-wide init-file.\n\
--no-userinit Inhibit processing of any per-user init-file.\n\
+ --disable-debugger Invoke sb-ext:disable-debugger.\n\
+ --noprint Run a Read-Eval Loop without printing results.\n\
+ --script [<filename>] Skip #! line, disable debugger, avoid verbosity.\n\
+ --quit Exit with code 0 after option processing.\n\
+ --non-interactive Sets both --quit and --disable-debugger.\n\
+Common toplevel options that are processed in order:\n\
+ --eval <form> Form to eval when processing this option.\n\
+ --load <filename> File to load when processing this option.\n\
\n\
User options are not processed by SBCL. All runtime options must\n\
appear before toplevel options, and all toplevel options must\n\
core = (runtime_path ? runtime_path :
copied_string(saved_runtime_path));
} else {
- free(runtime_path);
+ if (runtime_path)
+ free(runtime_path);
}
}
++argi;
if (argi >= argc)
lose("missing argument for --dynamic-space-size");
- errno = 0;
- dynamic_space_size = strtol(argv[argi++], 0, 0) << 20;
- if (errno)
- lose("argument to --dynamic-space-size is not a number");
+ {
+ char *tail;
+ long tmp = strtol(argv[argi++], &tail, 0);
+ if (tail[0])
+ lose("--dynamic-space-size argument is not a number");
+ if ((tmp <= 0) ||
+ (tmp >= (LONG_MAX >> 20))) {
+ lose("--dynamic-space-size argument is out of range");
+ }
+ dynamic_space_size = tmp << 20;
+ }
# ifdef MAX_DYNAMIC_SPACE_END
if (!((DYNAMIC_SPACE_START <
DYNAMIC_SPACE_START+dynamic_space_size) &&
(DYNAMIC_SPACE_START+dynamic_space_size <=
MAX_DYNAMIC_SPACE_END)))
- lose("specified --dynamic-space-size too large");
+ lose("--dynamic-space-size argument is too large");
# endif
} else if (0 == strcmp(arg, "--control-stack-size")) {
++argi;
end_runtime_options = 1;
++argi;
break;
+ } else if (0 == strcmp(arg, "--merge-core-pages")) {
+ ++argi;
+ merge_core_pages = 1;
+ } else if (0 == strcmp(arg, "--no-merge-core-pages")) {
+ ++argi;
+ merge_core_pages = 0;
+ } else if (0 == strcmp(arg, "--default-merge-core-pages")) {
+ ++argi;
+ merge_core_pages = -1;
} else {
/* This option was unrecognized as a runtime option,
* so it must be a toplevel option or a user option,
/* Align down to multiple of page_table page size, and to the appropriate
* stack alignment. */
dynamic_space_size &= ~(PAGE_BYTES-1);
+#ifdef LISP_FEATURE_GENCGC
+ dynamic_space_size &= ~(GENCGC_CARD_BYTES-1);
+#endif
thread_control_stack_size &= ~(CONTROL_STACK_ALIGNMENT_BYTES-1);
/* Preserve the runtime options for possible future core saving */
fflush(stdout);
}
+ if (embedded_core_offset == 0) {
+ /* Here we make a last attempt at recognizing an embedded core,
+ * so that a file with an embedded core is a valid argument to
+ * --core. We take care that any decisions on special behaviour
+ * (suppressed banner, embedded options) have already been made
+ * before we reach this block, so that there is no observable
+ * difference between "embedded" and "bare" images given to
+ * --core. */
+ os_vm_offset_t offset = search_for_embedded_core(core);
+ if (offset != -1)
+ embedded_core_offset = offset;
+ }
+
#if defined(SVR4) || defined(__linux__) || defined(__NetBSD__)
tzset();
#endif