summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-05 15:44:28 -0500
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2015-01-05 15:44:28 -0500
commita97507159ee06523c9dd6ec809199a0774976498 (patch)
tree95c4581001645627250f7d82285536ed2b7afbd6
parent4e952aea89bbfaecd12614f1249c830aff36c551 (diff)
downloadgawk-a97507159ee06523c9dd6ec809199a0774976498.tar.gz
Add low-level access to the get_file API through the testext sample extension to facilitate further testing.
-rw-r--r--extension/ChangeLog9
-rw-r--r--extension/testext.c68
2 files changed, 76 insertions, 1 deletions
diff --git a/extension/ChangeLog b/extension/ChangeLog
index 55438800..617cc033 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,12 @@
+2015-01-05 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * testext.c (test_get_file): Fix error message.
+ (do_get_file): Implement new function providing low-level access
+ to the get_file API.
+ (func_table): Add "get_file" -> do_get_file.
+ (init_testext): If TESTEXT_QUIET has been set to a numeric value,
+ return quietly.
+
2015-01-02 Andrew J. Schorr <aschorr@telemetry-investments.com>
* testext.c (test_get_file): The get_file hook no longer takes a
diff --git a/extension/testext.c b/extension/testext.c
index a10c9255..c931ed39 100644
--- a/extension/testext.c
+++ b/extension/testext.c
@@ -783,7 +783,7 @@ test_get_file(int nargs, awk_value_t *result)
return make_number(-1.0, result);
}
if (! get_argument(1, AWK_STRING, & alias)) {
- printf("%s: cannot get first arg\n", "test_get_file");
+ printf("%s: cannot get second arg\n", "test_get_file");
return make_number(-1.0, result);
}
if ((fd = open(filename.str_value.str, O_RDONLY)) < 0) {
@@ -801,6 +801,68 @@ test_get_file(int nargs, awk_value_t *result)
return make_number(0.0, result);
}
+/* do_get_file --- provide access to get_file API */
+
+static awk_value_t *
+do_get_file(int nargs, awk_value_t *result)
+{
+ awk_value_t filename, filetype, fd, res;
+ const awk_input_buf_t *ibuf;
+ const awk_output_buf_t *obuf;
+ awk_array_t array;
+
+ if (nargs != 4) {
+ printf("%s: nargs not right (%d should be 4)\n", "get_file", nargs);
+ return make_number(-1.0, result);
+ }
+
+ if (! get_argument(0, AWK_STRING, & filename)) {
+ printf("%s: cannot get first arg\n", "get_file");
+ return make_number(-1.0, result);
+ }
+ if (! get_argument(1, AWK_STRING, & filetype)) {
+ printf("%s: cannot get second arg\n", "get_file");
+ return make_number(-1.0, result);
+ }
+ if (! get_argument(2, AWK_NUMBER, & fd)) {
+ printf("%s: cannot get third arg\n", "get_file");
+ return make_number(-1.0, result);
+ }
+ if (! get_argument(3, AWK_ARRAY, & res)) {
+ printf("%s: cannot get fourth arg\n", "get_file");
+ return make_number(-1.0, result);
+ }
+ clear_array(res.array_cookie);
+
+ if (! get_file(filename.str_value.str, strlen(filename.str_value.str), filetype.str_value.str, fd.num_value, &ibuf, &obuf)) {
+ printf("%s: get_file(%s, %s, %d) failed\n", "get_file", filename.str_value.str, filetype.str_value.str, (int)(fd.num_value));
+ return make_number(0.0, result);
+ }
+
+ if (ibuf) {
+ awk_value_t idx, val;
+ set_array_element(res.array_cookie,
+ make_const_string("input", 5, & idx),
+ make_number(ibuf->fd, & val));
+ if (ibuf->name)
+ set_array_element(res.array_cookie,
+ make_const_string("input_name", 10, & idx),
+ make_const_string(ibuf->name, strlen(ibuf->name), & val));
+ }
+ if (obuf) {
+ awk_value_t idx, val;
+ set_array_element(res.array_cookie,
+ make_const_string("output", 6, & idx),
+ make_number(obuf->fp ? fileno(obuf->fp) : -1,
+ & val));
+ if (obuf->name)
+ set_array_element(res.array_cookie,
+ make_const_string("output_name", 11, & idx),
+ make_const_string(obuf->name, strlen(obuf->name), & val));
+ }
+ return make_number(1.0, result);
+}
+
/* fill_in_array --- fill in a new array */
static void
@@ -897,6 +959,7 @@ static awk_ext_func_t func_table[] = {
{ "test_scalar_reserved", test_scalar_reserved, 0 },
{ "test_indirect_vars", test_indirect_vars, 0 },
{ "test_get_file", test_get_file, 2 },
+ { "get_file", do_get_file, 4 },
};
/* init_testext --- additional initialization function */
@@ -907,6 +970,9 @@ static awk_bool_t init_testext(void)
static const char message[] = "hello, world"; /* of course */
static const char message2[] = "i am a scalar";
+ if (sym_lookup("TESTEXT_QUIET", AWK_NUMBER, & value))
+ return awk_true;
+
/* add at_exit functions */
awk_atexit(at_exit0, NULL);
awk_atexit(at_exit1, & data_for_1);