diff --git a/C/c_interface.c b/C/c_interface.c index 6dd4e0e7f..4dd28832a 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -847,13 +847,14 @@ X_API Int YAP_Init(YAP_init_args *yap_init) { int restore_result; - int Trail = 0, Stack = 0, Heap = 0; + CELL Trail = 0, Stack = 0, Heap = 0; BACKUP_MACHINE_REGS(); yap_args = yap_init->Argv; yap_argc = yap_init->Argc; - if (yap_init->SavedState != NULL) { - if (SavedInfo (yap_init->SavedState, &Trail, &Stack, &Heap, yap_init->YapLibDir) != 1) { + if (yap_init->SavedState != NULL || + yap_init->YapPrologBootFile == NULL) { + if (SavedInfo (yap_init->SavedState, yap_init->YapLibDir, &Trail, &Stack, &Heap) != 1) { return(YAP_BOOT_FROM_SAVED_ERROR); } } @@ -889,15 +890,16 @@ YAP_Init(YAP_init_args *yap_init) InitMPE (); #endif - if (yap_init->YapPrologBootFile != NULL) { + if (yap_init->YapPrologRCFile != NULL) { /* This must be done before restore, otherwise restore will print out messages .... */ yap_flags[HALT_AFTER_CONSULT_FLAG] = yap_init->HaltAfterConsult; } - if (yap_init->SavedState != NULL) { - restore_result = Restore(yap_init->SavedState); + if (yap_init->SavedState != NULL || + yap_init->YapPrologBootFile == NULL) { + restore_result = Restore(yap_init->SavedState, yap_init->YapLibDir); } else { restore_result = FAIL_RESTORE; } @@ -927,7 +929,7 @@ YAP_Init(YAP_init_args *yap_init) #endif /* YAPOR || TABLING */ RECOVER_MACHINE_REGS(); - if (yap_init->YapPrologBootFile != NULL) { + if (yap_init->YapPrologRCFile != NULL) { PutValue(FullLookupAtom("$consult_on_boot"), MkAtomTerm(LookupAtom(yap_init->YapPrologBootFile))); /* This must be done again after restore, as yap_flags @@ -935,8 +937,8 @@ YAP_Init(YAP_init_args *yap_init) */ yap_flags[HALT_AFTER_CONSULT_FLAG] = yap_init->HaltAfterConsult; } - if (yap_init->SavedState != NULL) { - + if (yap_init->SavedState != NULL || + yap_init->YapPrologBootFile == NULL) { if (restore_result == FAIL_RESTORE) return(YAP_BOOT_FROM_SAVED_ERROR); if (restore_result == DO_ONLY_CODE) { @@ -959,6 +961,7 @@ YAP_FastInit(char saved_state[]) init_args.TrailSize = 0; init_args.YapLibDir = NULL; init_args.YapPrologBootFile = NULL; + init_args.YapPrologRCFile = NULL; init_args.HaltAfterConsult = FALSE; init_args.FastBoot = FALSE; init_args.NumberWorkers = 1; diff --git a/C/errors.c b/C/errors.c index 10163835b..50e68ec14 100644 --- a/C/errors.c +++ b/C/errors.c @@ -311,18 +311,22 @@ dump_stack(void) } else if (HeapTop > (ADDR)GlobalBase) { fprintf(stderr,"[ YAP ERROR: Code Space Collided against Global ]\n"); } else { - fprintf(stderr," [ Goals with alternatives open:\n"); - while (b_ptr != NULL) { - cl_position(b_ptr->cp_ap); - b_ptr = b_ptr->cp_b; + if (b_ptr != NULL) { + fprintf(stderr," [ Goals with alternatives open:\n"); + while (b_ptr != NULL) { + cl_position(b_ptr->cp_ap); + b_ptr = b_ptr->cp_b; + } + fprintf(stderr," ]\n"); } - fprintf(stderr," ]\n"); - fprintf(stderr," [ Goals left to continue:\n"); - while (env_ptr != NULL) { - cl_position((yamop *)(env_ptr[E_CP])); - env_ptr = (CELL *)(env_ptr[E_E]); + if (env_ptr != NULL) { + fprintf(stderr," [ Goals left to continue:\n"); + while (env_ptr != NULL) { + cl_position((yamop *)(env_ptr[E_CP])); + env_ptr = (CELL *)(env_ptr[E_E]); + } + fprintf(stderr," ]\n"); } - fprintf(stderr," ]\n"); } } @@ -330,7 +334,8 @@ dump_stack(void) static void error_exit_yap (int value) { - dump_stack(); + if (!PrologMode & BootMode) + dump_stack(); exit_yap(value); } @@ -387,7 +392,7 @@ Error (yap_error_number type, Term where, char *format,...) exit(1); } /* must do this here */ - if (type == FATAL_ERROR) { + if (type == FATAL_ERROR || HeapBase == NULL) { va_start (ap, format); /* now build the error string */ if (format != NULL) { diff --git a/C/save.c b/C/save.c index 0f3a84947..8ed621e67 100644 --- a/C/save.c +++ b/C/save.c @@ -54,7 +54,7 @@ static char SccsId[] = "@(#)save.c 1.3 3/15/90"; /********* hack for accesing several kinds of terms. Should be cleaned **/ -extern char StartUpFile[]; +static char StartUpFile[] = "startup"; static char end_msg[256] ="*** End of YAP saved state *****"; @@ -97,7 +97,7 @@ STATIC_PROTO(void save_crc, (void)); STATIC_PROTO(Int do_save, (int)); STATIC_PROTO(Int p_save, (void)); STATIC_PROTO(Int p_save_program, (void)); -STATIC_PROTO(int check_header, (void)); +STATIC_PROTO(int check_header, (CELL *, CELL *, CELL *, CELL *)); STATIC_PROTO(void get_heap_info, (void)); STATIC_PROTO(void get_regs, (int)); STATIC_PROTO(void get_insts, (OPCODE [])); @@ -121,7 +121,7 @@ STATIC_PROTO(void restore_heap, (void)); STATIC_PROTO(void ShowAtoms, (void)); STATIC_PROTO(void ShowEntries, (PropEntry *)); #endif -STATIC_PROTO(int OpenRestore, (char *)); +STATIC_PROTO(int OpenRestore, (char *, char *, CELL *, CELL *, CELL *, CELL *)); STATIC_PROTO(void CloseRestore, (void)); STATIC_PROTO(int check_opcodes, (OPCODE [])); STATIC_PROTO(void RestoreHeap, (OPCODE [], int)); @@ -276,6 +276,8 @@ open_file(char *ss, int flag) static void close_file(void) { + if (splfild == 0) + return; close(splfild); splfild = 0; } @@ -284,32 +286,49 @@ close_file(void) static void putout(CELL l) { - mywrite(splfild, (char *) &l, sizeof(CELL)); + mywrite(splfild, (char *) &l, sizeof(CELL)); } /* stores a pointer to a cell in a file */ static void putcellptr(CELL *l) { - mywrite(splfild, (char *) &l, sizeof(CELLPOINTER)); + mywrite(splfild, (char *) &l, sizeof(CELLPOINTER)); } /* gets a cell from a file */ static CELL get_cell(void) { - CELL l; - myread(splfild, (char *) &l, Unsigned(sizeof(CELL))); - return (l); + CELL l; + myread(splfild, (char *) &l, Unsigned(sizeof(CELL))); + return (l); +} + +/* gets a cell from a file */ +static CELL +get_header_cell(void) +{ + CELL l; + int count = 0, n; + while (count < sizeof(CELL)) { + if ((n = read(splfild, &l, sizeof(CELL)-count)) < 0) { + ErrorMessage = "corrupt saved state"; + return(0L); + } + count += n; + } + return(l); } /* gets a pointer to cell from a file */ static CELL * get_cellptr(void) { - CELL *l; - myread(splfild, (char *) &l, Unsigned(sizeof(CELLPOINTER))); - return (l); + CELL *l; + + myread(splfild, (char *) &l, Unsigned(sizeof(CELLPOINTER))); + return (l); } /* @@ -326,6 +345,10 @@ put_info(int info, int mode) putout(Unsigned(info)); /* say whether we just saved the heap or everything */ putout(mode); + /* c-predicates in system */ + putout(NUMBER_OF_CPREDS); + /* comparison predicates in system */ + putout(NUMBER_OF_CMPFUNCS); /* current state of stacks, to be used by SavedInfo */ #if defined(YAPOR) || defined(TABLING) /* space available in heap area */ @@ -589,58 +612,110 @@ p_save_program(void) /* First check out if we are dealing with a valid file */ static int -check_header(void) +check_header(CELL *info, CELL *ATrail, CELL *AStack, CELL *AHeap) { char pp[80]; char msg[256]; - CELL hp_size, gb_size, lc_size, tr_size, mode; + CELL hp_size, gb_size, lc_size, tr_size, mode, c_preds, cmp_funcs; + /* make sure we always check if there are enough bytes */ /* skip the first line */ do { - myread(splfild, pp, 1); + if (read(splfild, pp, 1) < 0) { + ErrorMessage = "corrupt saved state"; + return(FAIL_RESTORE); + } } while (pp[0] != 1); /* now check the version */ sprintf(msg, "YAPV%s", version_number); - myread(splfild, pp, Unsigned(strlen(msg) + 1)); + { + int count = 0, n, to_read = Unsigned(strlen(msg) + 1); + while (count < to_read) { + if ((n = read(splfild, pp, to_read-count)) < 0) { + ErrorMessage = "corrupt saved state"; + return(FAIL_RESTORE); + } + count += n; + } + } + if (pp[0] != 'Y' && pp[1] != 'A' && pp[0] != 'P') { + ErrorMessage = "corrupt saved state"; + return(FAIL_RESTORE); + } if (strcmp(pp, msg) != 0) { - Error(SYSTEM_ERROR,TermNil,"not a saved Prolog state"); + ErrorMessage = "saved state for different version of YAP"; return(FAIL_RESTORE); } /* check info on header */ /* ignore info on saved state */ - get_cell(); + *info = get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); /* check the restore mode */ - if ((mode = get_cell()) != DO_EVERYTHING && mode != DO_ONLY_CODE) { - Error(SYSTEM_ERROR,TermNil,"corrupted saved state"); + mode = get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); + /* check the number of c-predicates */ + c_preds = get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); + if (HeapBase != NULL && c_preds != NUMBER_OF_CPREDS) { + ErrorMessage = "saved state with different built-ins"; + return(FAIL_RESTORE); + } + cmp_funcs = get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); + if (HeapBase != NULL && cmp_funcs != NUMBER_OF_CMPFUNCS) { + ErrorMessage = "saved state with different built-ins"; + return(FAIL_RESTORE); + } + if (mode != DO_EVERYTHING && mode != DO_ONLY_CODE) { + ErrorMessage = "corrupt saved state"; return(FAIL_RESTORE); } /* ignore info on stacks size */ - get_cell(); - get_cell(); - get_cell(); + *AHeap = get_header_cell(); + *AStack = get_header_cell(); + *ATrail = get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); /* now, check whether we got enough enough space to load the saved space */ hp_size = get_cell(); - while (hp_size > Unsigned(AuxTop) - Unsigned(HeapBase)) { + if (ErrorMessage) + return(FAIL_RESTORE); + while (HeapBase != NULL && hp_size > Unsigned(AuxTop) - Unsigned(HeapBase)) { if(!growheap(FALSE)) { - Error(SYSTEM_ERROR,TermNil,ErrorMessage); - return(FALSE); + return(FAIL_RESTORE); } } if (mode == DO_EVERYTHING) { - if ((lc_size = get_cell())+(gb_size=get_cell()) > Unsigned(LocalBase) - Unsigned(GlobalBase)) { - Error(SYSTEM_ERROR,TermNil,"out of stack space, Yap needs %d", lc_size+gb_size); - return(FALSE); + lc_size = get_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); + gb_size=get_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); + if (HeapBase != NULL && lc_size+gb_size > Unsigned(LocalBase) - Unsigned(GlobalBase)) { + ErrorMessage = "not enough stack space for restore"; + return(FAIL_RESTORE); } - if ((tr_size = get_cell()) > Unsigned(TrailTop) - Unsigned(TrailBase)) { - Error(SYSTEM_ERROR,TermNil,"out of trail space, Yap needs %d", tr_size); + if (HeapBase != NULL && (tr_size = get_cell()) > Unsigned(TrailTop) - Unsigned(TrailBase)) { + ErrorMessage = "not enough trail space for restore"; return(FAIL_RESTORE); } } else { /* skip cell size */ - get_cell(); - get_cell(); - get_cell(); + get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); + get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); + get_header_cell(); + if (ErrorMessage) + return(FAIL_RESTORE); } return(mode); } @@ -1225,57 +1300,19 @@ ShowAtoms() #include -static int -OpenRestore(char *s) -{ +static int +commit_to_saved_state(char *s, CELL *Astate, CELL *ATrail, CELL *AStack, CELL *AHeap) { int mode; - /* if (strcmp(s, StartUpFile) == 0) - YP_fprintf(YP_stderr, "[ YAP version %s ]\n\n", version_number);*/ - CloseStreams(TRUE); - if ((splfild = open_file(s, O_RDONLY)) < 0) { - if (!dir_separator(s[0]) && !volume_header(s)) { - - /* - we have a relative path for the file, try to do somewhat better - using YAPLIBDIR or friends. - */ - if (Yap_LibDir != NULL) { - strncpy(FileNameBuf, Yap_LibDir, YAP_FILENAME_MAX); -#if HAVE_GETENV - } else { - char *yap_env = getenv("YAPLIBDIR"); - if (yap_env != NULL) { - strncpy(FileNameBuf, yap_env, YAP_FILENAME_MAX); -#endif - } else { - strncpy(FileNameBuf, LIB_DIR, YAP_FILENAME_MAX); - } -#if HAVE_GETENV - } -#endif -#if _MSC_VER || defined(__MINGW32__) - strncat(FileNameBuf,"\\", YAP_FILENAME_MAX); -#else - strncat(FileNameBuf,"/", YAP_FILENAME_MAX); -#endif - strncat(FileNameBuf,s, YAP_FILENAME_MAX); - if ((splfild = open_file(FileNameBuf, O_RDONLY)) < 0) { - if (PrologMode != BootMode) { - Error(SYSTEM_ERROR,MkAtomTerm(LookupAtom(s)), - "save/1, open(%s)", strerror(errno)); - } - return(FAIL_RESTORE); - } - } else { - return(FAIL_RESTORE); - } - } - PrologMode = BootMode; - if ((mode = check_header()) == FAIL_RESTORE) + if ((mode = check_header(Astate,ATrail,AStack,AHeap)) == FAIL_RESTORE) return(FAIL_RESTORE); - if (!yap_flags[HALT_AFTER_CONSULT_FLAG]) { - YP_fprintf(YP_stderr, "[ Restoring file %s ]\n", s); + PrologMode = BootMode; + if (HeapBase) { + if (!yap_flags[HALT_AFTER_CONSULT_FLAG]) { + TrueFileName(s,FileNameBuf2, YAP_FILENAME_MAX); + YP_fprintf(YP_stderr, "[ Restoring file %s ]\n", FileNameBuf2); + } + CloseStreams(TRUE); } #ifdef DEBUG_RESTORE4 /* @@ -1286,6 +1323,67 @@ OpenRestore(char *s) return(mode); } +static void +cat_file_name(char *s, char *prefix, char *name, unsigned int max_length) +{ + strncpy(s, prefix, max_length); +#if _MSC_VER || defined(__MINGW32__) + strncat(s,"\\", max_length); +#else + strncat(s,"/", max_length); +#endif + strncat(s, name, max_length); +} + +static int +OpenRestore(char *s, char *YapLibDir, CELL *Astate, CELL *ATrail, CELL *AStack, CELL *AHeap) +{ + int mode = FAIL_RESTORE; + + ErrorMessage = NULL; + if (s == NULL) + s = StartUpFile; + if (s != NULL && (splfild = open_file(s, O_RDONLY)) > 0) { + if ((mode = commit_to_saved_state(s,Astate,ATrail,AStack,AHeap)) != FAIL_RESTORE) + return(mode); + } + if (!dir_separator(s[0]) && !volume_header(s)) { + /* + we have a relative path for the file, try to do somewhat better + using YAPLIBDIR or friends. + */ + if (YapLibDir != NULL) { + cat_file_name(FileNameBuf, Yap_LibDir, s, YAP_FILENAME_MAX); + if ((splfild = open_file(FileNameBuf, O_RDONLY)) > 0) { + if ((mode = commit_to_saved_state(FileNameBuf,Astate,ATrail,AStack,AHeap)) != FAIL_RESTORE) + return(mode); + } + } +#if HAVE_GETENV + { + char *yap_env = getenv("YAPLIBDIR"); + if (yap_env != NULL) { + cat_file_name(FileNameBuf, yap_env, s, YAP_FILENAME_MAX); + if ((splfild = open_file(FileNameBuf, O_RDONLY)) > 0) { + if ((mode = commit_to_saved_state(FileNameBuf,Astate,ATrail,AStack,AHeap)) != FAIL_RESTORE) + return(mode); + } + } + } +#endif + if (LIB_DIR != NULL) { + cat_file_name(FileNameBuf, LIB_DIR, s, YAP_FILENAME_MAX); + if ((splfild = open_file(FileNameBuf, O_RDONLY)) > 0) { + if ((mode = commit_to_saved_state(FileNameBuf,Astate,ATrail,AStack,AHeap)) != FAIL_RESTORE) + return(mode); + } + } + } + Error(SYSTEM_ERROR, TermNil, ErrorMessage); + ErrorMessage = NULL; + return(FAIL_RESTORE); +} + static void CloseRestore(void) { @@ -1341,77 +1439,24 @@ RestoreHeap(OPCODE old_ops[], int functions_moved) * state */ int -SavedInfo(char *FileName, int *ATrail, int *AStack, int *AHeap, char *YapLibDir) +SavedInfo(char *FileName, char *YapLibDir, CELL *ATrail, CELL *AStack, CELL *AHeap) { - char pp[80]; - char msg[256]; - char NameBuf[YAP_FILENAME_MAX]; - int result, mode; + CELL MyTrail, MyStack, MyHeap, MyState; + int mode; - if ((splfild = open_file(FileName, O_RDONLY)) < 0) { - if (!dir_separator(FileName[0]) && !volume_header(FileName)) { - - /* we have a relative path for the file, try to do somewhat better */ - if (YapLibDir != NULL) { - strncpy(FileNameBuf, YapLibDir, YAP_FILENAME_MAX); -#if HAVE_GETENV - } else { - char* my_env=getenv("YAPLIBDIR"); - if (my_env != NULL) { - strncpy(NameBuf, my_env, YAP_FILENAME_MAX); -#endif - } else { - strncpy(NameBuf, LIB_DIR, YAP_FILENAME_MAX); - } -#if HAVE_GETENV - } -#endif -#if _MSC_VER || defined(__MINGW32__) - strncat(NameBuf,"\\", YAP_FILENAME_MAX); -#else - strncat(NameBuf,"/", YAP_FILENAME_MAX); -#endif - strncat(NameBuf,FileName, YAP_FILENAME_MAX); - if ((splfild = open_file(NameBuf, O_RDONLY)) < 0) { - return(FALSE); - } - } else { - return(FALSE); - } - } - /* skip the first line */ - do { - myread(splfild, pp, 1); - } while (pp[0] != 1); - sprintf(msg, "YAPV%s", version_number); - myread(splfild, pp, Unsigned(strlen(msg) + 1)); - if (strcmp(pp, msg) != 0) { - if (PrologMode != BootMode) - Error(SYSTEM_ERROR, TermNil, - "file %s is not a saved Prolog state", FileName); - return(0); - } - result = get_cell(); - mode = get_cell(); - if (mode != DO_ONLY_CODE && mode != DO_EVERYTHING) { - Error(SYSTEM_ERROR, TermNil, - "file %s is not a saved Prolog state", FileName); - return(0); - } - if (*AHeap) - get_cell(); - else - *AHeap = get_cell() / 1024; - if (mode == DO_ONLY_CODE || *AStack) - get_cell(); - else - *AStack = get_cell() / 1024; - if (mode == DO_ONLY_CODE || *ATrail) - get_cell(); - else - *ATrail = get_cell() / 1024; + mode = OpenRestore(FileName, YapLibDir, &MyState, &MyTrail, &MyStack, &MyHeap); close_file(); - return (result); + if (mode == FAIL_RESTORE) { + ErrorMessage = NULL; + return(0); + } + if (! *AHeap) + *AHeap = MyHeap / 1024; + if (mode != DO_ONLY_CODE && *AStack) + *AStack = MyStack / 1024; + if (mode != DO_ONLY_CODE && *ATrail) + *ATrail = MyTrail / 1024; + return (MyState); } static void @@ -1455,14 +1500,15 @@ int in_limbo = FALSE; * associated registers */ int -Restore(char *s) +Restore(char *s, char *lib_dir) { int restore_mode; int funcs_moved; OPCODE old_ops[_std_top+1]; - if ((restore_mode = OpenRestore(s)) == FAIL_RESTORE) + CELL MyTrail, MyStack, MyHeap, MyState; + if ((restore_mode = OpenRestore(s, lib_dir, &MyState, &MyTrail, &MyStack, &MyHeap)) == FAIL_RESTORE) return(FALSE); ShutdownLoadForeign(); in_limbo = TRUE; @@ -1521,7 +1567,7 @@ p_restore(void) Error(TYPE_ERROR_LIST,t1,"restore/1"); return(FALSE); } - if ((mode = Restore(FileNameBuf)) == DO_ONLY_CODE) { + if ((mode = Restore(FileNameBuf, NULL)) == DO_ONLY_CODE) { #if PUSH_REGS restore_absmi_regs(&standard_regs); #endif diff --git a/H/Yapproto.h b/H/Yapproto.h index d7d1cf36c..d6b2d08b2 100644 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -10,7 +10,7 @@ * File: Yap.proto * * mods: * * comments: Function declarations for YAP * -* version: $Id: Yapproto.h,v 1.26 2002-10-29 17:23:32 vsc Exp $ * +* version: $Id: Yapproto.h,v 1.27 2002-10-30 17:27:17 vsc Exp $ * *************************************************************************/ /* prototype file for Yap */ @@ -243,8 +243,8 @@ int STD_PROTO(IsPosfixOp,(Prop,int *,int *)); Term STD_PROTO(Parse,(void)); /* save.c */ -int STD_PROTO(SavedInfo,(char *,int *,int *,int *,char *)); -int STD_PROTO(Restore,(char *)); +int STD_PROTO(SavedInfo,(char *,char *,CELL *,CELL *,CELL *)); +int STD_PROTO(Restore,(char *, char *)); void STD_PROTO(InitSavePreds,(void)); /* scanner.c */ diff --git a/console/yap.c b/console/yap.c index 65519b0a6..abd1b4b42 100644 --- a/console/yap.c +++ b/console/yap.c @@ -67,7 +67,7 @@ static int PROTO(mygetc, (void)); static void PROTO(do_bootfile, (char *)); static void PROTO(do_top_goal,(YAP_Term)); -static void PROTO(exec_top_level,(int, char *)); +static void PROTO(exec_top_level,(int, YAP_init_args *)); #ifndef LIGHT void PROTO (exit, (int)); @@ -86,7 +86,6 @@ static int output_msg; #endif static char BootFile[] = "boot.yap"; -static char StartUpFile[] = "startup"; #ifdef lint /* VARARGS1 */ @@ -211,15 +210,12 @@ do_bootfile (char *bootfilename) #endif } -static char *filename; - - static void print_usage(const YAP_init_args *init_args) { fprintf(stderr,"\n[ Valid switches for command line arguments: ]\n"); fprintf(stderr," -? Shows this screen\n"); - fprintf(stderr," -b Boot file (%s)\n", StartUpFile); + fprintf(stderr," -b Boot file \n"); fprintf(stderr," -l Prolog file\n"); fprintf(stderr," -h Heap area in Kbytes (default: %d, minimum: %d)\n", DefHeapSpace, MinHeapSpace); @@ -246,7 +242,7 @@ print_usage(const YAP_init_args *init_args) */ static int -parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) +parse_yap_arguments(int argc, char *argv[], YAP_init_args *iap) { char *p; int BootMode = YAP_BOOT_FROM_SAVED_CODE; @@ -260,15 +256,17 @@ parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) { case 'b': BootMode = YAP_BOOT_FROM_PROLOG; + iap->YapPrologBootFile = *++argv; + argc--; break; case '?': - print_usage(init_args); + print_usage(iap); exit(EXIT_SUCCESS); case 'w': - ssize = &(init_args->NumberWorkers); + ssize = &(iap->NumberWorkers); goto GetSize; case 'd': - ssize = &(init_args->DelayedReleaseLoad); + ssize = &(iap->DelayedReleaseLoad); goto GetSize; #ifdef USE_SOCKET case 'c': /* running as client */ @@ -313,7 +311,7 @@ parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) break; #endif /* EMACS */ case 'f': - init_args->FastBoot = TRUE; + iap->FastBoot = TRUE; break; #ifdef MPWSHELL case 'm': @@ -323,19 +321,19 @@ parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) #endif case 's': case 'S': - ssize = &(init_args->StackSize); + ssize = &(iap->StackSize); if (p[1] == 'l') { p++; - ssize = &(init_args->SchedulerLoop); + ssize = &(iap->SchedulerLoop); } goto GetSize; case 'h': case 'H': - ssize = &(init_args->HeapSize); + ssize = &(iap->HeapSize); goto GetSize; case 't': case 'T': - ssize = &(init_args->TrailSize); + ssize = &(iap->TrailSize); GetSize: if (*++p == '\0') { @@ -344,7 +342,7 @@ parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) else { fprintf(stderr,"[ YAP unrecoverable error: missing size in flag %s ]", argv[0]); - print_usage(init_args); + print_usage(iap); exit(EXIT_FAILURE); } } @@ -381,13 +379,13 @@ parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) /* we're done here */ argc = 1; } - init_args->YapPrologBootFile = *argv; + iap->YapPrologRCFile = *argv; argv++; - init_args->HaltAfterConsult = TRUE; + iap->HaltAfterConsult = TRUE; break; case 'l': if ((*argv)[0] == '\0') - init_args->YapPrologBootFile = *argv; + iap->YapPrologRCFile = *argv; else { argc--; if (argc == 0) { @@ -395,7 +393,7 @@ parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) exit(EXIT_FAILURE); } argv++; - init_args->YapPrologBootFile = *argv; + iap->YapPrologRCFile = *argv; } break; case '-': @@ -405,64 +403,51 @@ parse_yap_arguments(int argc, char *argv[], YAP_init_args *init_args) default: { fprintf(stderr,"[ YAP unrecoverable error: unknown switch -%c ]\n", *p); - print_usage(init_args); + print_usage(iap); exit(EXIT_FAILURE); } } else { - filename = p; + iap->SavedState = p; } } return(BootMode); } static int -init_standard_system(int argc, char *argv[]) +init_standard_system(int argc, char *argv[], YAP_init_args *iap) { int BootMode; - YAP_init_args init_args; - init_args.SavedState = NULL; - init_args.HeapSize = 0; - init_args.StackSize = 0; - init_args.TrailSize = 0; - init_args.YapLibDir = NULL; - init_args.YapPrologBootFile = NULL; - init_args.HaltAfterConsult = FALSE; - init_args.FastBoot = FALSE; - init_args.NumberWorkers = 1; - init_args.SchedulerLoop = 10; - init_args.DelayedReleaseLoad = 3; - init_args.Argc = argc; - init_args.Argv = argv; + iap->SavedState = NULL; + iap->HeapSize = 0; + iap->StackSize = 0; + iap->TrailSize = 0; + iap->YapLibDir = NULL; + iap->YapPrologBootFile = NULL; + iap->YapPrologRCFile = NULL; + iap->HaltAfterConsult = FALSE; + iap->FastBoot = FALSE; + iap->NumberWorkers = 1; + iap->SchedulerLoop = 10; + iap->DelayedReleaseLoad = 3; + iap->Argc = argc; + iap->Argv = argv; - BootMode = parse_yap_arguments(argc,argv,&init_args); + BootMode = parse_yap_arguments(argc,argv,iap); /* init memory */ - if (BootMode == YAP_BOOT_FROM_PROLOG) - { - - YAP_Init(&init_args); - - } - else - { - if (filename == NULL) - init_args.SavedState = StartUpFile; - else - init_args.SavedState = filename; - - BootMode = YAP_Init(&init_args); - - } - + if (BootMode == YAP_BOOT_FROM_PROLOG) { + YAP_Init(iap); + } else { + BootMode = YAP_Init(iap); + } return(BootMode); - } static void -exec_top_level(int BootMode, char *filename) +exec_top_level(int BootMode, YAP_init_args *iap) { YAP_Term atomfalse; YAP_Atom livegoal; @@ -476,7 +461,7 @@ exec_top_level(int BootMode, char *filename) { YAP_Atom livegoal; /* read the bootfile */ - do_bootfile (filename ? filename : BootFile); + do_bootfile (iap->YapPrologBootFile ? iap->YapPrologBootFile : BootFile); livegoal = YAP_FullLookupAtom("$live"); /* initialise the top-level */ YAP_PutValue(livegoal, YAP_MkAtomTerm (YAP_LookupAtom("true"))); @@ -504,11 +489,12 @@ main (int argc, char **argv) #endif { int BootMode; + YAP_init_args init_args; #ifdef SIMICS fprintf(stdout,"Entering YAP\n"); #endif /* SIMICS */ - BootMode = init_standard_system(argc, argv); + BootMode = init_standard_system(argc, argv, &init_args); if (BootMode == YAP_BOOT_FROM_SAVED_ERROR) { fprintf(stderr,"[ FATAL ERROR: could not find saved state ]\n"); exit(1); @@ -516,7 +502,7 @@ main (int argc, char **argv) #if defined(YAPOR) || defined(TABLING) start_workers(); #endif /* YAPOR || TABLING */ - exec_top_level(BootMode, filename); + exec_top_level(BootMode, &init_args); return(0); } diff --git a/include/yap_structs.h b/include/yap_structs.h index 9a88bb08a..5ea9e3466 100644 --- a/include/yap_structs.h +++ b/include/yap_structs.h @@ -70,8 +70,10 @@ typedef struct { int TrailSize; /* if NON-NULL, value for YAPLIBDIR */ char *YapLibDir; - /* if NON-NULL, name for a Prolog file to consult before entering top-level */ + /* if NON-NULL, name for a Prolog file to use when booting */ char *YapPrologBootFile; + /* if NON-NULL, name for a Prolog file to consult before entering top-level */ + char *YapPrologRCFile; /* if previous NON-NULL and TRUE, halt after consulting that file */ int HaltAfterConsult; /* ignore .yaprc, .prolog.ini, etc. files. */ diff --git a/library/cleanup.yap b/library/cleanup.yap index 1c2357c22..5023056b1 100644 --- a/library/cleanup.yap +++ b/library/cleanup.yap @@ -21,7 +21,7 @@ % throws an exception if called outside of any cleanup-context. % % cleanup_all. -% calls all pending CleanUpGoals and resets the cleanup-system to an initial state. +% calls all pending CleanUpGoals and resets the cleanup-system to an initial state. % should only be used as one of the last calls in the main program. % % hidden predicates: