*/
#include <stdio.h>
+#include <string.h>
+#include <libgen.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/stat.h>
+#if defined(SVR4) || defined(__linux__)
+#include <time.h>
+#endif
+
#include "signal.h"
#include "runtime.h"
#include "interr.h"
#include "monitor.h"
#include "validate.h"
-#if defined GENCGC
-#include "gencgc.h"
-#endif
#include "core.h"
#include "save.h"
#include "lispregs.h"
+#include "genesis/static-symbols.h"
+#include "genesis/symbol.h"
+
+
#ifdef irix
#include <string.h>
#include "interr.h"
}
}
\f
+/* miscellaneous chattiness */
+
+void
+print_help()
+{
+ puts(
+"SBCL is a Common Lisp programming environment. Ordinarily you shouldn't\n\
+need command line options when you invoke it interactively: you can just\n\
+start it and work with the customary Lisp READ-EVAL-PRINT loop.\n\
+\n\
+One option idiom which is sometimes useful interactively (e.g. when\n\
+exercising a test case for a bug report) is\n\
+ sbcl --sysinit /dev/null --userinit /dev/null\n\
+to keep SBCL from reading any initialization files at startup. And some\n\
+people like to suppress the default startup message:\n\
+ sbcl --noinform\n\
+\n\
+Other options can be useful when you're running SBCL noninteractively,\n\
+e.g. from a script, or if you have a strange system configuration, so\n\
+that SBCL can't by default find one of the files it needs. For\n\
+information on such options, see the sbcl(1) man page.\n\
+\n\
+More information on SBCL can be found on its man page, or at\n\
+<http://sbcl.sf.net/>.\n");
+}
+
+void
+print_version()
+{
+ printf("SBCL %s\n", SBCL_VERSION_STRING);
+}
+
+void
+print_banner()
+{
+ printf(
+"This is SBCL %s, an implementation of ANSI Common Lisp.\n\
+\n\
+SBCL is derived from the CMU CL system created at Carnegie Mellon University.\n\
+Besides software and documentation originally created at Carnegie Mellon\n\
+University, SBCL contains some software originally from the Massachusetts\n\
+Institute of Technology, Symbolics Incorporated, and Xerox Corporation, and\n\
+material contributed by volunteers since the release of CMU CL into the\n\
+public domain. See the CREDITS file in the distribution for more information.\n\
+\n\
+SBCL is a free software system, provided as is, with absolutely no warranty.\n\
+It is mostly in the public domain, but also includes some software copyrighted\n\
+ Massachusetts Institute of Technology, 1986;\n\
+ Symbolics, Inc., 1989, 1990, 1991, 1992; and\n\
+ Xerox Corporation, 1985, 1986, 1987, 1988, 1989, 1990\n\
+used under BSD-style licenses allowing copying only under certain conditions.\n\
+See the COPYING file in the distribution for more information.\n\
+\n\
+More information about SBCL is available at <http://sbcl.sourceforge.net/>.\n\
+", SBCL_VERSION_STRING);
+}
+\f
int
main(int argc, char *argv[], char *envp[])
{
lose("more than one core file specified");
} else {
++argi;
- core = copied_string(argv[argi]);
if (argi >= argc) {
lose("missing filename for --core argument");
}
+ core = copied_string(argv[argi]);
++argi;
}
+ } else if (0 == strcmp(arg, "--help")) {
+ /* I think this is the (or a) usual convention: upon
+ * seeing "--help" we immediately print our help
+ * string and exit, ignoring everything else. */
+ print_help();
+ exit(0);
+ } else if (0 == strcmp(arg, "--version")) {
+ /* As in "--help" case, I think this is expected. */
+ print_version();
+ exit(0);
} else if (0 == strcmp(arg, "--end-runtime-options")) {
end_runtime_options = 1;
++argi;
char *sbcl_home = getenv("SBCL_HOME");
if (sbcl_home) {
char *lookhere;
- lookhere = (char *) calloc(strlen("/sbcl.core") + strlen(sbcl_home) + 1,
- sizeof(char));
- sprintf(lookhere, "%s/sbcl.core", sbcl_home);
+ char *stem = "/sbcl.core";
+ lookhere = (char *) calloc(strlen(sbcl_home) +
+ strlen(stem) +
+ 1,
+ sizeof(char));
+ sprintf(lookhere, "%s%s", sbcl_home, stem);
core = copied_existing_filename_or_null(lookhere);
free(lookhere);
} else {
- core = copied_existing_filename_or_null("/usr/lib/sbcl.core");
+ putenv("SBCL_HOME=/usr/local/lib/sbcl/");
+ core = copied_existing_filename_or_null("/usr/local/lib/sbcl/sbcl.core");
if (!core) {
- core = copied_existing_filename_or_null("/usr/local/lib/sbcl.core");
+ putenv("SBCL_HOME=/usr/lib/sbcl/");
+ core =
+ copied_existing_filename_or_null("/usr/lib/sbcl/sbcl.core");
}
}
if (!core) {
lose("can't find core file");
}
+ } else {
+ /* If a core was specified and SBCL_HOME is unset, set it */
+ char *sbcl_home = getenv("SBCL_HOME");
+ if (!sbcl_home) {
+ char *envstring, *copied_core, *dir;
+ char *stem = "SBCL_HOME=";
+ copied_core = copied_string(core);
+ dir = dirname(copied_core);
+ envstring = (char *) calloc(strlen(stem) +
+ strlen(dir) +
+ 1,
+ sizeof(char));
+ sprintf(envstring, "%s%s", stem, dir);
+ putenv(envstring);
+ free(copied_core);
+ }
}
if (!noinform) {
- printf(
-"This is SBCL " SBCL_VERSION_STRING ", an implementation of ANSI Common Lisp.
-
-SBCL is derived from the CMU CL system created at Carnegie Mellon University.
-Besides software and documentation originally created at Carnegie Mellon
-University, SBCL contains some software originally from the Massachusetts
-Institute of Technology, Symbolics Incorporated, and Xerox Corporation, and
-material contributed by volunteers since the release of CMU CL into the
-public domain. See the CREDITS file in the distribution for more information.
-
-SBCL is a free software system, provided as is, with absolutely no warranty.
-It is mostly in the public domain, but also includes some software copyrighted
- Massachusetts Institute of Technology, 1986;
- Symbolics, Inc., 1989, 1990, 1991, 1992; and
- Xerox Corporation, 1985, 1986, 1987, 1988, 1989, 1990
-used under BSD-style licenses allowing copying only under certain conditions.
-See the COPYING file in the distribution for more information.
-
-More information on SBCL is available at <http://sbcl.sourceforge.net/>.
-");
+ print_banner();
fflush(stdout);
}
set_lossage_handler(monitor_or_something);
-#if 0
- os_init();
- gc_init();
- validate();
-#endif
globals_init();
initial_function = load_core_file(core);
SHOW("freeing core");
free(core);
-#if defined GENCGC
- gencgc_pickup_dynamic();
-#else
-#endif
+ gc_initialize_pointers();
#ifdef BINDING_STACK_POINTER
SetSymbolValue(BINDING_STACK_POINTER, BINDING_STACK_START);
#endif
-#if defined INTERNAL_GC_TRIGGER && !defined __i386__
- SetSymbolValue(INTERNAL_GC_TRIGGER, make_fixnum(-1));
-#endif
interrupt_init();