aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extension/ChangeLog6
-rw-r--r--extension/filefuncs.c66
2 files changed, 44 insertions, 28 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog
index e71d0719..69827582 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,9 @@
+2012-07-13 Arnold D. Robbins <arnold@skeeve.com>
+
+ * filefuncs.c (fill_stat_array): New function to do the work
+ for stat.
+ (do_stat): Call it.
+
2012-07-12 Arnold D. Robbins <arnold@skeeve.com>
* fnmatch.c: New file.
diff --git a/extension/filefuncs.c b/extension/filefuncs.c
index 71387cb3..41783c85 100644
--- a/extension/filefuncs.c
+++ b/extension/filefuncs.c
@@ -230,18 +230,14 @@ array_set_numeric(awk_array_t array, const char *sub, double num)
array_set(array, sub, make_number(num, & tmp));
}
-/* do_stat --- provide a stat() function for gawk */
+/* fill_stat_array --- do the work to fill an array with stat info */
-static awk_value_t *
-do_stat(int nargs, awk_value_t *result)
+static int
+fill_stat_array(const char *name, awk_array_t array)
{
- awk_value_t file_param, array_param;
- char *name;
- awk_array_t array;
- struct stat sbuf;
- int ret, j, k;
char *pmode; /* printable mode */
const char *type = "unknown";
+ struct stat sbuf;
awk_value_t tmp;
static struct ftype_map {
unsigned int mask;
@@ -264,23 +260,7 @@ do_stat(int nargs, awk_value_t *result)
{ S_IFDOOR, "door" },
#endif /* S_IFDOOR */
};
-
- assert(result != NULL);
-
- if (do_lint && nargs != 2) {
- lintwarn(ext_id, "stat: called with wrong number of arguments");
- return make_number(-1, result);
- }
-
- /* file is first arg, array to hold results is second */
- if ( ! get_argument(0, AWK_STRING, & file_param)
- || ! get_argument(1, AWK_ARRAY, & array_param)) {
- warning(ext_id, "stat: bad parameters");
- return make_number(-1, result);
- }
-
- name = file_param.str_value.str;
- array = array_param.array_cookie;
+ int ret, j, k;
/* empty out the array */
clear_array(array);
@@ -289,11 +269,11 @@ do_stat(int nargs, awk_value_t *result)
ret = lstat(name, & sbuf);
if (ret < 0) {
update_ERRNO_int(errno);
- return make_number(-1, result);
+ return -1;
}
/* fill in the array */
- array_set(array, "name", make_const_string(name, file_param.str_value.len, &tmp));
+ array_set(array, "name", make_const_string(name, strlen(name), & tmp));
array_set_numeric(array, "dev", sbuf.st_dev);
array_set_numeric(array, "ino", sbuf.st_ino);
array_set_numeric(array, "mode", sbuf.st_mode);
@@ -343,7 +323,37 @@ do_stat(int nargs, awk_value_t *result)
array_set(array, "type", make_const_string(type, strlen(type), &tmp));
- ret = 1; /* success */
+ return 0;
+}
+
+/* do_stat --- provide a stat() function for gawk */
+
+static awk_value_t *
+do_stat(int nargs, awk_value_t *result)
+{
+ awk_value_t file_param, array_param;
+ char *name;
+ awk_array_t array;
+ int ret;
+
+ assert(result != NULL);
+
+ if (do_lint && nargs != 2) {
+ lintwarn(ext_id, "stat: called with wrong number of arguments");
+ return make_number(-1, result);
+ }
+
+ /* file is first arg, array to hold results is second */
+ if ( ! get_argument(0, AWK_STRING, & file_param)
+ || ! get_argument(1, AWK_ARRAY, & array_param)) {
+ warning(ext_id, "stat: bad parameters");
+ return make_number(-1, result);
+ }
+
+ name = file_param.str_value.str;
+ array = array_param.array_cookie;
+
+ ret = fill_stat_array(name, array);
return make_number(ret, result);
}