WIN64 support (sill needs improvement)

This commit is contained in:
Vitor Santos Costa
2014-03-06 02:09:48 +00:00
parent 49d643d98f
commit 2c89aadb11
59 changed files with 3460 additions and 2852 deletions

View File

@@ -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

View File

@@ -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
View 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
View 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];