This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/os/sysbits.c

1974 lines
47 KiB
C
Raw Normal View History

/*************************************************************************
2015-04-24 17:03:44 +01:00
* *
* YAP Prolog *
* *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
* *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
* *
**************************************************************************
2015-07-06 12:03:16 +01:00
* PrologPathProkoh
2015-04-24 17:03:44 +01:00
* *
* File: sysbits.c *
* Last rev: 4/03/88 *
* mods: *
* comments: very much machine dependent routines *
* *
*************************************************************************/
#ifdef SCCS
static char SccsId[] = "%W% %G%";
#endif
2015-11-05 16:47:11 +00:00
#include "sysbits.h"
2015-04-13 13:28:17 +01:00
/// File Error Handler
static void
Yap_FileError(yap_error_number type, Term where, const char *format,...)
{
2015-07-06 12:03:16 +01:00
2015-06-17 23:49:02 +01:00
if ( trueLocalPrologFlag(FILEERRORS_FLAG) ) {
va_list ap;
2015-04-13 13:28:17 +01:00
va_start (ap, format);
/* now build the error string */
Yap_Error(type, TermNil, format, ap);
va_end (ap);
}
}
2015-04-13 13:28:17 +01:00
2013-04-25 23:15:04 +01:00
static Int p_sh( USES_REGS1 );
static Int p_shell( USES_REGS1 );
static Int p_system( USES_REGS1 );
static Int p_mv( USES_REGS1 );
static Int p_dir_sp( USES_REGS1 );
static Int p_getenv( USES_REGS1 );
static Int p_putenv( USES_REGS1 );
2015-06-17 23:49:02 +01:00
static char *expandVars(const char *pattern, char *expanded, int maxlen);
#ifdef MACYAP
2013-04-25 23:15:04 +01:00
static int chdir(char *);
/* #define signal skel_signal */
#endif /* MACYAP */
2013-04-25 23:15:04 +01:00
void exit(int);
2014-11-05 07:45:36 +00:00
#ifdef __WINDOWS__
2010-04-07 01:35:44 +01:00
void
Yap_WinError(char *yap_error)
{
char msg[256];
/* Error, we could not read time */
2015-04-24 17:03:44 +01:00
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), msg, 256,
NULL);
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "%s at %s", msg, yap_error);
}
2014-11-09 12:06:40 +00:00
#endif /* __WINDOWS__ */
#define is_valid_env_char(C) ( ((C) >= 'a' && (C) <= 'z') || ((C) >= 'A' && \
2015-04-24 17:03:44 +01:00
(C) <= 'Z') || (C) == '_' )
2015-04-13 13:28:17 +01:00
#if __ANDROID__
AAssetManager * Yap_assetManager;
void *
Yap_openAssetFile( const char *path ) {
const char * p = path+8;
AAsset* asset = AAssetManager_open(Yap_assetManager, p, AASSET_MODE_UNKNOWN);
return asset;
}
bool
Yap_isAsset( const char *path )
{
if (Yap_assetManager == NULL)
return false;
2015-04-13 13:28:17 +01:00
return path[0] == '/'&&
2015-04-24 17:03:44 +01:00
path[1] == 'a'&&
path[2] == 's'&&
path[3] == 's'&&
path[4] == 'e'&&
path[5] == 't'&&
path[6] == 's'&&
(path[7] == '/' || path[7] == '\0');
2015-04-13 13:28:17 +01:00
}
bool
Yap_AccessAsset( const char *name, int mode )
{
2015-04-24 17:03:44 +01:00
AAssetManager* mgr = Yap_assetManager;
const char *bufp=name+7;
2015-07-06 12:03:16 +01:00
2015-04-24 17:03:44 +01:00
if (bufp[0] == '/')
bufp++;
if ((mode & W_OK) == W_OK) {
return false;
}
// directory works if file exists
AAssetDir *assetDir = AAssetManager_openDir(mgr, bufp);
if (assetDir) {
AAssetDir_close(assetDir);
return true;
}
return false;
2015-04-13 13:28:17 +01:00
}
bool
Yap_AssetIsFile( const char *name )
{
2015-04-24 17:03:44 +01:00
AAssetManager* mgr = Yap_assetManager;
const char *bufp=name+7;
if (bufp[0] == '/')
2015-04-13 13:28:17 +01:00
bufp++;
2015-04-24 17:03:44 +01:00
// check if file is a directory.
AAsset *asset = AAssetManager_open(mgr, bufp, AASSET_MODE_UNKNOWN);
if (!asset)
return false;
AAsset_close(asset);
return true;
2015-04-13 13:28:17 +01:00
}
bool
Yap_AssetIsDir( const char *name )
{
2015-04-24 17:03:44 +01:00
AAssetManager* mgr = Yap_assetManager;
const char *bufp=name+7;
if (bufp[0] == '/')
2015-04-13 13:28:17 +01:00
bufp++;
2015-04-24 17:03:44 +01:00
// check if file is a directory.
AAssetDir *assetDir = AAssetManager_openDir(mgr, bufp);
if (!assetDir) {
return false;
}
AAssetDir_close(assetDir);
AAsset *asset = AAssetManager_open(mgr, bufp, AASSET_MODE_UNKNOWN);
if (!asset)
return true;
AAsset_close(asset);
return false;
2015-04-13 13:28:17 +01:00
}
int64_t
Yap_AssetSize( const char *name )
{
2015-04-24 17:03:44 +01:00
AAssetManager* mgr = Yap_assetManager;
const char *bufp=name+7;
if (bufp[0] == '/')
2015-04-13 13:28:17 +01:00
bufp++;
2015-04-24 17:03:44 +01:00
AAsset *asset = AAssetManager_open(mgr, bufp, AASSET_MODE_UNKNOWN);
if (!asset)
2015-04-13 13:28:17 +01:00
return -1;
off64_t len = AAsset_getLength64(asset);
2015-04-24 17:03:44 +01:00
AAsset_close(asset);
2015-04-13 13:28:17 +01:00
return len;
}
#endif
/// is_directory: verifies whether an expanded file name
/// points at a readable directory
static bool
2014-11-09 12:06:40 +00:00
is_directory(const char *FileName)
{
2015-04-13 13:28:17 +01:00
#ifdef __ANDROID__
if (Yap_isAsset(FileName)) {
2015-04-24 17:03:44 +01:00
return Yap_AssetIsDir(FileName);
}
2015-04-13 13:28:17 +01:00
#endif
2014-11-09 12:06:40 +00:00
#ifdef __WINDOWS__
DWORD dwAtts = GetFileAttributes( FileName );
2015-04-24 17:03:44 +01:00
if (dwAtts == INVALID_FILE_ATTRIBUTES)
return false;
return (dwAtts & FILE_ATTRIBUTE_DIRECTORY);
#elif HAVE_LSTAT
2015-04-24 17:03:44 +01:00
struct stat buf;
if (lstat(FileName, &buf) == -1) {
/* return an error number */
return false;
}
return S_ISDIR(buf.st_mode);
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
2015-04-24 17:03:44 +01:00
"stat not available in this configuration");
return false;
#endif
}
2014-11-09 12:06:40 +00:00
/// has_access just calls access
/// it uses F_OK, R_OK and friend
static bool
has_access(const char *FileName, int mode)
{
2015-04-13 13:28:17 +01:00
#ifdef __ANDROID__
if (Yap_isAsset(FileName)) {
2015-04-24 17:03:44 +01:00
return Yap_AccessAsset(FileName, mode);
}
2015-04-13 13:28:17 +01:00
#endif
#if HAVE_ACCESS
if (access( FileName, mode ) == 0)
return true;
if (errno == EINVAL) {
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
"bad flags to access");
}
return false;
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
2015-04-13 13:28:17 +01:00
"access not available in this configuration");
return false;
#endif
}
static bool
exists( const char *f)
{
return has_access( f, F_OK );
}
static int
2015-04-24 17:03:44 +01:00
dir_separator (int ch)
{
#ifdef MAC
return (ch == ':');
#elif ATARI || _MSC_VER
return (ch == '\\');
#elif defined(__MINGW32__) || defined(__CYGWIN__)
return (ch == '\\' || ch == '/');
#else
return (ch == '/');
#endif
}
int
Yap_dir_separator (int ch)
{
return dir_separator (ch);
}
2014-11-09 12:06:40 +00:00
#if __WINDOWS__
2014-11-28 02:30:58 +00:00
#include <psapi.h>
2014-11-09 12:06:40 +00:00
2014-11-28 02:30:58 +00:00
char *libdir = NULL;
#endif
2014-11-09 12:06:40 +00:00
2015-06-17 23:49:02 +01:00
bool
Yap_IsAbsolutePath(const char *p0)
{
2015-06-17 23:49:02 +01:00
// verify first if expansion is needed: ~/ or $HOME/
char c[MAXPATHLEN+1];
char *p = expandVars( p0, c, MAXPATHLEN );
#if _WIN32 || __MINGW32__
return !PathIsRelative(p);
#else
return p[0] == '/';
#endif
}
2015-04-13 13:28:17 +01:00
#define isValidEnvChar(C) ( ((C) >= 'a' && (C) <= 'z') || ((C) >= 'A' && \
2015-04-24 17:03:44 +01:00
(C) <= 'Z') || (C) == '_' )
2015-04-13 13:28:17 +01:00
// this is necessary because
// support for ~expansion at the beginning
// systems like Android do not do this.
static char *
yapExpandVars (const char *source, char *result)
{
const char *src = source;
char *res = result;
2015-06-17 23:49:02 +01:00
2015-04-24 17:03:44 +01:00
if(result == NULL)
result = malloc( YAP_FILENAME_MAX+1);
2015-04-13 13:28:17 +01:00
if (strlen(source) >= YAP_FILENAME_MAX) {
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "%s in true_file-name is larger than the buffer size (%d bytes)", source, strlen(source));
2015-04-13 13:28:17 +01:00
}
/* step 1: eating home information */
if (source[0] == '~') {
if (dir_separator(source[1]) || source[1] == '\0')
{
char *s;
src++;
#if defined(_WIN32)
s = getenv("HOMEDRIVE");
if (s != NULL)
strncpy (result, getenv ("HOMEDRIVE"), YAP_FILENAME_MAX);
2015-04-24 17:03:44 +01:00
//s = getenv("HOMEPATH");
2015-04-13 13:28:17 +01:00
#else
s = getenv ("HOME");
2015-04-24 17:03:44 +01:00
#endif
2015-04-13 13:28:17 +01:00
if (s != NULL)
strncpy (result, s, YAP_FILENAME_MAX);
2015-04-24 17:03:44 +01:00
strcat(result,src);
return result;
2015-04-13 13:28:17 +01:00
} else {
#if HAVE_GETPWNAM
struct passwd *user_passwd;
src++;
while (!dir_separator((*res = *src)) && *res != '\0')
2015-04-24 17:03:44 +01:00
res++, src++;
res[0] = '\0';
2015-04-13 13:28:17 +01:00
if ((user_passwd = getpwnam (result)) == NULL) {
2015-09-25 10:57:26 +01:00
Yap_FileError(SYSTEM_ERROR_OPERATING_SYSTEM, MkAtomTerm(Yap_LookupAtom(source)),"User %s does not exist in %s", result, source);
2015-04-13 13:28:17 +01:00
return NULL;
}
strncpy (result, user_passwd->pw_dir, YAP_FILENAME_MAX);
2015-04-24 17:03:44 +01:00
strcat(result, src);
2015-04-13 13:28:17 +01:00
#else
2015-09-25 10:57:26 +01:00
Yap_FileError(SYSTEM_ERROR_OPERATING_SYSTEM, MkAtomTerm(Yap_LookupAtom(source)),"User %s cannot be found in %s, missing getpwnam", result, source);
2015-04-13 13:28:17 +01:00
return NULL;
#endif
}
return result;
}
// do VARIABLE expansion
else if (source[0] == '$') {
/* follow SICStus expansion rules */
2015-04-24 17:03:44 +01:00
char v[YAP_FILENAME_MAX+1];
int ch;
2015-04-13 13:28:17 +01:00
char *s;
src = source+1;
if (src[0] == '{') {
2015-04-24 17:03:44 +01:00
res = v;
2015-04-13 13:28:17 +01:00
src++;
2015-04-24 17:03:44 +01:00
while ((*res = (ch = *src++)) && isValidEnvChar (ch) && ch != '}') {
res++;
2015-04-13 13:28:17 +01:00
}
if (ch == '}') {
2015-04-24 17:03:44 +01:00
// {...}
// done
res[0] = '\0';
2015-04-13 13:28:17 +01:00
}
2015-04-24 17:03:44 +01:00
} else {
res = v;
while ((*res = (ch = *src++)) && isValidEnvChar (ch) && ch != '}') {
res++;
2015-04-13 13:28:17 +01:00
}
src--;
res[0] = '\0';
}
2015-04-24 17:03:44 +01:00
if ((s = (char *) getenv (v))) {
strcpy (result, s);
strcat (result, src);
} else
strcpy( result, src);
2015-04-13 13:28:17 +01:00
}
else {
strncpy (result, source, YAP_FILENAME_MAX);
}
return result;
}
2015-06-17 23:49:02 +01:00
static char *
expandVars(const char *pattern, char *expanded, int maxlen)
{
2015-04-13 13:28:17 +01:00
2015-04-24 17:03:44 +01:00
return yapExpandVars(pattern, expanded);
}
#if _WIN32 || defined(__MINGW32__)
// straightforward conversion from Unix style to WIN style
// check cygwin path.cc for possible improvements
static char *
unix2win( const char *source, char *target, int max)
{
char *s = target;
const char *s0 = source;
char *s1;
int ch;
if (s == NULL)
s = malloc(YAP_FILENAME_MAX+1);
s1 = s;
// win32 syntax
// handle drive notation, eg //a/
if (s0[0] == '\0') {
s[0] = '.';
s[1] = '\0';
return s;
}
if (s0[0] == '/' && s0[1] == '/' && isalpha(s0[2]) && s0[3] == '/')
2015-04-24 17:03:44 +01:00
{
s1[0] = s0[2];
s1[1] = ':';
s1[2] = '\\';
s0+=4;
s1+=3;
}
while ((ch = *s1++ = *s0++)) {
if (ch == '$') {
s1[-1] = '%';
ch = *s0;
// handle $(....)
if (ch == '{') {
s0++;
while ((ch = *s0++) != '}') {
*s1++ = ch;
if (ch == '\0') return FALSE;
}
*s1++ = '%';
} else {
while (((ch = *s1++ = *s0++) >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch == '-') || (ch >= '0' && ch <= '9') || (ch == '_'));
s1[-1] = '%';
*s1++ = ch;
if (ch == '\0') { s1--; s0--; }
}
} else if (ch == '/')
s1[-1] = '\\';
}
return s;
}
#endif
2015-06-17 23:49:02 +01:00
static char *
OsPath(const char *p, char *buf)
2015-04-13 13:28:17 +01:00
{
2015-07-06 12:03:16 +01:00
return (char *)p;
}
2015-07-06 12:03:16 +01:00
2015-06-17 23:49:02 +01:00
static char *
2015-07-06 12:03:16 +01:00
PrologPath(const char *Y, char *X) {
2015-04-24 17:03:44 +01:00
return (char *)Y ;
}
2015-07-06 12:03:16 +01:00
#if _WIN32
#define HAVE_BASENAME 1
#define HAVE_REALPATH 1
#define HAVE_WORDEXP 1
#endif
2015-06-17 23:49:02 +01:00
static bool ChDir(const char *path) {
bool rc = false;
2015-06-17 23:49:02 +01:00
char *qpath = Yap_AbsoluteFile(path, NULL);
2015-04-13 13:28:17 +01:00
#ifdef __ANDROID__
if (GLOBAL_AssetsWD) {
free( GLOBAL_AssetsWD );
GLOBAL_AssetsWD = NULL;
}
if (Yap_isAsset(qpath) ) {
AAssetManager* mgr = Yap_assetManager;
const char *ptr = qpath+8;
AAssetDir* d;
if (ptr[0] == '/')
ptr++;
d = AAssetManager_openDir(mgr, ptr);
if (d) {
GLOBAL_AssetsWD = malloc( strlen(qpath) + 1 );
strcpy( GLOBAL_AssetsWD, qpath );
AAssetDir_close( d );
return true;
}
return false;
} else {
GLOBAL_AssetsWD = NULL;
}
#endif
#if _WIN32 || defined(__MINGW32__)
2015-07-06 12:03:16 +01:00
if ((rc = (SetCurrentDirectory(qpath) != 0)) == 0)
2015-04-24 17:03:44 +01:00
{
Yap_WinError("SetCurrentDirectory failed" );
}
#else
rc = (chdir(qpath) == 0);
#endif
free( qpath );
return rc;
}
#if _WIN32 || defined(__MINGW32__)
char *
BaseName(const char *X) {
2015-04-13 13:28:17 +01:00
char *qpath = unix2win(X, NULL, YAP_FILENAME_MAX);
char base[YAP_FILENAME_MAX], ext[YAP_FILENAME_MAX];
_splitpath(qpath, NULL, NULL, base, ext);
strcpy(qpath, base);
strcat(qpath, ext);
return qpath;
}
char *
DirName(const char *X) {
2015-04-13 13:28:17 +01:00
char dir[YAP_FILENAME_MAX];
char drive[YAP_FILENAME_MAX];
char *o = unix2win(X, NULL, YAP_FILENAME_MAX);
int err;
2015-04-13 13:28:17 +01:00
if (!o)
return NULL;
if (( err = _splitpath_s(o, drive, YAP_FILENAME_MAX-1, dir, YAP_FILENAME_MAX-1,NULL, 0, NULL, 0) ) != 0) {
2015-09-25 10:57:26 +01:00
Yap_FileError(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "could not perform _splitpath %s: %s", X, strerror(errno));
2015-04-13 13:28:17 +01:00
return NULL;
}
strncpy(o, drive, YAP_FILENAME_MAX-1);
strncat(o, dir, YAP_FILENAME_MAX-1);
return o;
}
#endif
static char *myrealpath( const char *path, char *out)
{
#if _WIN32 || defined(__MINGW32__)
DWORD retval=0;
2015-06-17 23:49:02 +01:00
// notice that the file does not need to exist
retval = GetFullPathName(path,
YAP_FILENAME_MAX,
out,
NULL);
2015-04-13 13:28:17 +01:00
if (retval == 0)
{
Yap_WinError("Generating a full path name for a file" );
return NULL;
}
return out;
#elif HAVE_REALPATH
{
char *rc = realpath(path,out);
char *s0;
2015-04-13 13:28:17 +01:00
if (rc == NULL && (errno == ENOENT|| errno == EACCES)) {
char *s = basename((char *)path);
s0 = malloc(strlen(s)+1);
strcpy(s0, s);
if ((rc = myrealpath(dirname((char *)path), out))==NULL) {
2015-09-25 10:57:26 +01:00
Yap_FileError(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "could not find file %s: %s", path, strerror(errno));
2015-04-13 13:28:17 +01:00
return NULL;
}
if(rc[strlen(rc)-1] != '/' )
strcat(rc, "/");
strcat(rc, s0);
free(s0);
}
2015-04-24 17:03:44 +01:00
return rc;
}
#else
return NULL;
2015-04-13 13:28:17 +01:00
#endif
}
char *
2015-06-17 23:49:02 +01:00
Yap_AbsoluteFile(const char *spec, char *tmp)
{
2015-07-06 12:03:16 +01:00
char *rc;
2015-04-13 13:28:17 +01:00
char o[YAP_FILENAME_MAX+1];
2015-04-24 17:03:44 +01:00
#if _WIN32 || defined(__MINGW32__)
2015-04-13 13:28:17 +01:00
char u[YAP_FILENAME_MAX+1];
// first pass, remove Unix style stuff
if (unix2win(spec, u, YAP_FILENAME_MAX) == NULL)
return NULL;
spec = (const char *)u;
#endif
if (tmp == NULL) {
tmp = malloc(YAP_FILENAME_MAX+1);
if (tmp == NULL) {
return NULL;
}
}
2015-06-17 23:49:02 +01:00
if ( 1 || trueGlobalPrologFlag(FILE_NAME_VARIABLES_FLAG) )
{
2015-04-13 13:28:17 +01:00
spec=expandVars(spec,o,YAP_FILENAME_MAX);
}
2015-04-13 13:28:17 +01:00
#if HAVE_REALPATH
rc = myrealpath(spec, tmp);
#endif
return rc;
}
2015-06-17 23:49:02 +01:00
/*
static char *canoniseFileName( char *path) {
#if HAVE_REALPATH && HAVE_BASENAME
2015-04-13 13:28:17 +01:00
#if _WIN32 || defined(__MINGW32__)
2015-04-24 17:03:44 +01:00
char *o = malloc(YAP_FILENAME_MAX+1);
if (!o)
return NULL;
// first pass, remove Unix style stuff
if (unix2win(path, o, YAP_FILENAME_MAX) == NULL)
return NULL;
path = o;
2015-04-13 13:28:17 +01:00
#endif
char *rc, *tmp = malloc(PATH_MAX);
if (tmp == NULL) return NULL;
rc = myrealpath(path, tmp);
if (rc != tmp)
free(tmp);
#if _WIN32 || defined(__MINGW32__)
free(o);
#endif
return rc;
#endif
}
2015-06-17 23:49:02 +01:00
*/
2015-11-05 16:47:11 +00:00
2015-06-17 23:49:02 +01:00
static Int
absolute_file_name( USES_REGS1 )
{
Term t = Deref(ARG1);
const char *fp;
bool rc;
char s[MAXPATHLEN+1];
2015-07-06 12:03:16 +01:00
2015-06-17 23:49:02 +01:00
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR, t, "absolute_file_name");
return false;
} else if (!IsAtomTerm(t)) {
Yap_Error(TYPE_ERROR_ATOM, t, "absolute_file_name");
return false;
}
if (!(fp = Yap_AbsoluteFile( RepAtom(AtomOfTerm(t))->StrOfAE, s)))
return false;
rc = Yap_unify(MkAtomTerm(Yap_LookupAtom(fp)), ARG2);
if (fp != s)
free( (void *)fp );
return rc;
}
static Int
prolog_to_os_filename( USES_REGS1 )
{
2015-07-06 12:03:16 +01:00
Term t = Deref(ARG1), t2 = Deref(ARG2);
char *fp;
2015-06-17 23:49:02 +01:00
char out[MAXPATHLEN+1];
2015-07-06 12:03:16 +01:00
if (IsVarTerm(t)) {
if (IsVarTerm(t2)) {
Yap_Error(INSTANTIATION_ERROR, t, "prolog_to_os_filename");
return false;
} else if ( IsAtomTerm(t2) ) {
if (!(fp = PrologPath( RepAtom(AtomOfTerm(t2))->StrOfAE, out)))
return false;
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom( fp )));
} else {
Yap_Error(TYPE_ERROR_ATOM, t2, "prolog_to_os_filename");
return false;
}
2015-06-17 23:49:02 +01:00
} else if (!IsAtomTerm(t)) {
2015-07-06 12:03:16 +01:00
Yap_Error(TYPE_ERROR_ATOM, t, "prolog_to_os_filename");
2015-06-17 23:49:02 +01:00
return false;
}
2015-07-06 12:03:16 +01:00
if (!(fp = OsPath( RepAtom(AtomOfTerm(t))->StrOfAE, out)))
2015-06-17 23:49:02 +01:00
return false;
return Yap_unify(MkAtomTerm(Yap_LookupAtom(fp)), ARG2);
}
Atom Yap_TemporaryFile( const char *prefix, int *fd) {
#if HAVE_MKSTEMP
char *tmp = malloc(PATH_MAX);
int n;
int f;
2015-06-17 23:49:02 +01:00
if (tmp == NULL) return NIL;
strncpy(tmp, prefix, PATH_MAX-1);
n = strlen( tmp );
if (n >= 6 &&
tmp[n-1] == 'X' &&
tmp[n-2] == 'X' &&
tmp[n-3] == 'X' &&
tmp[n-4] == 'X' &&
tmp[n-5] == 'X' &&
tmp[n-6] == 'X')
f = mkstemp(tmp);
else {
strncat(tmp, "XXXXXX", PATH_MAX-1);
f = mkstemp(tmp);
}
if (fd) *fd = f;
2015-06-17 23:49:02 +01:00
return Yap_LookupAtom(tmp);
#else
2015-06-17 23:49:02 +01:00
return AtomNil;
#endif
}
2015-07-06 12:03:16 +01:00
/** @pred make_directory(+ _Dir_)
Create a directory _Dir_. The name of the directory must be an atom.
*/
static Int
make_directory( USES_REGS1 )
{
const char *fd = AtomName(AtomOfTerm(ARG1));
#if defined(__MINGW32__) || _MSC_VER
if (_mkdir(fd) == -1) {
#else
if (mkdir(fd, 0777) == -1) {
#endif
/* return an error number */
return false; // errno?
}
return true;
}
static Int
p_rmdir( USES_REGS1 )
{
const char *fd = AtomName(AtomOfTerm(ARG1));
#if defined(__MINGW32__) || _MSC_VER
if (_rmdir(fd) == -1) {
#else
if (rmdir(fd) == -1) {
#endif
/* return an error number */
return(Yap_unify(ARG2, MkIntTerm(errno)));
}
return true;
}
static bool
2014-11-28 03:21:32 +00:00
initSysPath(Term tlib, Term tcommons, bool dir_done, bool commons_done) {
2014-11-28 02:30:58 +00:00
CACHE_REGS
int len;
2014-11-09 12:06:40 +00:00
2015-02-16 11:43:42 +00:00
#if __WINDOWS__
{
char *dir;
if ((dir = Yap_RegistryGetString("library")) &&
is_directory(dir)) {
if (! Yap_unify( tlib,
MkAtomTerm(Yap_LookupAtom(dir))) )
return FALSE;
}
dir_done = true;
if ((dir = Yap_RegistryGetString("prolog_commons")) &&
is_directory(dir)) {
if (! Yap_unify( tcommons,
MkAtomTerm(Yap_LookupAtom(dir))) )
return FALSE;
}
commons_done = true;
}
if (dir_done && commons_done)
return TRUE;
#endif
2014-11-28 02:30:58 +00:00
strncpy(LOCAL_FileNameBuf, YAP_SHAREDIR, YAP_FILENAME_MAX);
strncat(LOCAL_FileNameBuf,"/", YAP_FILENAME_MAX);
len = strlen(LOCAL_FileNameBuf);
if (!dir_done) {
strncat(LOCAL_FileNameBuf, "Yap", YAP_FILENAME_MAX);
2015-01-20 03:00:42 +00:00
if (is_directory(LOCAL_FileNameBuf))
2014-11-28 02:30:58 +00:00
{
if (! Yap_unify( tlib,
MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) )
return FALSE;
2015-06-17 23:49:02 +01:00
dir_done = true;
2014-11-28 02:30:58 +00:00
}
}
if (!commons_done) {
LOCAL_FileNameBuf[len] = '\0';
strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX);
if (is_directory(LOCAL_FileNameBuf)) {
if (! Yap_unify( tcommons,
MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) )
return FALSE;
}
2014-11-28 03:21:32 +00:00
commons_done = true;
2014-11-28 02:30:58 +00:00
}
if (dir_done && commons_done)
return TRUE;
2014-11-28 02:30:58 +00:00
#if __WINDOWS__
{
size_t buflen;
char *pt;
/* couldn't find it where it was supposed to be,
let's try using the executable */
if (!GetModuleFileName( NULL, LOCAL_FileNameBuf, YAP_FILENAME_MAX)) {
2015-01-20 03:00:42 +00:00
Yap_WinError( "could not find executable name" );
2014-11-28 02:30:58 +00:00
/* do nothing */
return FALSE;
}
buflen = strlen(LOCAL_FileNameBuf);
pt = LOCAL_FileNameBuf+buflen;
while (*--pt != '\\') {
/* skip executable */
if (pt == LOCAL_FileNameBuf) {
2015-09-25 10:57:26 +01:00
Yap_FileError(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "could not find executable name");
2014-11-28 02:30:58 +00:00
/* do nothing */
return FALSE;
}
}
while (*--pt != '\\') {
/* skip parent directory "bin\\" */
if (pt == LOCAL_FileNameBuf) {
2015-09-25 10:57:26 +01:00
Yap_FileError(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "could not find executable name");
2014-11-28 02:30:58 +00:00
/* do nothing */
return FALSE;
}
}
/* now, this is a possible location for the ROOT_DIR, let's look for a share directory here */
pt[1] = '\0';
/* grosse */
strncat(LOCAL_FileNameBuf,"lib\\Yap",YAP_FILENAME_MAX);
libdir = Yap_AllocCodeSpace(strlen(LOCAL_FileNameBuf)+1);
strncpy(libdir, LOCAL_FileNameBuf, strlen(LOCAL_FileNameBuf)+1);
pt[1] = '\0';
strncat(LOCAL_FileNameBuf,"share",YAP_FILENAME_MAX);
}
strncat(LOCAL_FileNameBuf,"\\", YAP_FILENAME_MAX);
len = strlen(LOCAL_FileNameBuf);
strncat(LOCAL_FileNameBuf, "Yap", YAP_FILENAME_MAX);
if (!dir_done && is_directory(LOCAL_FileNameBuf)) {
if (! Yap_unify( tlib,
MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) )
return FALSE;
}
2014-11-28 03:21:32 +00:00
dir_done = true;
2014-11-28 02:30:58 +00:00
LOCAL_FileNameBuf[len] = '\0';
strncat(LOCAL_FileNameBuf, "PrologCommons", YAP_FILENAME_MAX);
2015-11-05 16:47:11 +00:00
if (!commons_done && is_directory(LOCAL_FileNameBuf)) {
if (! Yap_unify( tcommons,
MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf))) )
return FALSE;
}
commons_done = true;
#endif
2015-11-05 16:47:11 +00:00
return dir_done && commons_done;
2014-03-15 23:47:29 +00:00
}
2015-11-05 16:47:11 +00:00
static Int
libraries_directories( USES_REGS1 )
{
2015-11-05 16:47:11 +00:00
return initSysPath( ARG1, ARG2 , false, false );
}
static Int
2015-11-05 16:47:11 +00:00
system_library( USES_REGS1 )
{
2015-11-05 16:47:11 +00:00
return initSysPath( ARG1, MkVarTerm(), false, true );
}
2015-11-05 16:47:11 +00:00
static Int
commons_library( USES_REGS1 )
{
2015-11-05 16:47:11 +00:00
return initSysPath( MkVarTerm(), ARG1, true, false );
}
2015-11-05 16:47:11 +00:00
static Int
p_dir_sp ( USES_REGS1 )
{
2015-11-05 16:47:11 +00:00
#ifdef MAC
Term t = MkIntTerm(':');
Term t2 = MkIntTerm('/');
#elif ATARI || _MSC_VER || defined(__MINGW32__)
Term t = MkIntTerm('\\');
Term t2 = MkIntTerm('/');
#else
2015-11-05 16:47:11 +00:00
Term t = MkIntTerm('/');
Term t2 = MkIntTerm('/');
#endif
2015-11-05 16:47:11 +00:00
return Yap_unify_constant(ARG1,t) || Yap_unify_constant(ARG1,t2) ;
}
2015-11-05 16:47:11 +00:00
void
Yap_InitPageSize(void)
{
2015-11-05 16:47:11 +00:00
#ifdef _WIN32
SYSTEM_INFO si;
GetSystemInfo(&si);
Yap_page_size = si.dwPageSize;
#elif HAVE_UNISTD_H
#if defined(__FreeBSD__) || defined(__DragonFly__)
Yap_page_size = getpagesize();
#elif defined(_AIX)
Yap_page_size = sysconf(_SC_PAGE_SIZE);
#elif !defined(_SC_PAGESIZE)
Yap_page_size = getpagesize();
#else
2015-11-05 16:47:11 +00:00
Yap_page_size = sysconf(_SC_PAGESIZE);
#endif
#else
2015-11-05 16:47:11 +00:00
bla bla
#endif
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
/* TrueFileName -> Finds the true name of a file */
#ifdef __MINGW32__
#include <ctype.h>
#endif
2015-04-24 17:03:44 +01:00
static int
volume_header(char *file)
{
#if _MSC_VER || defined(__MINGW32__)
2015-04-24 17:03:44 +01:00
char *ch = file;
int c;
2015-04-24 17:03:44 +01:00
while ((c = ch[0]) != '\0') {
if (isalnum(c)) ch++;
else return(c == ':');
}
#endif
2015-04-24 17:03:44 +01:00
return(FALSE);
}
2015-04-24 17:03:44 +01:00
int
Yap_volume_header(char *file)
{
return volume_header(file);
}
2015-04-24 17:03:44 +01:00
const char * Yap_getcwd(const char *cwd, size_t cwdlen)
{
#if _WIN32 || defined(__MINGW32__)
2015-04-24 17:03:44 +01:00
if (GetCurrentDirectory(cwdlen, (char *)cwd) == 0)
{
Yap_WinError("GetCurrentDirectory failed" );
return NULL;
}
return (char *)cwd;
2015-06-17 23:49:02 +01:00
#elif __ANDROID__
2015-04-24 17:03:44 +01:00
if (GLOBAL_AssetsWD) {
return strncpy( (char *)cwd, (const char *)GLOBAL_AssetsWD, cwdlen);
}
#endif
return getcwd((char *)cwd, cwdlen);
}
2015-06-17 23:49:02 +01:00
static Int
working_directory(USES_REGS1)
{
char dir[YAP_FILENAME_MAX+1];
Term t1 = Deref(ARG1), t2;
if ( !IsVarTerm( t1 ) && !IsAtomTerm(t1) ) {
Yap_Error(TYPE_ERROR_ATOM, t1, "working_directory");
}
if (!Yap_unify( t1, MkAtomTerm(Yap_LookupAtom(Yap_getcwd(dir,YAP_FILENAME_MAX )))) )
return false;
t2 = Deref(ARG2);
if ( IsVarTerm( t2 ) ) {
Yap_Error(INSTANTIATION_ERROR, t2, "working_directory");
2015-07-06 12:03:16 +01:00
}
2015-06-17 23:49:02 +01:00
if ( !IsAtomTerm(t2) ) {
Yap_Error(TYPE_ERROR_ATOM, t2, "working_directory");
}
ChDir(RepAtom(AtomOfTerm(t2))->StrOfAE);
return true;
}
2015-04-24 17:03:44 +01:00
static char *
expandWithPrefix(const char *source, const char *root, char *result)
{
char *work;
char ares1[YAP_FILENAME_MAX+1];
work = expandVars( source, ares1, YAP_FILENAME_MAX);
// expand names first
2015-06-17 23:49:02 +01:00
if (root && !Yap_IsAbsolutePath( source ) ) {
2015-04-24 17:03:44 +01:00
char ares2[YAP_FILENAME_MAX+1];
strncpy( ares2, root, YAP_FILENAME_MAX );
strncat( ares2, "/", YAP_FILENAME_MAX );
strncat( ares2, work, YAP_FILENAME_MAX );
2015-06-17 23:49:02 +01:00
return Yap_AbsoluteFile( ares2, result );
2015-04-24 17:03:44 +01:00
} else {
// expand path
return myrealpath( work, result);
}
}
/** Yap_trueFileName: tries to generate the true name of file
2015-07-06 12:03:16 +01:00
*
*
2015-04-24 17:03:44 +01:00
* @param isource the proper file
* @param idef the default name fo rthe file, ie, startup.yss
* @param root the prefix
* @param result the output
* @param access verify whether the file has access permission
* @param ftype saved state, object, saved file, prolog file
* @param expand_root expand $ ~, etc
* @param in_lib library file
2015-07-06 12:03:16 +01:00
*
* @return
2015-04-24 17:03:44 +01:00
*/
bool
Yap_trueFileName (const char *isource, const char * idef, const char *iroot, char *result, bool access, file_type_t ftype, bool expand_root, bool in_lib)
{
2015-07-06 12:03:16 +01:00
char save_buffer[YAP_FILENAME_MAX+1];
const char *root, *source = isource;
2015-04-24 17:03:44 +01:00
int rc = FAIL_RESTORE;
int try = 0;
while ( rc == FAIL_RESTORE) {
bool done = false;
2015-07-06 12:03:16 +01:00
// { CACHE_REGS __android_log_print(ANDROID_LOG_ERROR, __FUNCTION__, "try=%d %s %s", try, isource, iroot) ; }
2015-04-24 17:03:44 +01:00
switch (try++) {
case 0: // path or file name is given;
2015-07-06 12:03:16 +01:00
root = iroot;
if (iroot || isource) {
source = ( isource ? isource : idef ) ;
} else {
2015-04-24 17:03:44 +01:00
done = true;
}
2015-04-24 17:03:44 +01:00
break;
case 1: // library directory is given in command line
if ( in_lib && ftype == YAP_SAVED_STATE) {
root = iroot;
2015-07-06 12:03:16 +01:00
source = ( isource ? isource : idef ) ;
2015-04-24 17:03:44 +01:00
} else
done = true;
break;
case 2: // use environment variable YAPLIBDIR
#if HAVE_GETENV
if ( in_lib) {
if (ftype == YAP_SAVED_STATE || ftype == YAP_OBJ) {
2015-07-06 12:03:16 +01:00
root = getenv("YAPLIBDIR");
2015-04-24 17:03:44 +01:00
} else {
root = getenv("YAPSHAREDIR");
}
2015-07-06 12:03:16 +01:00
source = ( isource ? isource : idef ) ;
2015-04-24 17:03:44 +01:00
} else
done = true;
break;
#else
2015-04-24 17:03:44 +01:00
done = true;
#endif
2015-04-24 17:03:44 +01:00
break;
case 3: // use compilation variable YAPLIBDIR
if ( in_lib) {
2015-07-06 12:03:16 +01:00
source = ( isource ? isource : idef ) ;
2015-04-24 17:03:44 +01:00
if (ftype == YAP_PL || ftype == YAP_QLY) {
root = YAP_SHAREDIR;
} else {
root = YAP_LIBDIR;
}
} else
done = true;
break;
2015-04-24 17:03:44 +01:00
case 4: // WIN stuff: registry
#if __WINDOWS__
2015-07-06 12:03:16 +01:00
if ( in_lib) {
2015-04-24 17:03:44 +01:00
source = ( ftype == YAP_PL || ftype == YAP_QLY ? "library" : "startup" ) ;
source = Yap_RegistryGetString( source );
root = NULL;
} else
#endif
2015-04-24 17:03:44 +01:00
done = true;
break;
2015-04-13 13:28:17 +01:00
2015-04-24 17:03:44 +01:00
case 5: // search from the binary
{
#ifndef __ANDROID__
2015-04-24 17:03:44 +01:00
done = true;
break;
#endif
2015-04-24 17:03:44 +01:00
const char *pt = Yap_FindExecutable();
2015-04-24 17:03:44 +01:00
if (pt) {
source = ( ftype == YAP_SAVED_STATE || ftype == YAP_OBJ ? "../../lib/Yap" : "../../share/Yap" ) ;
if (Yap_trueFileName(source, NULL, pt, save_buffer, access, ftype, expand_root, in_lib) )
root = save_buffer;
2015-07-06 12:03:16 +01:00
else
2015-04-24 17:03:44 +01:00
done = true;
} else {
done = true;
}
source = ( isource ? isource : idef ) ;
}
break;
case 6: // default, try current directory
if (!isource && ftype == YAP_SAVED_STATE)
source = idef;
root = NULL;
break;
default:
return false;
}
2015-07-06 12:03:16 +01:00
2015-04-24 17:03:44 +01:00
if (done)
continue;
if (expand_root && root) {
root = expandWithPrefix( root, NULL, save_buffer );
}
// { CACHE_REGS __android_log_print(ANDROID_LOG_ERROR, __FUNCTION__, "root= %s %s ", root, source) ; }
char *work = expandWithPrefix( source, root, result );
2015-07-06 12:03:16 +01:00
2015-04-24 17:03:44 +01:00
// expand names in case you have
// to add a prefix
if ( !access || exists( work ) )
return true; // done
}
return false;
}
2015-04-13 13:28:17 +01:00
2015-04-24 17:03:44 +01:00
int
Yap_TrueFileName (const char *source, char *result, int in_lib)
{
2015-07-06 12:03:16 +01:00
return Yap_trueFileName (source, NULL, NULL, result, true, YAP_PL, true, in_lib);
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
int
Yap_TruePrefixedFileName (const char *source, const char *root, char *result, int in_lib)
{
2015-07-06 12:03:16 +01:00
return Yap_trueFileName (source, NULL, root, result, true, YAP_PL, true, in_lib);
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
static Int
p_true_file_name ( USES_REGS1 )
{
Term t = Deref(ARG1);
2015-01-20 03:00:42 +00:00
2015-04-24 17:03:44 +01:00
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR,t,"argument to true_file_name unbound");
return FALSE;
}
if (!IsAtomTerm(t)) {
Yap_Error(TYPE_ERROR_ATOM,t,"argument to true_file_name");
return FALSE;
}
2015-07-06 12:03:16 +01:00
if (!Yap_trueFileName (RepAtom(AtomOfTerm(t))->StrOfAE, NULL, NULL, LOCAL_FileNameBuf, true, YAP_PL, false, false))
2015-04-24 17:03:44 +01:00
return FALSE;
return Yap_unify(ARG2, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)));
}
2013-11-08 12:43:07 +00:00
2015-04-24 17:03:44 +01:00
static Int
p_expand_file_name ( USES_REGS1 )
{
Term t = Deref(ARG1);
2015-01-20 03:00:42 +00:00
2015-04-24 17:03:44 +01:00
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR,t,"argument to true_file_name unbound");
return FALSE;
}
if (!IsAtomTerm(t)) {
Yap_Error(TYPE_ERROR_ATOM,t,"argument to true_file_name");
return FALSE;
}
2015-07-06 12:03:16 +01:00
if (!Yap_trueFileName (RepAtom(AtomOfTerm(t))->StrOfAE, NULL, NULL, LOCAL_FileNameBuf, true, YAP_PL, true, false))
2015-04-24 17:03:44 +01:00
return false;
return Yap_unify(ARG2, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)));
2013-11-08 12:43:07 +00:00
}
2015-04-24 17:03:44 +01:00
static Int
p_true_file_name3 ( USES_REGS1 )
{
Term t = Deref(ARG1), t2 = Deref(ARG2);
char *root = NULL;
2015-01-20 03:00:42 +00:00
2015-04-24 17:03:44 +01:00
if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR,t,"argument to true_file_name unbound");
return FALSE;
}
if (!IsAtomTerm(t)) {
2015-04-24 17:03:44 +01:00
Yap_Error(TYPE_ERROR_ATOM,t,"argument to true_file_name");
return FALSE;
}
2015-04-24 17:03:44 +01:00
if (!IsVarTerm(t2)) {
if (!IsAtomTerm(t)) {
Yap_Error(TYPE_ERROR_ATOM,t2,"argument to true_file_name");
return FALSE;
}
root = RepAtom(AtomOfTerm(t2))->StrOfAE;
}
2015-07-06 12:03:16 +01:00
if (!Yap_trueFileName (RepAtom(AtomOfTerm(t))->StrOfAE, NULL, root, LOCAL_FileNameBuf, true, YAP_PL, false, false))
2015-04-24 17:03:44 +01:00
return FALSE;
return Yap_unify(ARG3, MkAtomTerm(Yap_LookupAtom(LOCAL_FileNameBuf)));
}
2015-04-24 17:03:44 +01:00
/* Executes $SHELL under Prolog */
/** @pred sh
2014-09-15 19:10:49 +01:00
2015-04-24 17:03:44 +01:00
Creates a new shell interaction.
2015-01-20 03:00:42 +00:00
2015-04-24 17:03:44 +01:00
*/
static Int
p_sh ( USES_REGS1 )
{ /* sh */
#ifdef HAVE_SYSTEM
2015-04-24 17:03:44 +01:00
char *shell;
shell = (char *) getenv ("SHELL");
if (shell == NULL)
shell = "/bin/sh";
if (system (shell) < 0) {
#if HAVE_STRERROR
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "%s in sh/0", strerror(errno));
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil, "in sh/0");
#endif
2015-04-24 17:03:44 +01:00
return FALSE;
}
return TRUE;
#else
#ifdef MSH
2015-04-24 17:03:44 +01:00
register char *shell;
shell = "msh -i";
system (shell);
return (TRUE);
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL,TermNil,"sh not available in this configuration");
2015-04-24 17:03:44 +01:00
return(FALSE);
#endif /* MSH */
#endif
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
/** shell(+Command:text, -Status:integer) is det.
2014-03-06 02:09:48 +00:00
2015-04-24 17:03:44 +01:00
Run an external command and wait for its completion.
*/
static Int
p_shell ( USES_REGS1 )
{ /* '$shell'(+SystCommand) */
2014-09-15 19:10:49 +01:00
#if _MSC_VER || defined(__MINGW32__)
2015-04-24 17:03:44 +01:00
char *cmd;
term_t A1 = Yap_InitSlot(ARG1);
if ( PL_get_chars(A1, &cmd, CVT_ALL|REP_FN|CVT_EXCEPTION) )
{ int rval = System(cmd);
2014-03-06 02:09:48 +00:00
2015-04-24 17:03:44 +01:00
return rval == 0;
}
2014-03-06 02:09:48 +00:00
2015-04-24 17:03:44 +01:00
return FALSE;
#else
2015-01-20 03:00:42 +00:00
#if HAVE_SYSTEM
2015-04-24 17:03:44 +01:00
char *shell;
register int bourne = FALSE;
Term t1 = Deref (ARG1);
const char *cmd;
shell = (char *) getenv ("SHELL");
if (!strcmp (shell, "/bin/sh"))
bourne = TRUE;
if (shell == NIL)
bourne = TRUE;
if (IsAtomTerm(t1))
cmd = RepAtom(AtomOfTerm(t1))->StrOfAE;
else if (IsStringTerm(t1))
cmd = StringOfTerm(t1);
else
return FALSE;
/* Yap_CloseStreams(TRUE); */
if (bourne)
return system( cmd ) == 0;
else {
int status = -1;
int child = fork ();
if (child == 0) { /* let the children go */
if (!execl (shell, shell, "-c", cmd , NULL)) {
exit(-1);
}
exit(TRUE);
}
2015-04-24 17:03:44 +01:00
{ /* put the father on wait */
int result = child < 0 ||
/* vsc:I am not sure this is used, Stevens say wait returns an integer.
#if NO_UNION_WAIT
*/
wait ((&status)) != child ||
/*
#else
wait ((union wait *) (&status)) != child ||
#endif
*/
status == 0;
return result;
}
}
#else /* HAVE_SYSTEM */
#ifdef MSH
2015-04-24 17:03:44 +01:00
register char *shell;
shell = "msh -i";
/* Yap_CloseStreams(); */
system (shell);
return TRUE;
#else
2015-09-25 10:57:26 +01:00
Yap_Error (SYSTEM_ERROR_INTERNAL,TermNil,"shell not available in this configuration");
2015-04-24 17:03:44 +01:00
return FALSE;
#endif
#endif /* HAVE_SYSTEM */
#endif /* _MSC_VER */
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
/** system(+Command:text).
2014-09-15 19:10:49 +01:00
2015-04-24 17:03:44 +01:00
Run an external command.
*/
2014-09-15 19:10:49 +01:00
2015-04-24 17:03:44 +01:00
static Int
p_system ( USES_REGS1 )
{ /* '$system'(+SystCommand) */
2014-03-16 00:52:43 +00:00
#if _MSC_VER || defined(__MINGW32__)
2015-04-24 17:03:44 +01:00
char *cmd;
term_t A1 = Yap_InitSlot(ARG1);
if ( PL_get_chars(A1, &cmd, CVT_ALL|REP_FN|CVT_EXCEPTION) )
{ STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
cmd, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
2015-09-25 10:57:26 +01:00
Yap_Error( SYSTEM_ERROR_INTERNAL, ARG1, "CreateProcess failed (%d).\n", GetLastError() );
2015-04-24 17:03:44 +01:00
return FALSE;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
2014-03-16 00:52:43 +00:00
2015-04-24 17:03:44 +01:00
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
2014-03-16 00:52:43 +00:00
2015-04-24 17:03:44 +01:00
return TRUE;
}
2014-03-16 00:52:43 +00:00
2015-04-24 17:03:44 +01:00
return FALSE;
2014-03-16 00:52:43 +00:00
#elif HAVE_SYSTEM
2015-04-24 17:03:44 +01:00
Term t1 = Deref (ARG1);
const char *s;
2015-04-24 17:03:44 +01:00
if (IsVarTerm(t1)) {
Yap_Error(INSTANTIATION_ERROR,t1,"argument to system/1 unbound");
return FALSE;
2015-04-24 17:03:44 +01:00
} else if (IsAtomTerm(t1)) {
s = RepAtom(AtomOfTerm(t1))->StrOfAE;
} else if (IsStringTerm(t1)) {
s = StringOfTerm(t1);
} else {
if (!Yap_GetName (LOCAL_FileNameBuf, YAP_FILENAME_MAX, t1)) {
Yap_Error(TYPE_ERROR_ATOM,t1,"argument to system/1");
return FALSE;
}
s = LOCAL_FileNameBuf;
}
2015-04-24 17:03:44 +01:00
/* Yap_CloseStreams(TRUE); */
#if _MSC_VER
2015-04-24 17:03:44 +01:00
_flushall();
#endif
2015-04-24 17:03:44 +01:00
if (system (s)) {
#if HAVE_STRERROR
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM,t1,"%s in system(%s)", strerror(errno), s);
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM,t1,"in system(%s)", s);
#endif
2015-04-24 17:03:44 +01:00
return FALSE;
}
return TRUE;
#else
#ifdef MSH
2015-04-24 17:03:44 +01:00
register char *shell;
shell = "msh -i";
/* Yap_CloseStreams(); */
system (shell);
return (TRUE);
#undef command
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL,TermNil,"sh not available in this machine");
2015-04-24 17:03:44 +01:00
return(FALSE);
#endif
#endif /* HAVE_SYSTEM */
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
/* Rename a file */
/** @pred rename(+ _F_,+ _G_)
2014-09-15 19:10:49 +01:00
2015-04-24 17:03:44 +01:00
Renames file _F_ to _G_.
*/
static Int
p_mv ( USES_REGS1 )
{ /* rename(+OldName,+NewName) */
#if HAVE_LINK
2015-04-24 17:03:44 +01:00
int r;
char oldname[YAP_FILENAME_MAX], newname[YAP_FILENAME_MAX];
Term t1 = Deref (ARG1);
Term t2 = Deref (ARG2);
if (IsVarTerm(t1)) {
Yap_Error(INSTANTIATION_ERROR, t1, "first argument to rename/2 unbound");
} else if (!IsAtomTerm(t1)) {
Yap_Error(TYPE_ERROR_ATOM, t1, "first argument to rename/2 not atom");
}
if (IsVarTerm(t2)) {
Yap_Error(INSTANTIATION_ERROR, t2, "second argument to rename/2 unbound");
} else if (!IsAtomTerm(t2)) {
Yap_Error(TYPE_ERROR_ATOM, t2, "second argument to rename/2 not atom");
}
2015-07-06 12:03:16 +01:00
if (!Yap_trueFileName (RepAtom(AtomOfTerm(t1))->StrOfAE, NULL, NULL, oldname, true, YAP_STD, true, false))
2015-04-24 17:03:44 +01:00
return FALSE;
2015-07-06 12:03:16 +01:00
if (!Yap_trueFileName (RepAtom(AtomOfTerm(t2))->StrOfAE, NULL, NULL, oldname, true, YAP_STD, true, false))
2015-04-24 17:03:44 +01:00
return FALSE;
if ((r = link (oldname, newname)) == 0 && (r = unlink (oldname)) != 0)
unlink (newname);
if (r != 0) {
#if HAVE_STRERROR
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM,t2,"%s in rename(%s,%s)", strerror(errno),oldname,newname);
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM,t2,"in rename(%s,%s)",oldname,newname);
#endif
2015-04-24 17:03:44 +01:00
return FALSE;
}
return TRUE;
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL,TermNil,"rename/2 not available in this machine");
2015-04-24 17:03:44 +01:00
return (FALSE);
#endif
2015-04-24 17:03:44 +01:00
}
#ifdef MAC
2015-04-24 17:03:44 +01:00
void
Yap_SetTextFile (name)
char *name;
{
#ifdef MACC
2015-04-24 17:03:44 +01:00
SetFileType (name, 'TEXT');
SetFileSignature (name, 'EDIT');
#else
2015-04-24 17:03:44 +01:00
FInfo f;
FInfo *p = &f;
GetFInfo (name, 0, p);
p->fdType = 'TEXT';
#ifdef MPW
2015-04-24 17:03:44 +01:00
if (mpwshell)
p->fdCreator = 'MPS\0';
#endif
#ifndef LIGHT
2015-04-24 17:03:44 +01:00
else
p->fdCreator = 'EDIT';
#endif
2015-04-24 17:03:44 +01:00
SetFInfo (name, 0, p);
#endif
2015-04-24 17:03:44 +01:00
}
#endif
2015-04-24 17:03:44 +01:00
/* return YAP's environment */
static Int p_getenv( USES_REGS1 )
{
#if HAVE_GETENV
2015-04-24 17:03:44 +01:00
Term t1 = Deref(ARG1), to;
char *s, *so;
if (IsVarTerm(t1)) {
Yap_Error(INSTANTIATION_ERROR, t1,
"first arg of getenv/2");
return(FALSE);
} else if (!IsAtomTerm(t1)) {
Yap_Error(TYPE_ERROR_ATOM, t1,
"first arg of getenv/2");
return(FALSE);
} else s = RepAtom(AtomOfTerm(t1))->StrOfAE;
if ((so = getenv(s)) == NULL)
return(FALSE);
to = MkAtomTerm(Yap_LookupAtom(so));
return(Yap_unify_constant(ARG2,to));
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
2015-04-24 17:03:44 +01:00
"getenv not available in this configuration");
return (FALSE);
#endif
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
/* set a variable in YAP's environment */
static Int p_putenv( USES_REGS1 )
{
#if HAVE_PUTENV
2015-04-24 17:03:44 +01:00
Term t1 = Deref(ARG1), t2 = Deref(ARG2);
char *s, *s2, *p0, *p;
if (IsVarTerm(t1)) {
Yap_Error(INSTANTIATION_ERROR, t1,
"first arg to putenv/2");
return(FALSE);
} else if (!IsAtomTerm(t1)) {
Yap_Error(TYPE_ERROR_ATOM, t1,
"first arg to putenv/2");
return(FALSE);
} else s = RepAtom(AtomOfTerm(t1))->StrOfAE;
if (IsVarTerm(t2)) {
Yap_Error(INSTANTIATION_ERROR, t1,
"second arg to putenv/2");
return(FALSE);
} else if (!IsAtomTerm(t2)) {
Yap_Error(TYPE_ERROR_ATOM, t2,
"second arg to putenv/2");
return(FALSE);
} else s2 = RepAtom(AtomOfTerm(t2))->StrOfAE;
while (!(p0 = p = Yap_AllocAtomSpace(strlen(s)+strlen(s2)+3))) {
if (!Yap_growheap(FALSE, MinHeapGap, NULL)) {
2015-09-25 10:57:26 +01:00
Yap_Error(RESOURCE_ERROR_HEAP, TermNil, LOCAL_ErrorMessage);
2015-04-24 17:03:44 +01:00
return FALSE;
}
}
2015-04-24 17:03:44 +01:00
while ((*p++ = *s++) != '\0');
p[-1] = '=';
while ((*p++ = *s2++) != '\0');
if (putenv(p0) == 0)
return TRUE;
#if HAVE_STRERROR
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil,
2015-04-24 17:03:44 +01:00
"in putenv(%s)", strerror(errno), p0);
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_OPERATING_SYSTEM, TermNil,
2015-04-24 17:03:44 +01:00
"in putenv(%s)", p0);
#endif
2015-04-24 17:03:44 +01:00
return FALSE;
#else
2015-09-25 10:57:26 +01:00
Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
2015-04-24 17:03:44 +01:00
"putenv not available in this configuration");
return FALSE;
#endif
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
/* wrapper for alarm system call */
#if _MSC_VER || defined(__MINGW32__)
2015-04-24 17:03:44 +01:00
static DWORD WINAPI
DoTimerThread(LPVOID targ)
{
Int *time = (Int *)targ;
HANDLE htimer;
LARGE_INTEGER liDueTime;
htimer = CreateWaitableTimer(NULL, FALSE, NULL);
liDueTime.QuadPart = -10000000;
liDueTime.QuadPart *= time[0];
/* add time in usecs */
liDueTime.QuadPart -= time[1]*10;
/* Copy the relative time into a LARGE_INTEGER. */
if (SetWaitableTimer(htimer, &liDueTime,0,NULL,NULL,0) == 0) {
return(FALSE);
}
if (WaitForSingleObject(htimer, INFINITE) != WAIT_OBJECT_0)
fprintf(stderr,"WaitForSingleObject failed (%ld)\n", GetLastError());
Yap_signal (YAP_WINTIMER_SIGNAL);
/* now, say what is going on */
Yap_PutValue(AtomAlarm, MkAtomTerm(AtomTrue));
ExitThread(1);
#if _MSC_VER
2015-04-24 17:03:44 +01:00
return(0L);
#endif
2015-04-24 17:03:44 +01:00
}
#endif
2015-04-24 17:03:44 +01:00
static Int
p_host_type( USES_REGS1 ) {
Term out = MkAtomTerm(Yap_LookupAtom(HOST_ALIAS));
return(Yap_unify(out,ARG1));
}
2015-04-24 17:03:44 +01:00
static Int
p_yap_home( USES_REGS1 ) {
Term out = MkAtomTerm(Yap_LookupAtom(YAP_ROOTDIR));
return(Yap_unify(out,ARG1));
}
2015-04-24 17:03:44 +01:00
static Int
p_yap_paths( USES_REGS1 ) {
Term out1, out2, out3;
const char *env_destdir = getenv("DESTDIR");
char destdir[YAP_FILENAME_MAX+1];
if (env_destdir) {
strncat(destdir, env_destdir, YAP_FILENAME_MAX );
strncat(destdir, "/" YAP_LIBDIR, YAP_FILENAME_MAX );
out1 = MkAtomTerm(Yap_LookupAtom(destdir));
} else {
out1 = MkAtomTerm(Yap_LookupAtom(YAP_LIBDIR));
}
if (env_destdir) {
strncat(destdir, env_destdir, YAP_FILENAME_MAX );
strncat(destdir, "/" YAP_SHAREDIR, YAP_FILENAME_MAX );
out2 = MkAtomTerm(Yap_LookupAtom(destdir));
} else {
out2 = MkAtomTerm(Yap_LookupAtom(YAP_SHAREDIR));
}
if (env_destdir) {
strncat(destdir, env_destdir, YAP_FILENAME_MAX );
strncat(destdir, "/" YAP_BINDIR, YAP_FILENAME_MAX );
out3 = MkAtomTerm(Yap_LookupAtom(destdir));
} else {
out3 = MkAtomTerm(Yap_LookupAtom(YAP_BINDIR));
}
return(Yap_unify(out1,ARG1) &&
Yap_unify(out2,ARG2) &&
Yap_unify(out3,ARG3));
2014-03-04 12:02:26 +00:00
}
2015-04-24 17:03:44 +01:00
static Int
p_log_event( USES_REGS1 ) {
Term in = Deref(ARG1);
Atom at;
2014-06-22 17:35:05 +01:00
2015-04-24 17:03:44 +01:00
if (IsVarTerm(in))
return FALSE;
if (!IsAtomTerm(in))
return FALSE;
at = AtomOfTerm( in );
2014-06-22 17:35:05 +01:00
#if DEBUG
2015-04-24 17:03:44 +01:00
if (IsWideAtom(at) )
fprintf(stderr, "LOG %S\n", RepAtom(at)->WStrOfAE);
else if (IsBlob(at))
return FALSE;
else
fprintf(stderr, "LOG %s\n", RepAtom(at)->StrOfAE);
2014-06-22 17:35:05 +01:00
#endif
2015-04-24 17:03:44 +01:00
if (IsWideAtom(at) || IsBlob(at))
return FALSE;
LOG( " %s ",RepAtom(at)->StrOfAE);
return TRUE;
2014-06-22 17:35:05 +01:00
2015-04-24 17:03:44 +01:00
}
2014-06-22 17:35:05 +01:00
2015-04-24 17:03:44 +01:00
static Int
p_env_separator( USES_REGS1 ) {
#if defined(_WIN32)
2015-04-24 17:03:44 +01:00
return Yap_unify(MkIntegerTerm(';'),ARG1);
#else
2015-04-24 17:03:44 +01:00
return Yap_unify(MkIntegerTerm(':'),ARG1);
#endif
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
/*
* This is responsable for the initialization of all machine dependant
* predicates
*/
void
Yap_InitSysbits (void)
{
2015-11-05 16:47:11 +00:00
CACHE_REGS
2015-04-24 17:03:44 +01:00
#if __simplescalar__
{
char *pwd = getenv("PWD");
strncpy(GLOBAL_pwd,pwd,YAP_FILENAME_MAX);
}
#endif
2015-11-05 16:47:11 +00:00
Yap_InitWTime ();
Yap_InitRandom ();
2015-04-24 17:03:44 +01:00
/* let the caller control signals as it sees fit */
2015-11-05 16:47:11 +00:00
Yap_InitOSSignals (worker_id);
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
static Int
p_unix( USES_REGS1 )
{
#ifdef unix
2015-04-24 17:03:44 +01:00
return TRUE;
#else
#ifdef __unix__
2015-04-24 17:03:44 +01:00
return TRUE;
#else
#ifdef __APPLE__
2015-04-24 17:03:44 +01:00
return TRUE;
#else
2015-04-24 17:03:44 +01:00
return FALSE;
#endif
#endif
#endif
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
static Int
p_win32( USES_REGS1 )
{
#ifdef _WIN32
2015-04-24 17:03:44 +01:00
return TRUE;
#else
#ifdef __CYGWIN__
2015-04-24 17:03:44 +01:00
return TRUE;
#else
2015-04-24 17:03:44 +01:00
return FALSE;
#endif
#endif
2015-04-24 17:03:44 +01:00
}
2015-04-24 17:03:44 +01:00
static Int
p_ld_path( USES_REGS1 )
{
return Yap_unify(ARG1,MkAtomTerm(Yap_LookupAtom(YAP_LIBDIR)));
}
2015-04-24 17:03:44 +01:00
static Int
p_address_bits( USES_REGS1 )
{
#if SIZEOF_INT_P==4
2015-04-24 17:03:44 +01:00
return Yap_unify(ARG1,MkIntTerm(32));
#else
2015-04-24 17:03:44 +01:00
return Yap_unify(ARG1,MkIntTerm(64));
#endif
2015-04-24 17:03:44 +01:00
}
#ifdef _WIN32
2015-04-24 17:03:44 +01:00
/* This code is from SWI-Prolog by Jan Wielemaker */
#define wstreq(s,q) (wcscmp((s), (q)) == 0)
2015-04-24 17:03:44 +01:00
static HKEY
reg_open_key(const wchar_t *which, int create)
{ HKEY key = HKEY_CURRENT_USER;
DWORD disp;
LONG rval;
while(*which)
{ wchar_t buf[256];
wchar_t *s;
HKEY tmp;
for(s=buf; *which && !(*which == '/' || *which == '\\'); )
*s++ = *which++;
*s = '\0';
if ( *which )
which++;
if ( wstreq(buf, L"HKEY_CLASSES_ROOT") )
{ key = HKEY_CLASSES_ROOT;
continue;
} else if ( wstreq(buf, L"HKEY_CURRENT_USER") )
{ key = HKEY_CURRENT_USER;
continue;
} else if ( wstreq(buf, L"HKEY_LOCAL_MACHINE") )
{ key = HKEY_LOCAL_MACHINE;
continue;
} else if ( wstreq(buf, L"HKEY_USERS") )
{ key = HKEY_USERS;
continue;
}
2015-04-24 17:03:44 +01:00
if ( RegOpenKeyExW(key, buf, 0L, KEY_READ, &tmp) == ERROR_SUCCESS )
{ RegCloseKey(key);
key = tmp;
continue;
}
2015-04-24 17:03:44 +01:00
if ( !create )
return NULL;
rval = RegCreateKeyExW(key, buf, 0, L"", 0,
KEY_ALL_ACCESS, NULL, &tmp, &disp);
RegCloseKey(key);
if ( rval == ERROR_SUCCESS )
key = tmp;
else
return NULL;
}
return key;
}
#define MAXREGSTRLEN 1024
2015-04-24 17:03:44 +01:00
static void
recover_space(wchar_t *k, Atom At)
{
if (At->WStrOfAE != k)
Yap_FreeCodeSpace((char *)k);
}
2015-04-24 17:03:44 +01:00
static wchar_t *
WideStringFromAtom(Atom KeyAt USES_REGS)
{
if (IsWideAtom(KeyAt)) {
return KeyAt->WStrOfAE;
} else {
int len = strlen(KeyAt->StrOfAE);
int sz = sizeof(wchar_t)*(len+1);
char *chp = KeyAt->StrOfAE;
wchar_t *kptr, *k;
k = (wchar_t *)Yap_AllocCodeSpace(sz);
while (k == NULL) {
if (!Yap_growheap(FALSE, sz, NULL)) {
2015-09-25 10:57:26 +01:00
Yap_Error(RESOURCE_ERROR_HEAP, MkIntegerTerm(sz), "generating key in win_registry_get_value/3");
2015-04-24 17:03:44 +01:00
return FALSE;
}
2015-01-20 03:00:42 +00:00
}
2015-04-24 17:03:44 +01:00
kptr = k;
while ((*kptr++ = *chp++));
return k;
}
}
2015-04-24 17:03:44 +01:00
static Int
p_win_registry_get_value( USES_REGS1 )
{
DWORD type;
BYTE data[MAXREGSTRLEN];
DWORD len = sizeof(data);
wchar_t *k, *name;
HKEY key;
Term Key = Deref(ARG1);
Term Name = Deref(ARG2);
Atom KeyAt, NameAt;
if (IsVarTerm(Key)) {
Yap_Error(INSTANTIATION_ERROR,Key,"argument to win_registry_get_value unbound");
return FALSE;
}
if (!IsAtomTerm(Key)) {
Yap_Error(TYPE_ERROR_ATOM,Key,"argument to win_registry_get_value");
return FALSE;
}
KeyAt = AtomOfTerm(Key);
if (IsVarTerm(Name)) {
Yap_Error(INSTANTIATION_ERROR,Key,"argument to win_registry_get_value unbound");
return FALSE;
}
if (!IsAtomTerm(Name)) {
Yap_Error(TYPE_ERROR_ATOM,Key,"argument to win_registry_get_value");
return FALSE;
}
NameAt = AtomOfTerm(Name);
2015-04-24 17:03:44 +01:00
k = WideStringFromAtom(KeyAt PASS_REGS);
if ( !(key=reg_open_key(k, FALSE)) ) {
Yap_Error(EXISTENCE_ERROR_KEY, Key, "argument to win_registry_get_value");
recover_space(k, KeyAt);
return FALSE;
}
2015-04-24 17:03:44 +01:00
name = WideStringFromAtom(NameAt PASS_REGS);
if ( RegQueryValueExW(key, name, NULL, &type, data, &len) == ERROR_SUCCESS ) {
RegCloseKey(key);
switch(type) {
case REG_SZ:
recover_space(k, KeyAt);
recover_space(name, NameAt);
((wchar_t *)data)[len] = '\0';
return Yap_unify(MkAtomTerm(Yap_LookupMaybeWideAtom((wchar_t *)data)),ARG3);
case REG_DWORD:
recover_space(k, KeyAt);
recover_space(name, NameAt);
{
DWORD *d = (DWORD *)data;
return Yap_unify(MkIntegerTerm((Int)d[0]),ARG3);
}
default:
recover_space(k, KeyAt);
recover_space(name, NameAt);
return FALSE;
}
}
recover_space(k, KeyAt);
recover_space(name, NameAt);
return FALSE;
}
2015-04-24 17:03:44 +01:00
char *
Yap_RegistryGetString(char *name)
{
DWORD type;
BYTE data[MAXREGSTRLEN];
DWORD len = sizeof(data);
HKEY key;
char *ptr;
int i;
2012-06-21 09:09:49 +01:00
#if SIZEOF_INT_P == 8
2015-04-24 17:03:44 +01:00
if ( !(key=reg_open_key(L"HKEY_LOCAL_MACHINE/SOFTWARE/YAP/Prolog64", FALSE)) ) {
return NULL;
}
2012-06-21 09:09:49 +01:00
#else
2015-04-24 17:03:44 +01:00
if ( !(key=reg_open_key(L"HKEY_LOCAL_MACHINE/SOFTWARE/YAP/Prolog", FALSE)) ) {
return NULL;
}
2012-06-21 09:09:49 +01:00
#endif
2015-04-24 17:03:44 +01:00
if ( RegQueryValueEx(key, name, NULL, &type, data, &len) == ERROR_SUCCESS ) {
RegCloseKey(key);
switch(type) {
case REG_SZ:
ptr = malloc(len+2);
if (!ptr)
return NULL;
for (i=0; i<= len; i++)
ptr[i] = data[i];
ptr[len+1] = '\0';
return ptr;
default:
return NULL;
2015-04-24 17:03:44 +01:00
}
}
2015-04-24 17:03:44 +01:00
return NULL;
}
#endif
2015-04-24 17:03:44 +01:00
void
Yap_InitSysPreds(void)
{
CACHE_REGS
Yap_InitCPred ("log_event", 1, p_log_event, SafePredFlag|SyncPredFlag);
Yap_InitCPred ("sh", 0, p_sh, SafePredFlag|SyncPredFlag);
2015-06-17 23:49:02 +01:00
Yap_InitCPred ("$shell", 1, p_shell, SafePredFlag|SyncPredFlag);
2015-04-24 17:03:44 +01:00
Yap_InitCPred ("system", 1, p_system, SafePredFlag|SyncPredFlag|UserCPredFlag);
Yap_InitCPred ("rename", 2, p_mv, SafePredFlag|SyncPredFlag);
Yap_InitCPred ("$yap_home", 1, p_yap_home, SafePredFlag);
Yap_InitCPred ("$yap_paths", 3, p_yap_paths, SafePredFlag);
Yap_InitCPred ("$dir_separator", 1, p_dir_sp, SafePredFlag);
2015-06-17 23:49:02 +01:00
Yap_InitCPred ("libraries_directories",2, libraries_directories, 0);
Yap_InitCPred ("system_library", 1, system_library, 0);
Yap_InitCPred ("commons_library", 1, commons_library, 0);
2015-04-24 17:03:44 +01:00
Yap_InitCPred ("$getenv", 2, p_getenv, SafePredFlag);
Yap_InitCPred ("$putenv", 2, p_putenv, SafePredFlag|SyncPredFlag);
Yap_InitCPred ("$host_type", 1, p_host_type, SafePredFlag|SyncPredFlag);
Yap_InitCPred ("$env_separator", 1, p_env_separator, SafePredFlag);
Yap_InitCPred ("$unix", 0, p_unix, SafePredFlag);
Yap_InitCPred ("$win32", 0, p_win32, SafePredFlag);
Yap_InitCPred ("$ld_path", 1, p_ld_path, SafePredFlag);
Yap_InitCPred ("$address_bits", 1, p_address_bits, SafePredFlag);
Yap_InitCPred ("$expand_file_name", 2, p_expand_file_name, SyncPredFlag);
2015-06-17 23:49:02 +01:00
Yap_InitCPred ("working_directory", 2,working_directory, SyncPredFlag);
Yap_InitCPred ("prolog_to_os_filename", 2, prolog_to_os_filename, SyncPredFlag);
2015-11-05 16:47:11 +00:00
Yap_InitCPred ("prolog_to_os_filename", 2, prolog_to_os_filename, SyncPredFlag);
#ifdef _WIN32
2015-04-24 17:03:44 +01:00
Yap_InitCPred ("win_registry_get_value", 3, p_win_registry_get_value,0);
#endif
2015-11-05 16:47:11 +00:00
Yap_InitCPred ("absolute_file_name", 2, absolute_file_name, 0);
Yap_InitCPred ("true_file_name", 2,
true_file_name, SyncPredFlag);
Yap_InitCPred ("true_file_name", 3, true_file_name3, SyncPredFlag);
2015-07-06 12:03:16 +01:00
Yap_InitCPred ("rmdir", 2, p_rmdir, SyncPredFlag);
Yap_InitCPred ("make_directory", 1, make_directory, SyncPredFlag);
2015-04-24 17:03:44 +01:00
}
2015-11-05 16:47:11 +00:00