#include <stdio.h>
#include <string.h>
+#ifndef LISP_FEATURE_WIN32
#include <libgen.h>
+#endif
#include <sys/types.h>
+#ifndef LISP_FEATURE_WIN32
#include <sys/wait.h>
+#endif
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <signal.h>
+#ifndef LISP_FEATURE_WIN32
#include <sched.h>
+#endif
#include <errno.h>
#include <locale.h>
{
void* result = malloc(size);
if (0 == result) {
- lose("malloc failure");
+ lose("malloc failure\n");
} else {
return result;
}
int
main(int argc, char *argv[], char *envp[])
{
+#ifdef LISP_FEATURE_WIN32
+ /* Exception handling support structure. Evil Win32 hack. */
+ struct lisp_exception_frame exception_frame;
+#endif
+
/* the name of the core file we're to execute. Note that this is
* a malloc'ed string which should be freed eventually. */
char *core = 0;
lispobj initial_function;
+ interrupt_init();
+ block_blockable_signals();
+
setlocale(LC_ALL, "");
/* KLUDGE: os_vm_page_size is set by os_init(), and on some
* systems (e.g. Alpha) arch_init() needs need os_vm_page_size, so
* it must follow os_init(). -- WHN 2000-01-26 */
- os_init();
+ os_init(argv, envp);
arch_init();
gc_init();
validate();
++argi;
} else if (0 == strcmp(arg, "--core")) {
if (core) {
- lose("more than one core file specified");
+ lose("more than one core file specified\n");
} else {
++argi;
if (argi >= argc) {
- lose("missing filename for --core argument");
+ lose("missing filename for --core argument\n");
}
core = copied_string(argv[argi]);
++argi;
* error. */
if (!end_runtime_options &&
0 == strcmp(arg, "--end-runtime-options")) {
- lose("bad runtime option \"%s\"", argi0);
+ lose("bad runtime option \"%s\"\n", argi0);
}
sbcl_argv[argj++] = arg;
}
core = copied_existing_filename_or_null(lookhere);
free(lookhere);
if (!core) {
- lose("can't find core file");
+ lose("can't find core file\n");
}
}
/* Make sure that SBCL_HOME is set, no matter where the core was
char *envstring, *copied_core, *dir;
char *stem = "SBCL_HOME=";
copied_core = copied_string(core);
+#ifndef LISP_FEATURE_WIN32
dir = dirname(copied_core);
+#else /* LISP_FEATURE_WIN32 */
+ dir = "";
+#endif
envstring = (char *) calloc(strlen(stem) +
strlen(dir) +
1,
initial_function = load_core_file(core);
if (initial_function == NIL) {
- lose("couldn't find initial function");
+ lose("couldn't find initial function\n");
}
SHOW("freeing core");
free(core);
gc_initialize_pointers();
- interrupt_init();
arch_install_interrupt_handlers();
+#ifndef LISP_FEATURE_WIN32
os_install_interrupt_handlers();
+#else
+/* wos_install_interrupt_handlers(handler); */
+ wos_install_interrupt_handlers(&exception_frame);
+#endif
/* Convert remaining argv values to something that Lisp can grok. */
SHOW("setting POSIX-ARGV symbol value");
SetSymbolValue(POSIX_ARGV, alloc_base_string_list(sbcl_argv),0);
free(sbcl_argv);
- /* Install a handler to pick off SIGINT until the Lisp system gets
- * far enough along to install its own handler. */
- sigint_init();
-
- FSHOW((stderr, "/funcalling initial_function=0x%lx\n", initial_function));
+ FSHOW((stderr, "/funcalling initial_function=0x%lx\n",
+ (unsigned long)initial_function));
+#ifdef LISP_FEATURE_WIN32
+ fprintf(stderr, "\n\
+This is experimental prerelease support for the Windows platform: use\n\
+at your own risk. \"Your Kitten of Death awaits!\"\n");
+ fflush(stdout);
+ fflush(stderr);
+#endif
create_initial_thread(initial_function);
- lose("CATS. CATS ARE NICE.");
+ lose("CATS. CATS ARE NICE.\n");
return 0;
}
-