diff --git a/packages/PLStream/Makefile.in b/packages/PLStream/Makefile.in index 7bdbc8c70..ad5488675 100755 --- a/packages/PLStream/Makefile.in +++ b/packages/PLStream/Makefile.in @@ -19,7 +19,7 @@ LIBDIR=@libdir@/Yap # # CC=@CC@ -CFLAGS= @CFLAGS@ $(YAP_EXTRAS) $(DEFS) -D_YAP_NOT_INSTALLED_=1 -I$(srcdir) -I../.. -I$(srcdir)/../../include -I$(srcdir)/uxnt +CFLAGS= @CFLAGS@ $(YAP_EXTRAS) $(DEFS) -D_YAP_NOT_INSTALLED_=1 -I$(srcdir) -I../.. -I$(srcdir)/../../include # # # You shouldn't need to change what follows. @@ -48,17 +48,19 @@ HEADERS=$(srcdir)/atoms.h $(srcdir)/pl-buffer.h $(srcdir)/pl-ctype.h \ $(srcdir)/pl-yap.h @ENABLE_WINCONSOLE@ $(srcdir)/uxnt/dirent.h $(srcdir)/uxnt/utf8.h $(srcdir)/pl-utf8.c $(srcdir)/uxnt/uxnt.h C_SOURCES=$(srcdir)/pl-buffer.c $(srcdir)/pl-ctype.c \ $(srcdir)/pl-error.c \ - $(srcdir)/pl-file.c $(srcdir)/pl-files.c $(srcdir)/pl-os.c \ + $(srcdir)/pl-file.c $(srcdir)/pl-files.c \ + $(srcdir)/pl-glob.c \ + $(srcdir)/pl-os.c \ $(srcdir)/pl-privitf.c \ $(srcdir)/pl-stream.c $(srcdir)/pl-string.c \ $(srcdir)/pl-table.c \ $(srcdir)/pl-text.c \ - $(srcdir)/pl-utils.c \ + $(srcdir)/pl-util.c \ $(srcdir)/pl-yap.c @ENABLE_WINCONSOLE@ $(srcdir)/popen.c $(srcdir)/uxnt/uxnt.c OBJS=pl-buffer.o pl-ctype.o pl-error.o \ - pl-file.o pl-files.o pl-os.o pl-privitf.o \ + pl-file.o pl-files.o pl-glob.o pl-os.o pl-privitf.o \ pl-stream.o pl-string.o pl-table.o \ - pl-text.o pl-utils.o pl-utf8.o \ + pl-text.o pl-util.o pl-utf8.o \ pl-yap.o @ENABLE_WINCONSOLE@ uxnt.o SOBJS=plstream@SHLIB_SUFFIX@ diff --git a/packages/PLStream/pl-file.c b/packages/PLStream/pl-file.c index b5aa63af6..b35905328 100755 --- a/packages/PLStream/pl-file.c +++ b/packages/PLStream/pl-file.c @@ -4308,6 +4308,8 @@ static void init_yap_extras() { initCharTypes(); + initFiles(); + initGlob(); PL_register_extensions(PL_predicates_from_file); fileerrors = TRUE; SinitStreams(); diff --git a/packages/PLStream/pl-files.c b/packages/PLStream/pl-files.c index 31a5d7b7e..f23dc00fe 100755 --- a/packages/PLStream/pl-files.c +++ b/packages/PLStream/pl-files.c @@ -977,6 +977,35 @@ PRED_IMPL("mark_executable", 1, mark_executable, 0) } + + /******************************* + * PUBLISH PREDICATES * + *******************************/ + +BeginPredDefs(files) + PRED_DEF("swi_working_directory", 2, working_directory, 0) + PRED_DEF("swi_access_file", 2, access_file, 0) + PRED_DEF("swi_time_file", 2, time_file, 0) + PRED_DEF("swi_size_file", 2, size_file, 0) + PRED_DEF("swi_read_link", 3, read_link, 0) + PRED_DEF("swi_exists_file", 1, exists_file, 0) + PRED_DEF("swi_exists_directory", 1, exists_directory, 0) + PRED_DEF("swi_tmp_file", 2, tmp_file, 0) + PRED_DEF("swi_tmp_file_stream", 3, tmp_file_stream, 0) + PRED_DEF("swi_delete_file", 1, delete_file, 0) + PRED_DEF("swi_delete_directory", 1, delete_directory, 0) + PRED_DEF("swi_make_directory", 1, make_directory, 0) + PRED_DEF("swi_same_file", 2, same_file, 0) + PRED_DEF("swi_rename_file", 2, rename_file, 0) + PRED_DEF("swi_is_absolute_file_name", 1, is_absolute_file_name, 0) + PRED_DEF("swi_file_base_name", 2, file_base_name, 0) + PRED_DEF("swi_file_directory_name", 2, file_directory_name, 0) + PRED_DEF("swi_file_name_extension", 3, file_name_extension, 0) + PRED_DEF("swi_prolog_to_os_filename", 2, prolog_to_os_filename, 0) + PRED_DEF("swi_$mark_executable", 1, mark_executable, 0) + PRED_DEF("swi_$absolute_file_name", 2, absolute_file_name, 0) +EndPredDefs + /******************************* * INIT * *******************************/ @@ -984,33 +1013,6 @@ PRED_IMPL("mark_executable", 1, mark_executable, 0) void initFiles(void) { + PL_register_extensions(PL_predicates_from_files); } - - /******************************* - * PUBLISH PREDICATES * - *******************************/ - -BeginPredDefs(files) - PRED_DEF("working_directory", 2, working_directory, 0) - PRED_DEF("access_file", 2, access_file, 0) - PRED_DEF("time_file", 2, time_file, 0) - PRED_DEF("size_file", 2, size_file, 0) - PRED_DEF("read_link", 3, read_link, 0) - PRED_DEF("exists_file", 1, exists_file, 0) - PRED_DEF("exists_directory", 1, exists_directory, 0) - PRED_DEF("tmp_file", 2, tmp_file, 0) - PRED_DEF("tmp_file_stream", 3, tmp_file_stream, 0) - PRED_DEF("delete_file", 1, delete_file, 0) - PRED_DEF("delete_directory", 1, delete_directory, 0) - PRED_DEF("make_directory", 1, make_directory, 0) - PRED_DEF("same_file", 2, same_file, 0) - PRED_DEF("rename_file", 2, rename_file, 0) - PRED_DEF("is_absolute_file_name", 1, is_absolute_file_name, 0) - PRED_DEF("file_base_name", 2, file_base_name, 0) - PRED_DEF("file_directory_name", 2, file_directory_name, 0) - PRED_DEF("file_name_extension", 3, file_name_extension, 0) - PRED_DEF("prolog_to_os_filename", 2, prolog_to_os_filename, 0) - PRED_DEF("$mark_executable", 1, mark_executable, 0) - PRED_DEF("$absolute_file_name", 2, absolute_file_name, 0) -EndPredDefs diff --git a/packages/PLStream/pl-incl.h b/packages/PLStream/pl-incl.h index 23660feb0..6b1f38abf 100755 --- a/packages/PLStream/pl-incl.h +++ b/packages/PLStream/pl-incl.h @@ -286,6 +286,7 @@ typedef struct PL_local_data { occurs_check_t occurs_check; /* Unify and occurs check */ } prolog_flag; + void * glob_info; /* pl-glob.c */ IOENC encoding; /* default I/O encoding */ struct @@ -297,6 +298,18 @@ typedef struct PL_local_data { int rand_initialised; /* have we initialised random? */ } os; + struct + { int64_t pending; /* PL_raise() pending signals */ + int current; /* currently processing signal */ + int is_sync; /* current signal is synchronous */ + record_t exception; /* Pending exception from signal */ +#ifdef O_PLMT + simpleMutex sig_lock; /* lock delivery and processing */ +#endif + } signal; + + int critical; /* heap is being modified */ + struct { term_t term; /* exception term */ term_t bin; /* temporary handle for exception */ @@ -578,6 +591,9 @@ extern word notImplemented(char *name, int arity); /**** stuff from pl-ctype.c ****/ extern void initCharTypes(void); +/**** stuff from pl-glob.c ****/ +extern void initGlob(void); + /**** stuff from pl-os.c ****/ extern void cleanupOs(void); extern void PL_clock_wait_ticks(long waited); diff --git a/packages/PLStream/pl-util.c b/packages/PLStream/pl-util.c new file mode 100644 index 000000000..299e9a34a --- /dev/null +++ b/packages/PLStream/pl-util.c @@ -0,0 +1,96 @@ + +#include "pl-incl.h" +#include "pl-ctype.h" + +#ifndef HAVE_STRICMP +int +stricmp(const char *s1, const char *s2) +{ while(*s1 && makeLower(*s1) == makeLower(*s2)) + s1++, s2++; + + return makeLower(*s1) - makeLower(*s2); +} +#endif + +bool +stripostfix(char *s, char *e) +{ int ls = strlen(s); + int le = strlen(e); + + if ( ls >= le ) + return stricmp(&s[ls-le], e) == 0; + + return FALSE; +} + +#if !defined(HAVE_MBSCOLL) || !defined(HAVE_MBCASESCOLL) +static void +wstolower(wchar_t *w, size_t len) +{ wchar_t *e = &w[len]; + + for( ; w= le ) - return stricmp(&s[ls-le], e) == 0; - - return FALSE; -} - diff --git a/packages/PLStream/pl-yap.c b/packages/PLStream/pl-yap.c index 83a69b568..f5d04129a 100644 --- a/packages/PLStream/pl-yap.c +++ b/packages/PLStream/pl-yap.c @@ -198,7 +198,7 @@ switch(n->type) int _PL_unify_atomic(term_t t, PL_atomic_t a) { - return YAP_Unify(YAP_GetFromSlot(t), (YAP_Term)a); + return PL_unify_atom(t, a); } word lookupAtom(const char *s, size_t len) @@ -588,3 +588,11 @@ PL_unify_chars(term_t t, int flags, size_t len, const char *s) return rc; } +X_API int PL_handle_signals(void) +{ + if ( !LD || LD->critical || !LD->signal.pending ) + return 0; + fprintf(stderr,"PL_handle_signals not implemented\n"); + return 0; +} +