WIN64 support (sill needs improvement)
This commit is contained in:
@@ -5223,6 +5223,7 @@ init_yap(void)
|
||||
PL_register_extensions(PL_predicates_from_read);
|
||||
PL_register_extensions(PL_predicates_from_tai);
|
||||
PL_register_extensions(PL_predicates_from_prologflag);
|
||||
//PL_register_extensions(PL_predicates_from_system);
|
||||
#ifdef O_LOCALE
|
||||
PL_register_extensions(PL_predicates_from_locale);
|
||||
#endif
|
||||
|
22
os/pl-os.c
22
os/pl-os.c
@@ -110,6 +110,25 @@ static void initEnviron(void);
|
||||
#define DEFAULT_PATH "/bin:/usr/bin"
|
||||
#endif
|
||||
|
||||
/** shell(+Command:text, -Status:integer) is det.
|
||||
|
||||
Run an external command and wait for its completion.
|
||||
*/
|
||||
|
||||
static
|
||||
PRED_IMPL("shell", 2, shell, 0)
|
||||
{ GET_LD
|
||||
char *cmd;
|
||||
|
||||
if ( PL_get_chars(A1, &cmd, CVT_ALL|REP_FN|CVT_EXCEPTION) )
|
||||
{ int rval = System(cmd);
|
||||
|
||||
return PL_unify_integer(A2, rval);
|
||||
}
|
||||
|
||||
fail;
|
||||
}
|
||||
|
||||
/********************************
|
||||
* INITIALISATION *
|
||||
*********************************/
|
||||
@@ -2752,3 +2771,6 @@ Pause(double t)
|
||||
}
|
||||
#endif
|
||||
|
||||
BeginPredDefs(system)
|
||||
PRED_DEF("shell", 2, shell, 0)
|
||||
EndPredDefs
|
||||
|
13
os/pl-prologflag.c
Normal file → Executable file
13
os/pl-prologflag.c
Normal file → Executable file
@@ -196,6 +196,7 @@ setPrologFlag(const char *name, int flags, ...)
|
||||
text.canonical = FALSE;
|
||||
|
||||
f->value.a = textToAtom(&text); /* registered: ok */
|
||||
|
||||
PL_free_text(&text);
|
||||
|
||||
break;
|
||||
@@ -855,7 +856,9 @@ unify_prolog_flag_value(Module m, atom_t key, prolog_flag *f, term_t val)
|
||||
{ case FT_BOOL:
|
||||
if ( f->index >= 0 )
|
||||
{ unsigned int mask = (unsigned int)1 << (f->index-1);
|
||||
|
||||
char *s;
|
||||
s=PL_atom_chars(key);
|
||||
Sprintf(GLOBAL_stderr," here it is %s\n",s);
|
||||
return PL_unify_bool_ex(val, truePrologFlag(mask) != FALSE);
|
||||
}
|
||||
/*FALLTHROUGH*/
|
||||
@@ -1101,11 +1104,7 @@ initPrologFlags(void)
|
||||
#else
|
||||
setPrologFlag("dialect", FT_ATOM|FF_READONLY, "yap");
|
||||
setPrologFlag("home", FT_ATOM|FF_READONLY, YAP_ROOTDIR);
|
||||
if (GLOBAL_argv && GLOBAL_argv[0]) {
|
||||
Yap_TrueFileName (GLOBAL_argv[0], LOCAL_FileNameBuf, FALSE);
|
||||
setPrologFlag("executable", FT_ATOM|FF_READONLY, LOCAL_FileNameBuf);
|
||||
} else
|
||||
setPrologFlag("executable", FT_ATOM|FF_READONLY, Yap_FindExecutable());
|
||||
setPrologFlag("executable", FT_ATOM|FF_READONLY, Yap_FindExecutable());
|
||||
#endif
|
||||
#if defined(HAVE_GETPID) || defined(EMULATE_GETPID)
|
||||
setPrologFlag("pid", FT_INTEGER|FF_READONLY, getpid());
|
||||
@@ -1133,7 +1132,7 @@ initPrologFlags(void)
|
||||
setPrologFlag("agc_margin",FT_INTEGER, GD->atoms.margin);
|
||||
#endif
|
||||
#endif
|
||||
#if defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD) || defined(EMULATE_DLOPEN)
|
||||
#if defined(HAVE_DLOPEN) || defined(HAVE_SHL_LOAD) || defined(EMULATE_DLOPEN) || defined(HAVE_LOAD_LIBRARY)
|
||||
setPrologFlag("open_shared_object", FT_BOOL|FF_READONLY, TRUE, 0);
|
||||
setPrologFlag("shared_object_extension", FT_ATOM|FF_READONLY, SO_EXT);
|
||||
setPrologFlag("shared_object_search_path", FT_ATOM|FF_READONLY, SO_PATH);
|
||||
|
67
os/windows/uxnt.c
Normal file → Executable file
67
os/windows/uxnt.c
Normal file → Executable file
@@ -267,6 +267,36 @@ _xos_os_filenameW(const char *cname, wchar_t *osname, size_t len)
|
||||
*s++ = '\\';
|
||||
}
|
||||
|
||||
#if __MINGW32__
|
||||
if ( q == cname && q[0] == '/' ) /* deal with /host/share in mingw32 */
|
||||
{
|
||||
UINT is_drive;
|
||||
|
||||
q++;
|
||||
while (*q && *q != '/') {
|
||||
if ( s+3 >= e )
|
||||
{ errno = ENAMETOOLONG;
|
||||
return NULL;
|
||||
}
|
||||
*s++ = *q++;
|
||||
}
|
||||
s[0] = ':';
|
||||
s[1] = '\\';
|
||||
s[2] = '\0';
|
||||
q++;
|
||||
is_drive = GetDriveType( osname );
|
||||
if ( is_drive != DRIVE_UNKNOWN &&
|
||||
is_drive != DRIVE_NO_ROOT_DIR ) {
|
||||
// we actually found a drive
|
||||
s+=2;
|
||||
} else {
|
||||
// restart
|
||||
q = cname;
|
||||
s = osname;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
while( *q ) /* map / --> \, delete multiple '\' */
|
||||
{ if ( *q == '/' || *q == '\\' )
|
||||
{ if ( s+1 >= e )
|
||||
@@ -495,7 +525,42 @@ _xos_absolute_filename(const char *local, char *absolute, size_t len)
|
||||
|
||||
int
|
||||
_xos_same_file(const char *p1, const char *p2)
|
||||
{ if ( strcmp(p1, p2) == 0 )
|
||||
{
|
||||
TCHAR buf1[PATH_MAX];
|
||||
TCHAR buf2[PATH_MAX];
|
||||
int rc = FALSE, found = FALSE;
|
||||
if ( !_xos_os_filenameW(p1, buf1, PATH_MAX) )
|
||||
return FALSE;
|
||||
if ( !_xos_os_filenameW(p2, buf2, PATH_MAX) )
|
||||
return FALSE;
|
||||
|
||||
HANDLE hFile1 = CreateFile(buf1, 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
HANDLE hFile2 = CreateFile(buf2, 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if (hFile1 != INVALID_HANDLE_VALUE &&
|
||||
hFile2 != INVALID_HANDLE_VALUE) {
|
||||
BY_HANDLE_FILE_INFORMATION f1, f2;
|
||||
if (GetFileInformationByHandle(hFile1, &f1) &&
|
||||
GetFileInformationByHandle(hFile2, &f2) ) {
|
||||
rc =
|
||||
f1.dwVolumeSerialNumber == f2.dwVolumeSerialNumber &&
|
||||
f1.nFileIndexLow == f2.nFileIndexLow &&
|
||||
f1.nFileIndexLow == f2.nFileIndexLow;
|
||||
found = TRUE;
|
||||
}
|
||||
}
|
||||
if ( hFile1 != INVALID_HANDLE_VALUE )
|
||||
CloseHandle(hFile1);
|
||||
if ( hFile2 != INVALID_HANDLE_VALUE )
|
||||
CloseHandle(hFile2);
|
||||
|
||||
if (found)
|
||||
return rc;
|
||||
|
||||
// compare by string names
|
||||
// old SWI code
|
||||
|
||||
if ( strcmp(p1, p2) == 0 )
|
||||
{ return TRUE;
|
||||
} else
|
||||
{ TCHAR osp1[PATH_MAX], osp2[PATH_MAX];
|
||||
|
Reference in New Issue
Block a user