aboutsummaryrefslogtreecommitdiff
path: root/jim-file.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-11-07 08:55:09 +1000
committerSteve Bennett <steveb@workware.net.au>2011-11-07 15:31:41 +1000
commit05e51ed5447b83badfd8ed550c7386b68eb94919 (patch)
treec0c2c87069eaf34f9d90aaa8e810b7cf8f40c4fc /jim-file.c
parent5fe0bb5f3beedb262512a8e548bf7cc6ed9bff96 (diff)
downloadjimtcl-05e51ed5447b83badfd8ed550c7386b68eb94919.zip
jimtcl-05e51ed5447b83badfd8ed550c7386b68eb94919.tar.gz
jimtcl-05e51ed5447b83badfd8ed550c7386b68eb94919.tar.bz2
Allow building with MSVC on windows
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-file.c')
-rw-r--r--jim-file.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/jim-file.c b/jim-file.c
index 0ea6999..5e0eb7d 100644
--- a/jim-file.c
+++ b/jim-file.c
@@ -47,16 +47,27 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
-#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/time.h>
#include "jim.h"
#include "jimautoconf.h"
#include "jim-subcmd.h"
+#ifdef HAVE_UTIMES
+#include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#elif defined(_MSC_VER)
+#include <direct.h>
+#define F_OK 0
+#define W_OK 2
+#define R_OK 4
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif
+
# ifndef MAXPATHLEN
# define MAXPATHLEN JIM_PATH_LEN
# endif
@@ -86,25 +97,31 @@ static const char *JimGetFileType(int mode)
else if (S_ISDIR(mode)) {
return "directory";
}
+#ifdef S_ISCHR
else if (S_ISCHR(mode)) {
return "characterSpecial";
}
+#endif
+#ifdef S_ISBLK
else if (S_ISBLK(mode)) {
return "blockSpecial";
}
+#endif
+#ifdef S_ISFIFO
else if (S_ISFIFO(mode)) {
return "fifo";
-#ifdef S_ISLNK
}
+#endif
+#ifdef S_ISLNK
else if (S_ISLNK(mode)) {
return "link";
+ }
#endif
#ifdef S_ISSOCK
- }
else if (S_ISSOCK(mode)) {
return "socket";
-#endif
}
+#endif
return "unknown";
}
@@ -189,7 +206,7 @@ static int file_cmd_dirname(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
else if (p == path) {
Jim_SetResultString(interp, "/", -1);
}
-#if defined(__MINGW32__)
+#if defined(__MINGW32__) || defined(_MSC_VER)
else if (p[-1] == ':') {
/* z:/dir => z:/ */
Jim_SetResultString(interp, path, p - path + 1);
@@ -280,7 +297,7 @@ static int file_cmd_join(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
/* Absolute component, so go back to the start */
last = newname;
}
-#if defined(__MINGW32__)
+#if defined(__MINGW32__) || defined(_MSC_VER)
else if (strchr(part, ':')) {
/* Absolute compontent on mingw, so go back to the start */
last = newname;
@@ -349,7 +366,15 @@ static int file_cmd_writable(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static int file_cmd_executable(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
+#ifdef X_OK
return file_access(interp, argv[0], X_OK);
+#else
+ /* XXX: X_OK doesn't work under Windows.
+ * In any case, may need to add .exe, etc. so just lie!
+ */
+ Jim_SetResultBool(interp, 1);
+ return JIM_OK;
+#endif
}
static int file_cmd_exists(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
@@ -901,7 +926,7 @@ static int Jim_PwdCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Jim_SetResultString(interp, "Failed to get pwd", -1);
return JIM_ERR;
}
-#if defined(__MINGW32__)
+#if defined(__MINGW32__) || defined(_MSC_VER)
{
/* Try to keep backlashes out of paths */
char *p = cwd;