From 04a2c10ebe28f240167cccf0cf1708f4498fc614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Tue, 29 Sep 2015 23:06:49 +0100 Subject: [PATCH] support loop_stream while at initial boot (doesn't really do work so far) --- C/c_interface.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index 4ab3ff8ab..7130801c6 100755 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -2630,7 +2630,7 @@ YAP_ClearExceptions(void) } X_API int -YAP_InitConsult(int mode, const char *filename) +YAP_InitConsult(int mode, const char *filename, int *osnop) { FILE *f; int sno; @@ -2645,6 +2645,13 @@ YAP_InitConsult(int mode, const char *filename) if (!f) return -1; sno = Yap_OpenStream(f, NULL, TermNil, Input_Stream_f ); + *osnop = Yap_CheckAlias( AtomLoopStream ); + if (!Yap_AddAlias(AtomLoopStream,sno)) { + Yap_CloseStream( sno); + sno = -1; + } + GLOBAL_Stream[sno].name = Yap_LookupAtom( filename ); + GLOBAL_Stream[sno].user_name = MkAtomTerm( Yap_LookupAtom( filename ) ); RECOVER_MACHINE_REGS(); UNLOCK(GLOBAL_Stream[sno].streamlock); return sno; @@ -2667,10 +2674,12 @@ YAP_TermToStream(Term t) } X_API void -YAP_EndConsult(int sno) +YAP_EndConsult(int sno, int *osnop) { BACKUP_MACHINE_REGS(); Yap_CloseStream(sno); + if (osnop >= 0 ) + Yap_AddAlias( AtomLoopStream, *osnop ); Yap_end_consult(); RECOVER_MACHINE_REGS(); @@ -2800,7 +2809,7 @@ static void do_bootfile (char *bootfilename USES_REGS) { Term t; - int bootfile; + int bootfile, osno; Functor functor_query = Yap_MkFunctor(Yap_LookupAtom("?-"),1); Functor functor_command1 = Yap_MkFunctor(Yap_LookupAtom(":-"),1); @@ -2810,7 +2819,7 @@ do_bootfile (char *bootfilename USES_REGS) To be honest, YAP_InitConsult does not really do much, it's here for the future. It also makes what we want to do clearer. */ - bootfile = YAP_InitConsult(YAP_BOOT_MODE,bootfilename); + bootfile = YAP_InitConsult(YAP_BOOT_MODE,bootfilename, &osno); if (bootfile <0) { fprintf(stderr, "[ FATAL ERROR: could not open bootfile %s ]\n", bootfilename); @@ -2843,14 +2852,26 @@ do_bootfile (char *bootfilename USES_REGS) } else { - char *ErrorMessage = YAP_CompileClause(t); + Term ts[2]; + char *ErrorMessage; + Functor fun = Yap_MkFunctor(Yap_LookupAtom("$prepare_clause"),2); + PredEntry *pe = RepPredProp(PredPropByFunc(fun,PROLOG_MODULE)); + + if (pe->OpcodeOfPred != UNDEF_OPCODE && + pe->OpcodeOfPred != FAIL_OPCODE) { + ts[0] = t; + RESET_VARIABLE(ts+1); + if ( YAP_RunGoal(Yap_MkApplTerm( fun,2,ts)) ) + t = ts[1]; + } + ErrorMessage = YAP_CompileClause(t); if (ErrorMessage) { fprintf(stderr, "%s", ErrorMessage); } } } while (t != TermEof ); - YAP_EndConsult(bootfile); + YAP_EndConsult(bootfile, &osno); #if DEBUG if (Yap_output_msg) fprintf(stderr,"Boot loaded\n");