diff options
Diffstat (limited to 'byterun/main.c')
-rw-r--r-- | byterun/main.c | 234 |
1 files changed, 5 insertions, 229 deletions
diff --git a/byterun/main.c b/byterun/main.c index 9337a9b46..6538049d4 100644 --- a/byterun/main.c +++ b/byterun/main.c @@ -11,240 +11,16 @@ /* $Id$ */ -/* Start-up code */ +/* Main entry point (can be overriden by a user-provided main() + function that calls caml_main() later). */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include "config.h" -#ifdef HAS_UNISTD -#include <unistd.h> -#endif -#include "alloc.h" -#include "exec.h" -#include "fail.h" -#include "fix_code.h" -#include "gc_ctrl.h" -#include "interp.h" -#include "intext.h" -#include "io.h" -#include "minor_gc.h" #include "misc.h" -#include "mlvalues.h" -#include "stacks.h" -#include "sys.h" -#ifndef O_BINARY -#define O_BINARY 0 -#endif +extern int caml_main P((int, char **)); -header_t atom_table[256]; -code_t start_code; -asize_t code_size; - -static void init_atoms() -{ - int i; - for(i = 0; i < 256; i++) atom_table[i] = Make_header(0, i, White); -} - -static unsigned long read_size(p) - unsigned char * p; -{ - return ((unsigned long) p[0] << 24) + ((unsigned long) p[1] << 16) + - ((unsigned long) p[2] << 8) + p[3]; -} - -#define FILE_NOT_FOUND (-1) -#define TRUNCATED_FILE (-2) -#define BAD_MAGIC_NUM (-3) - -static int read_trailer(fd, trail) - int fd; - struct exec_trailer * trail; -{ - char buffer[TRAILER_SIZE]; - - lseek(fd, (long) -TRAILER_SIZE, 2); - if (read(fd, buffer, TRAILER_SIZE) < TRAILER_SIZE) return TRUNCATED_FILE; - trail->code_size = read_size(buffer); - trail->data_size = read_size(buffer+4); - trail->symbol_size = read_size(buffer+8); - trail->debug_size = read_size(buffer+12); - if (strncmp(buffer + 16, EXEC_MAGIC, 12) == 0) - return 0; - else - return BAD_MAGIC_NUM; -} - -int attempt_open(name, trail, do_open_script) - char ** name; - struct exec_trailer * trail; - int do_open_script; -{ - char * truename; - int fd; - int err; - char buf [2]; - - truename = searchpath(*name); - if (truename == 0) truename = *name; else *name = truename; - fd = open(truename, O_RDONLY | O_BINARY); - if (fd == -1) return FILE_NOT_FOUND; - if (!do_open_script){ - err = read (fd, buf, 2); - if (err < 2) { close(fd); return TRUNCATED_FILE; } - if (buf [0] == '#' && buf [1] == '!') { close(fd); return BAD_MAGIC_NUM; } - } - err = read_trailer(fd, trail); - if (err != 0) { close(fd); return err; } - return fd; -} - -/* Invocation of camlrun: 4 cases. - - 1. runtime + bytecode - user types: camlrun [options] bytecode args... - arguments: camlrun [options] bytecode args... - - 2. bytecode script - user types: bytecode args... - 2a (kernel 1) arguments: camlrun ./bytecode args... - 2b (kernel 2) arguments: bytecode bytecode args... - - 3. concatenated runtime and bytecode - user types: composite args... - arguments: composite args... - -Algorithm: - 1- If argument 0 is a valid byte-code file that does not start with #!, - then we are in case 3 and we pass the same command line to the - Caml Light program. - 2- In all other cases, we parse the command line as: - (whatever) [options] bytecode args... - and we strip "(whatever) [options]" from the command line. - -*/ - -extern void init_ieee_floats(); - -#ifdef HAS_UI -int caml_main(argc, argv) -#else int main(argc, argv) -#endif int argc; - char * argv[]; + char ** argv; { - int fd; - struct exec_trailer trail; - int i; - struct longjmp_buffer raise_buf; - struct channel * chan; - int verbose_init = 0, percent_free_init = Percent_free_def; - long minor_heap_init = Minor_heap_def, heap_chunk_init = Heap_chunk_def; - - /* Machine-dependent initialization of the floating-point hardware - so that it behaves as much as possible as specified in IEEE */ - init_ieee_floats(); - - /* Parsing of command-line */ -#ifdef DEBUG - verbose_init = 1; -#endif - - i = 0; - fd = attempt_open(&argv[0], &trail, 0); - - if (fd < 0) { - - for(i = 1; i < argc && argv[i][0] == '-'; i++) { - switch(argv[i][1]) { -#ifdef DEBUG - case 't': { - extern int trace_flag; - trace_flag = 1; - break; - } -#endif - case 'v': - verbose_init = 1; - break; - default: - fatal_error_arg("Unknown option %s.\n", argv[i]); - } - } - - if (argv[i] == 0) - fatal_error("No bytecode file specified.\n"); - - fd = attempt_open(&argv[i], &trail, 1); - - switch(fd) { - case FILE_NOT_FOUND: - fatal_error_arg("Fatal error: cannot find file %s\n", argv[i]); - break; - case TRUNCATED_FILE: - case BAD_MAGIC_NUM: - fatal_error_arg( - "Fatal error: the file %s is not a bytecode executable file\n", - argv[i]); - break; - } - } - - /* Runtime options. The option letter is the first letter of the - last word of the ML name of the option (see [lib/gc.mli]). */ - - { char *opt = getenv ("CAMLRUNPARAM"); - if (opt != NULL){ - while (*opt != '\0'){ - switch (*opt++){ - case 's': sscanf (opt, "=%ld", &minor_heap_init); break; - case 'i': sscanf (opt, "=%ld", &heap_chunk_init); break; - case 'o': sscanf (opt, "=%d", &percent_free_init); break; - case 'v': sscanf (opt, "=%d", &verbose_init); break; - } - } - } - } - - if (sigsetjmp(raise_buf.buf, 1) == 0) { - - external_raise = &raise_buf; - - init_gc (minor_heap_init, heap_chunk_init, percent_free_init, - verbose_init); - init_stack(); - init_atoms(); - - lseek(fd, - (long) (TRAILER_SIZE + trail.code_size + trail.data_size - + trail.symbol_size + trail.debug_size), 2); - - code_size = trail.code_size; - start_code = (code_t) stat_alloc(code_size); - if (read(fd, (char *) start_code, code_size) != code_size) - fatal_error("Fatal error: truncated bytecode file.\n"); - -#ifdef ARCH_BIG_ENDIAN - fixup_endianness(start_code, code_size); -#endif - - chan = open_descr(fd); - global_data = input_value(chan); - close_channel(chan); - /* Ensure that the globals are in the major heap. */ - oldify(global_data, &global_data); - - sys_init(argv + i); - interprete(start_code, code_size); - sys_exit(Val_int(0)); - - } else { - - fatal_error_arg("Fatal error: uncaught exception %s.\n", - String_val(Field(Field(exn_bucket, 0), 0))); - } + return caml_main(argc, argv); } - |