diff --git a/C/cdmgr.c b/C/cdmgr.c index e9f18e22b..037f4e0b3 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -3082,48 +3082,23 @@ static Int p_clean_up_dead_clauses(USES_REGS1) { void Yap_HidePred(PredEntry *pe) { pe->PredFlags |= (HiddenPredFlag | NoSpyPredFlag | NoTracePredFlag); + char newMod[1024]; + strncpy(newMod, "$$$--hidden-module--",1023); + Term cmod = pe->ModuleOfPred; + if (cmod == PROLOG_MODULE) + strncat(newMod, "prolog", 1023-strlen(newMod)); + else + strncat(newMod, RepAtom(AtomOfTerm(cmod))->StrOfAE, 1023-strlen(newMod)); + pe->ModuleOfPred = MkAtomTerm(Yap_LookupAtom(newMod)); } static Int /* $system_predicate(P) */ p_stash_predicate(USES_REGS1) { PredEntry *pe; - Term t1 = Deref(ARG1); - Term mod = Deref(ARG2); + pe = Yap_get_pred(Deref(ARG1), Deref(ARG2), "stash_predicate/1"); -restart_system_pred: - if (IsVarTerm(t1)) - return (FALSE); - if (IsAtomTerm(t1)) { - Atom a = AtomOfTerm(t1); - - pe = RepPredProp(Yap_GetPredPropByAtom(a, mod)); - } else if (IsApplTerm(t1)) { - Functor funt = FunctorOfTerm(t1); - if (IsExtensionFunctor(funt)) { - return (FALSE); - } - if (funt == FunctorModule) { - Term nmod = ArgOfTerm(1, t1); - if (IsVarTerm(nmod)) { - Yap_Error(INSTANTIATION_ERROR, ARG1, "hide_predicate/1"); - return (FALSE); - } - if (!IsAtomTerm(nmod)) { - Yap_Error(TYPE_ERROR_ATOM, ARG1, "hide_predicate/1"); - return (FALSE); - } - t1 = ArgOfTerm(2, t1); - goto restart_system_pred; - } - pe = RepPredProp(Yap_GetPredPropByFunc(funt, mod)); - } else if (IsPairTerm(t1)) { - return TRUE; - } else - return FALSE; - if (EndOfPAEntr(pe)) - return FALSE; - Yap_HidePred(pe); + if (pe && !(pe->PredFlags & SystemPredFlags)) Yap_HidePred(pe); return TRUE; } @@ -3131,43 +3106,10 @@ static Int /* $system_predicate(P) */ hide_predicate(USES_REGS1) { PredEntry *pe; - Term t1 = Deref(ARG1); - Term mod = Deref(ARG2); + pe = Yap_get_pred(Deref(ARG1), Deref(ARG2), "hide_predicate/1"); -restart_system_pred: - if (IsVarTerm(t1)) - return (FALSE); - if (IsAtomTerm(t1)) { - Atom a = AtomOfTerm(t1); - - pe = RepPredProp(Yap_GetPredPropByAtom(a, mod)); - } else if (IsApplTerm(t1)) { - Functor funt = FunctorOfTerm(t1); - if (IsExtensionFunctor(funt)) { - return (FALSE); - } - if (funt == FunctorModule) { - Term nmod = ArgOfTerm(1, t1); - if (IsVarTerm(nmod)) { - Yap_Error(INSTANTIATION_ERROR, ARG1, "hide_predicate/1"); - return (FALSE); - } - if (!IsAtomTerm(nmod)) { - Yap_Error(TYPE_ERROR_ATOM, ARG1, "hide_predicate/1"); - return (FALSE); - } - t1 = ArgOfTerm(2, t1); - goto restart_system_pred; - } - pe = RepPredProp(Yap_GetPredPropByFunc(funt, mod)); - } else if (IsPairTerm(t1)) { - return true; - } else - return false; - if (EndOfPAEntr(pe)) - return false; - pe->PredFlags |= (HiddenPredFlag | NoSpyPredFlag | NoTracePredFlag); - return true; + if (pe) Yap_HidePred(pe); + return TRUE; } static Int /* $hidden_predicate(P) */ diff --git a/CMakeLists.txt b/CMakeLists.txt index c6b97dd1c..d33175a60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -606,7 +606,7 @@ endif () if (WIN32) target_link_libraries(libYap ${WINDLLS}) - if (PYTHON_INCLUDE_DIRS AND PYTHON_LIBRARIES) + if (WITH_PYTHON AND PYTHON_INCLUDE_DIRS AND PYTHON_LIBRARIES) target_link_libraries(libYap ${PYTHON_LIBRARIES}) endif () endif (WIN32) @@ -687,7 +687,7 @@ set_target_properties(libYap # file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/packages/python/swig/yap4py) -if (PYTHONLIBS_FOUND AND SWIG_FOUND) +if (WITH_PYTHON AND PYTHONLIBS_FOUND AND SWIG_FOUND) set( ENV{PYTHONPATH} ${CMAKE_BINARY_DIR}/packages/python/swig:${CMAKE_BINARY_DIR}/packages/python/yap_kernel:. ) add_subdirectory(packages/python/swig) @@ -927,7 +927,7 @@ if (WIN32) set(MSVC_RUNTIME "dynamic") ENDIF (MSVC) - target_link_libraries(libYap wsock32 ws2_32 Shlwapi) + target_link_libraries(libYap wsock32 ws2_32 shlwapi) endif (WIN32) diff --git a/include/VFS.h b/include/VFS.h index 7bb62609c..81aea375d 100644 --- a/include/VFS.h +++ b/include/VFS.h @@ -88,6 +88,7 @@ typedef struct vfs { int (*peek_char)(int sno); /// unget an octet from the stream int (*peek_wchar)(int sno); /// unget an octet from the stream int (*put_char)(int sno, int ch); /// output an octet to the stream + int (*put_wchar)(int sno, int ch); /// output a character to the stream void (*flush)(int sno); /// flush a stream int64_t (*seek)(int sno, int64_t offset, int whence); /// jump around the stream diff --git a/os/files.c b/os/files.c index 8a7fb6c0c..55dd46740 100644 --- a/os/files.c +++ b/os/files.c @@ -678,13 +678,13 @@ VFS_t *vfsp; strcat(bs, "/*"); #endif if ((hFile = _findfirst(bs, &c_file)) == -1L) { - return (Yap_Unify(ARD2, tf)); + return (Yap_unify(ARG2, tf)); } - YAP_PutInSlot(sl, YAP_MkPairTerm(YAP_MkAtomTerm(YAP_LookupAtom(c_file.name)), - YAP_GetFromSlot(sl))); + Yap_PutInSlot(sl, MkPairTerm(MkAtomTerm(Yap_LookupAtom(c_file.name)), + Yap_GetFromSlot(sl))); while (_findnext(hFile, &c_file) == 0) { - YAP_Term ti = YAP_MkAtomTerm(YAP_LookupAtom(c_file.name)); - YAP_PutInSlot(sl, YAP_MkPairTerm(ti, YAP_GetFromSlot(sl))); + Term ti = MkAtomTerm(Yap_LookupAtom(c_file.name)); + Yap_PutInSlot(sl, MkPairTerm(ti, Yap_GetFromSlot(sl))); } _findclose(hFile); #elif HAVE_OPENDIR diff --git a/os/iopreds.c b/os/iopreds.c index fee269474..25770e00a 100644 --- a/os/iopreds.c +++ b/os/iopreds.c @@ -340,7 +340,7 @@ void Yap_DefaultStreamOps(StreamDesc *st) { st->stream_wgetc = get_wchar; if (st->vfs && !st->file) { st->stream_putc = st->vfs->put_char; - st->stream_wputc = st->vfs->put_char; + st->stream_wputc = st->vfs->put_wchar; st->stream_getc = st->vfs->get_char; st->stream_wgetc = st->vfs->get_char; default_peek(st); @@ -1161,11 +1161,7 @@ bool Yap_initStream(int sno, FILE *fd, const char *name, const char *io_mode, st->encoding = encoding; } - if (name == NULL) { - char buf[YAP_FILENAME_MAX + 1]; - memset(buf, 0, YAP_FILENAME_MAX + 1); - name = Yap_guessFileName(fd, sno, buf, YAP_FILENAME_MAX); - } + name = Yap_guessFileName(fd, sno, YAP_FILENAME_MAX); if (!name) Yap_Error(SYSTEM_ERROR_INTERNAL, file_name, "Yap_guessFileName failed: opening a file without a name"); @@ -1233,11 +1229,11 @@ typedef enum open_enum_choices { OPEN_DEFS() } open_choices_t; static const param_t open_defs[] = {OPEN_DEFS()}; #undef PAR -static bool fill_stream(int sno, StreamDesc *st, Term tin, const char *io_mode, - Term user_name, encoding_t enc) { +static bool fill_stream(int sno, StreamDesc *st, Term tin, const char *io_mode, Term user_name, encoding_t enc) { struct vfs *vfsp = NULL; const char *fname; + int i; if (IsAtomTerm(tin)) fname = RepAtom(AtomOfTerm(tin))->StrOfAE; else if (IsStringTerm(tin)) @@ -1279,7 +1275,7 @@ static bool fill_stream(int sno, StreamDesc *st, Term tin, const char *io_mode, if (strchr(io_mode, 'r')) { return Yap_OpenBufWriteStream(PASS_REGS1); } else { - int i = push_text_stack(); + i = push_text_stack(); const char *buf; buf = Yap_TextTermToText(tin PASS_REGS); @@ -1299,7 +1295,6 @@ static bool fill_stream(int sno, StreamDesc *st, Term tin, const char *io_mode, int i = push_text_stack(); buf = Yap_TextTermToText(ArgOfTerm(1, tin) PASS_REGS); if (buf == NULL) { - pop_text_stack(i); return false; } #if _WIN32 @@ -1312,7 +1307,8 @@ static bool fill_stream(int sno, StreamDesc *st, Term tin, const char *io_mode, st->status |= Popen_Stream_f; pop_text_stack(i); } else { - Yap_ThrowError(DOMAIN_ERROR_SOURCE_SINK, tin, "open"); + pop_text_stack(i); + Yap_ThrowError(DOMAIN_ERROR_SOURCE_SINK, tin, "open"); } } if (!strchr(io_mode, 'b') && binary_file(fname)) { diff --git a/os/mem.c b/os/mem.c index 916729cae..b8623ddc1 100644 --- a/os/mem.c +++ b/os/mem.c @@ -48,7 +48,6 @@ int format_synch(int sno, int sno0, format_info *fg) { GLOBAL_Stream[sno].linecount = 1; GLOBAL_Stream[sno].linepos = 0; GLOBAL_Stream[sno].charcount = 0; - GLOBAL_Stream[sno].recbs = NULL; GLOBAL_Stream[sno].vfs = NULL; fg->lstart = 0; fg->phys_start = 0; @@ -105,7 +104,6 @@ bool fill_pads(int sno, int sno0, int total, format_info *fg USES_REGS) { GLOBAL_Stream[sno].linecount = 1; GLOBAL_Stream[sno].linepos += nchars; GLOBAL_Stream[sno].charcount = 0; - GLOBAL_Stream[sno].recbs = NULL; GLOBAL_Stream[sno].vfs = NULL; GLOBAL_Stream[sno].file = NULL; fg->phys_start = 0; @@ -193,8 +191,7 @@ bool Yap_set_stream_to_buf(StreamDesc *st, const char *buf, st->file = f = NULL; flags = Input_Stream_f | InMemory_Stream_f; st->vfs = NULL; - Yap_initStream(st - GLOBAL_Stream, f, "r", TermNil, LOCAL_encoding, flags, - AtomRead, NULL); + Yap_initStream(st - GLOBAL_Stream, f, "buffer", "r", TermNil, LOCAL_encoding, flags, NULL); // like any file stream. /* currently these streams are not seekable */ st->status = Input_Stream_f | InMemory_Stream_f; @@ -207,8 +204,7 @@ bool Yap_set_stream_to_buf(StreamDesc *st, const char *buf, return true; } -int Yap_open_buf_read_stream(const char *buf, size_t nchars, encoding_t *encp, - memBufSource src) { +int Yap_open_buf_read_stream(const char *buf, size_t nchars, encoding_t *encp, memBufSource src , Atom name, Term uname) { CACHE_REGS int sno; StreamDesc *st; @@ -228,7 +224,8 @@ int Yap_open_buf_read_stream(const char *buf, size_t nchars, encoding_t *encp, st->file = f = NULL; flags = Input_Stream_f | InMemory_Stream_f; st->vfs = NULL; - Yap_initStream(sno, f, "wa", TermNil, encoding, flags, AtomRead, NULL); + st->name = name; + Yap_initStream(sno, f, "Memory Stream","wa", TermNil, encoding, flags, NULL); // like any file stream. /* currently these streams are not seekable */ st->status = Input_Stream_f | InMemory_Stream_f; @@ -257,7 +254,7 @@ open_mem_read_stream(USES_REGS1) /* $open_mem_read_stream(+List,-Stream) */ } buf = pop_output_text_stack(i, buf); sno = Yap_open_buf_read_stream(buf, strlen(buf) + 1, &LOCAL_encoding, - MEM_BUF_MALLOC); + MEM_BUF_MALLOC, AtomNil, TermNil); t = Yap_MkStream(sno); return Yap_unify(ARG2, t); } @@ -278,7 +275,6 @@ int Yap_open_buf_write_stream(encoding_t enc, memBufSource src) { st->charcount = 0; st->linecount = 1; st->encoding = enc; - st->recbs = NULL; st->vfs = NULL; st->file = NULL; Yap_DefaultStreamOps(st); diff --git a/os/streams.c b/os/streams.c index f91cb572b..c51459aec 100644 --- a/os/streams.c +++ b/os/streams.c @@ -315,36 +315,35 @@ bool Yap_SetCurInpPos( return true; } -char *Yap_guessFileName(FILE *file, int sno, char *nameb, size_t max) { - size_t maxs = Yap_Max(1024, max); - if (!nameb) { - nameb = malloc(maxs + 1); - } +char *Yap_guessFileName(FILE *file, int sno, size_t max) { + size_t maxs = Yap_Max(1023, max-1); + int i = push_text_stack(); + char *nameb = Malloc(maxs + 1); if (!file) { strncpy(nameb, "memory buffer", maxs); - return nameb; + + return pop_output_text_stack(i,nameb); } int f = fileno(file); if (f < 0) { strcpy(nameb, "???"); - return nameb; + return pop_output_text_stack(i,nameb); } #if __linux__ - char *path = malloc(1024); + char *path = Malloc(1024); if (snprintf(path, 1023, "/proc/self/fd/%d", f) && readlink(path, nameb, maxs)) { - free(path); - return nameb; + return pop_output_text_stack(i,nameb); } #elif __APPLE__ if (fcntl(f, F_GETPATH, nameb) != -1) { - return nameb; + return pop_output_text_stack(i,nameb); } #else - TCHAR path = malloc(MAX_PATH + 1); + TCHAR *path = Malloc(MAX_PATH + 1); if (!GetFullPathName(path, MAX_PATH, path, NULL)) { - free(path); + pop_text_stack(i); return NULL; } else { int i; @@ -352,14 +351,14 @@ char *Yap_guessFileName(FILE *file, int sno, char *nameb, size_t max) { for (i = 0; i < strlen(path); i++) ptr += put_utf8(ptr, path[i]); *ptr = '\0'; - free(path); - return nameb; + return pop_output_text_stack(i,nameb); } - free(path); #endif if (!StreamName(sno)) { + pop_text_stack(i); return NULL; } + pop_text_stack(i); return RepAtom(AtomOfTerm(StreamName(sno)))->StrOfAE; } diff --git a/os/sysbits.c b/os/sysbits.c index 25ab46a6d..9bf8f8cd5 100644 --- a/os/sysbits.c +++ b/os/sysbits.c @@ -1872,7 +1872,7 @@ static Int p_sleep(USES_REGS1) { Term ts = ARG1; #if defined(__MINGW32__) || _MSC_VER { - unsigned long int secs = 0, usecs = 0, msecs, out; + unsigned long int secs = 0, usecs = 0, msecs; if (IsIntegerTerm(ts)) { secs = IntegerOfTerm(ts); } else if (IsFloatTerm(ts)) { @@ -1902,7 +1902,7 @@ static Int p_sleep(USES_REGS1) { req.tv_sec = IntOfTerm(ts); } out = nanosleep(&req, NULL); - return true; + return out == 0; } #elif HAVE_USLEEP { diff --git a/os/sysbits.h b/os/sysbits.h index 8253b1a73..208be1107 100644 --- a/os/sysbits.h +++ b/os/sysbits.h @@ -32,7 +32,7 @@ #if _WIN32 || defined(__MINGW32__) #include /* Windows */ -#include "Shlwapi.h" +#include "shlwapi.h" #include #include #include @@ -40,6 +40,12 @@ #define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR) #endif #endif +#ifndef BUF_SIZE +#ifdef MAX_PATH +#define BUF_SIZE MAX_PATH +#endif +#endif + #ifdef HAVE_UNISTD_H #include @@ -115,6 +121,10 @@ /* windows.h does not like absmi.h, this should fix it for now */ #include +#include +#if HAVE_TIME_H +#include +#endif #if HAVE_SYS_TIME_H && !_MSC_VER #include #endif diff --git a/os/yapio.h b/os/yapio.h index 4344623e4..5ef858027 100644 --- a/os/yapio.h +++ b/os/yapio.h @@ -126,7 +126,7 @@ extern X_API Term Yap_BufferToTermWithPrioBindings(const char *s, Term opts, Te int prio); extern FILE *Yap_GetInputStream(Term t, const char *m); extern FILE *Yap_GetOutputStream(Term t, const char *m); -extern char *Yap_guessFileName(FILE *f, int sno, char *nameb, size_t max); +extern char *Yap_guessFileName(FILE *f, int sno, size_t max); extern void Yap_plwrite(Term t, struct stream_desc *mywrite, int max_depth, int flags, int priority); diff --git a/packages/myddas/sqlite3/CMakeLists.txt b/packages/myddas/sqlite3/CMakeLists.txt index ca8daca1a..3925c2c32 100644 --- a/packages/myddas/sqlite3/CMakeLists.txt +++ b/packages/myddas/sqlite3/CMakeLists.txt @@ -34,7 +34,7 @@ add_definitions(-DSQLITE_ENABLE_FTS5=1 ) SET_PROPERTY(DIRECTORY PROPERTY COMPILE_DEFINITIONS YAP_KERNEL=1 ) -if (ANDROID) +if (ANDROID OR WIN32) add_library( YAPsqlite3 OBJECT ${YAPSQLITE3_SOURCES} ) diff --git a/pl/bootlists.yap b/pl/bootlists.yap index 471fbad9d..4d06ba4b7 100644 --- a/pl/bootlists.yap +++ b/pl/bootlists.yap @@ -92,21 +92,6 @@ lists:delete([Head|List], Elem, [Head|Residue]) :- lists:delete(List, Elem, Residue). -% reverse(List, Reversed) -% is true when List and Reversed are lists with the same elements -% but in opposite orders. rev/2 is a synonym for reverse/2. - -lists:reverse(List, Reversed) :- - lists:reverse(List, [], Reversed). - -lists:reverse([], Reversed, Reversed). -lists:reverse([Head|Tail], Sofar, Reversed) :- - lists:reverse(Tail, [Head|Sofar], Reversed). - -:- set_prolog_flag(source, false). % disable source. - - - % length of a list. /** @pred length(? _L_,? _S_)