aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2013-02-11 20:56:07 +0200
committerArnold D. Robbins <arnold@skeeve.com>2013-02-11 20:56:07 +0200
commit0c0982740c0afda6ec893e6fcd361533033331f4 (patch)
treef1d443122f401456140b2d3f493c8d0d10248530
parentba18cde06b1c80426fdc9d5e6dff793d44bb0bc8 (diff)
downloadegawk-0c0982740c0afda6ec893e6fcd361533033331f4.tar.gz
egawk-0c0982740c0afda6ec893e6fcd361533033331f4.tar.bz2
egawk-0c0982740c0afda6ec893e6fcd361533033331f4.zip
Fixes to extensions for Win 32.
-rw-r--r--extension/ChangeLog8
-rw-r--r--extension/filefuncs.c31
-rw-r--r--extension/time.c12
3 files changed, 50 insertions, 1 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog
index 231961f1..9304e5b8 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,11 @@
+2013-02-11 Eli Zaretskii <eliz@gnu.org>
+
+ * filefuncs.c (S_ISLNK, lstat, readlink, S_IRGRP, S_IWGRP, S_IXGRP,
+ S_IROTH, S_IWOTH, S_IXOTH, S_ISUID, S_ISGID, S_ISVTX, major, minor):
+ Define if needed.
+ (fill_stat_array, init_filefuncs, func_table): Fix for Win 32.
+ * time.c: Port to Win 32.
+
2013-01-27 Arnold D. Robbins <arnold@skeeve.com>
* gawkdirfd.h: New file.
diff --git a/extension/filefuncs.c b/extension/filefuncs.c
index 123aad3c..a4ae7560 100644
--- a/extension/filefuncs.c
+++ b/extension/filefuncs.c
@@ -55,6 +55,26 @@
#include "gawkfts.h"
#include "stack.h"
+#ifndef S_IFLNK
+#define lstat stat
+#define S_ISLNK(s) 0
+#define readlink(f,b,bs) (-1)
+#endif
+
+#ifdef _WIN32
+#define S_IRGRP S_IRUSR
+#define S_IWGRP S_IWUSR
+#define S_IXGRP S_IXUSR
+#define S_IROTH S_IRUSR
+#define S_IWOTH S_IWUSR
+#define S_IXOTH S_IXUSR
+#define S_ISUID 0
+#define S_ISGID 0
+#define S_ISVTX 0
+#define major(s) (s)
+#define minor(s) (0)
+#endif
+
static const gawk_api_t *api; /* for convenience macros to work */
static awk_ext_id_t *ext_id;
static awk_bool_t init_filefuncs(void);
@@ -288,7 +308,11 @@ fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf)
array_set_numeric(array, "uid", sbuf->st_uid);
array_set_numeric(array, "gid", sbuf->st_gid);
array_set_numeric(array, "size", sbuf->st_size);
+#ifdef _WIN32
+ array_set_numeric(array, "blocks", sbuf->st_size / 4096);
+#else
array_set_numeric(array, "blocks", sbuf->st_blocks);
+#endif
array_set_numeric(array, "atime", sbuf->st_atime);
array_set_numeric(array, "mtime", sbuf->st_mtime);
array_set_numeric(array, "ctime", sbuf->st_ctime);
@@ -391,6 +415,7 @@ init_filefuncs(void)
int i;
awk_value_t value;
+#ifndef _WIN32
/* at least right now, only FTS needs initializing */
static struct flagtab {
const char *name;
@@ -414,9 +439,12 @@ init_filefuncs(void)
errors++;
}
}
+#endif
return errors == 0;
}
+#ifndef _WIN32
+
static int fts_errors = 0;
/* fill_stat_element --- fill in stat element of array */
@@ -719,11 +747,14 @@ out:
return make_number(ret, result);
}
+#endif /* !_WIN32 */
static awk_ext_func_t func_table[] = {
{ "chdir", do_chdir, 1 },
{ "stat", do_stat, 2 },
+#ifndef _WIN32
{ "fts", do_fts, 3 },
+#endif
};
diff --git a/extension/time.c b/extension/time.c
index 89811c41..dcafb8fa 100644
--- a/extension/time.c
+++ b/extension/time.c
@@ -61,6 +61,9 @@ int plugin_is_GPL_compatible;
#if defined(HAVE_NANOSLEEP) && defined(HAVE_TIME_H)
#include <time.h>
#endif
+#if defined(HAVE_GETSYSTEMTIMEASFILETIME)
+#include <windows.h>
+#endif
/*
* Returns time since 1/1/1970 UTC as a floating point value; should
@@ -160,10 +163,17 @@ do_sleep(int nargs, awk_value_t *result)
/* probably interrupted */
update_ERRNO_int(errno);
}
+#elif defined(HAVE_GETSYSTEMTIMEASFILETIME)
+ {
+ DWORD milliseconds = secs * 1000;
+
+ Sleep (milliseconds);
+ rc = 0;
+ }
#else
/* no way to sleep on this platform */
rc = -1;
- update_ERRNO_str(_("sleep: not supported on this platform"));
+ update_ERRNO_string(_("sleep: not supported on this platform"));
#endif
return make_number(rc, result);