gawk-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gawk-diffs] [SCM] gawk branch, extgawk, updated. d66f3c9922e36bb2e760e0


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, extgawk, updated. d66f3c9922e36bb2e760e0ac36364c1a5aa11442
Date: Wed, 20 Jun 2012 18:41:40 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".

The branch, extgawk has been updated
       via  d66f3c9922e36bb2e760e0ac36364c1a5aa11442 (commit)
       via  cd380faebed56979c993ec46daa8c9d927c2d1dd (commit)
      from  1ab61e1508bb2c35d536717868d9dbe5ea20fa93 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=d66f3c9922e36bb2e760e0ac36364c1a5aa11442

commit d66f3c9922e36bb2e760e0ac36364c1a5aa11442
Author: Arnold D. Robbins <address@hidden>
Date:   Wed Jun 20 21:41:15 2012 +0300

    API: Add set_parameter function and test.

diff --git a/ChangeLog b/ChangeLog
index 8ae6d3f..beb8f36 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,17 @@
 2012-06-20         Arnold D. Robbins     <address@hidden>
 
-       * awgram.y (stopme): Restore long lost debugging function.
-       * awgram.y (stopme): Add declaration.
+       Restore lost debugging function:
+
+       * awkgram.y (stopme): Restore long lost debugging function.
+       * awk.h (stopme): Add declaration.
+
+       API work:
+
+       * ext.c (get_argument): Make extern.
+       * awk.h (get_argument): Declare it.
+       * gawkapi.c (api_set_argument): Call it. Finish off the logic.
+       (api_get_argument): Refine logic to use get_argument.
+       * gawkapi.h (set_argument): New API.
 
 2012-06-19         Arnold D. Robbins     <address@hidden>
 
diff --git a/awk.h b/awk.h
index 77aa111..4bfaef4 100644
--- a/awk.h
+++ b/awk.h
@@ -1507,6 +1507,7 @@ NODE *do_ext(int nargs);
 NODE *load_ext(const char *lib_name, const char *init_func);
 #ifdef DYNAMIC
 awk_bool_t make_builtin(const awk_ext_func_t *);
+NODE *get_argument(int);
 NODE *get_actual_argument(int, bool, bool);
 #define get_scalar_argument(i, opt)  get_actual_argument((i), (opt), false)
 #define get_array_argument(i, opt)   get_actual_argument((i), (opt), true)
diff --git a/ext.c b/ext.c
index 4945c7c..d0755cc 100644
--- a/ext.c
+++ b/ext.c
@@ -152,7 +152,7 @@ make_builtin(const awk_ext_func_t *funcinfo)
 
 /* get_argument --- get the i'th argument of a dynamically linked function */
 
-static NODE *
+NODE *
 get_argument(int i)
 {
        NODE *t;
diff --git a/extension/ChangeLog b/extension/ChangeLog
index 8d8cf2b..a134e00 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,9 @@
+2012-06-20         Arnold D. Robbins     <address@hidden>
+
+       * testext.c (fill_in_array): New function.
+       (create_new_array): Most code moved into fill_in_array.
+       (test_array_param): New function.
+
 2012-06-19         Arnold D. Robbins     <address@hidden>
 
        * testext.c (dump_array_and_delete): Renamed from dump_array.
diff --git a/extension/testext.c b/extension/testext.c
index 0a7594a..963a563 100644
--- a/extension/testext.c
+++ b/extension/testext.c
@@ -42,6 +42,8 @@ static awk_ext_id_t *ext_id;
 
 int plugin_is_GPL_compatible;
 
+static void fill_in_array(awk_value_t *value);
+
 /* valrep2str --- turn a value into a string */
 
 static const char *
@@ -386,6 +388,54 @@ out:
 
 /*
 BEGIN {
+       ret = test_array_param(a_new_array)
+       printf "test_array_param() returned %d\n", ret
+       printf "isarray(a_new_array) = %d\n", isarray(a_new_array)
+       if (isarray(a_new_array))
+               for (i in a_new_array)
+                       printf("a_new_array[\"%s\"] = %s\n",
+                               i, a_new_array[i])
+
+       a_scalar = 42
+       ret = test_array_param(a_scalar)
+       printf "test_array_param() returned %d\n", ret
+       printf "isarray(a_scalar) = %d\n", isarray(a_scalar)
+       print ""
+}
+*/
+
+static awk_value_t *
+test_array_param(int nargs, awk_value_t *result)
+{
+       awk_value_t new_array;
+       awk_value_t arg0;
+
+       make_number(0.0, result);
+
+       if (! get_argument(0, AWK_UNDEFINED, & arg0)) {
+               printf("test_array_param: could not get argument\n");
+               goto out;
+       }
+
+       if (arg0.val_type != AWK_UNDEFINED) {
+               printf("test_array_param: argument is not undefined (%d)\n",
+                               arg0.val_type);
+               goto out;
+       }
+
+       fill_in_array(& new_array);
+       if (! set_argument(0, new_array.array_cookie)) {
+               printf("test_array_param: could not change type of argument\n");
+               goto out;
+       }
+
+       make_number(1.0, result);
+out:
+       return result;  /* for now */
+}
+
+/*
+BEGIN {
        printf "Initial value of LINT is %d\n", LINT
        ret = print_do_lint();
        printf "print_do_lint() returned %d\n", ret
@@ -448,12 +498,11 @@ out:
 }
 
 static void
-create_new_array()
+fill_in_array(awk_value_t *value)
 {
        awk_element_t element;
        awk_array_t a_cookie;
        awk_value_t index;
-       awk_value_t value;
 
        a_cookie = create_array();
 
@@ -461,7 +510,7 @@ create_new_array()
        element.index = index;
        (void) make_string("world", 5, & element.value);
        if (! set_array_element(a_cookie, & element)) {
-               printf("create_new_array:%d: set_array_element failed\n", 
__LINE__);
+               printf("fill_in_array:%d: set_array_element failed\n", 
__LINE__);
                return;
        }
 
@@ -469,13 +518,21 @@ create_new_array()
        element.index = index;
        (void) make_number(42.0, & element.value);
        if (! set_array_element(a_cookie, & element)) {
-               printf("create_new_array:%d: set_array_element failed\n", 
__LINE__);
+               printf("fill_in_array:%d: set_array_element failed\n", 
__LINE__);
                return;
        }
 
-       value.val_type = AWK_ARRAY;
-       value.array_cookie = a_cookie;
+       value->val_type = AWK_ARRAY;
+       value->array_cookie = a_cookie;
+
+}
+
+static void
+create_new_array()
+{
+       awk_value_t value;
 
+       fill_in_array(& value);
        if (! sym_update("new_array", & value))
                printf("create_new_array: sym_update(\"new_array\") failed!\n");
 }
@@ -524,6 +581,7 @@ static awk_ext_func_t func_table[] = {
        { "test_errno", test_errno, 0 },
        { "test_array_size", test_array_size, 1 },
        { "test_array_elem", test_array_elem, 2 },
+       { "test_array_param", test_array_param, 1 },
        { "test_array_flatten", test_array_flatten, 1 },
        { "print_do_lint", print_do_lint, 0 },
 };
diff --git a/gawkapi.c b/gawkapi.c
index 5eb1688..ad7e68f 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -44,17 +44,83 @@ api_get_argument(awk_ext_id_t id, size_t count,
 
        (void) id;
 
-       arg = (wanted == AWK_ARRAY
-                       ? get_array_argument(count, false)
-                       : get_scalar_argument(count, false) );
-
-       if (arg == NULL) {
-               memset(result, 0, sizeof(*result));
-               result->val_type = AWK_UNDEFINED;
+       /* set up default result */
+       memset(result, 0, sizeof(*result));
+       result->val_type = AWK_UNDEFINED;
+
+       /*
+        * Song and dance here.  get_array_argument() and get_scalar_argument()
+        * will force a change in type of a parameter that is Node_var_new.
+        *
+        * Start by looking at the unadulterated argument as it was passed.
+        */
+       arg = get_argument(count);
+       if (arg == NULL)
                return false;
+
+       /* if type is undefined */
+       if (arg->type == Node_var_new) {
+               if (wanted == AWK_UNDEFINED)
+                       return true;
+               else if (wanted == AWK_ARRAY) {
+                       goto array;
+               } else {
+                       goto scalar;
+               }
        }
+       
+       /* at this point, we have real type */
+       if (arg->type == Node_var_array || arg->type == Node_array_ref) {
+               if (wanted != AWK_ARRAY && wanted != AWK_UNDEFINED)
+                       return false;
+               goto array;
+       } else
+               goto scalar;
+
+array:
+       /* get the array here */
+       arg = get_array_argument(count, false);
+       if (arg == NULL)
+               return false;
 
        return node_to_awk_value(arg, result, wanted);
+
+scalar:
+       /* at this point we have a real type that is not an array */
+       arg = get_scalar_argument(count, false);
+       if (arg == NULL)
+               return false;
+
+       return node_to_awk_value(arg, result, wanted);
+}
+
+static awk_bool_t
+api_set_argument(awk_ext_id_t id,
+               size_t count,
+               awk_array_t new_array)
+{
+       NODE *arg;
+       NODE *array = (NODE *) new_array;
+       awk_valtype_t valtype;
+
+       (void) id;
+
+       if (array == NULL || array->type != Node_var_array)
+               return false;
+
+       if (   (arg = get_argument(count)) == NULL
+           || arg->type != Node_var_new)
+               return false;
+
+       arg = get_array_argument(count, false);
+       if (arg == NULL)
+               return false;
+
+       array->vname = arg->vname;
+       *arg = *array;
+       freenode(array);
+
+       return true;
 }
 
 /* awk_value_to_node --- convert a value into a NODE */
@@ -663,6 +729,7 @@ gawk_api_t api_impl = {
        { 0 },                  /* do_flags */
 
        api_get_argument,
+       api_set_argument,
 
        api_fatal,
        api_warning,
diff --git a/gawkapi.h b/gawkapi.h
index 7973d7a..3325c45 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -242,9 +242,14 @@ typedef struct gawk_api {
                                          awk_value_t *result);
 
        /*
-        * FIXME: Missing update_argument to convert an undefined
-        * argument into an array or scalar.
+        * Convert a paramter that was undefined into an array
+        * (provide call-by-reference for arrays).  Returns false
+        * if count is too big, or if the argument's type is
+        * not undefined.
         */
+       awk_bool_t (*set_argument)(awk_ext_id_t id,
+                                       size_t count,
+                                       awk_array_t array);
 
        /* Functions to print messages */
        void (*api_fatal)(awk_ext_id_t id, const char *format, ...);
@@ -373,6 +378,8 @@ typedef struct gawk_api {
 
 #define get_argument(count, wanted, result) \
        (api->get_argument(ext_id, count, wanted, result))
+#define set_argument(count, new_array) \
+       (api->set_argument(ext_id, count, new_array))
 
 #define fatal          api->api_fatal
 #define warning                api->api_warning
diff --git a/test/ChangeLog b/test/ChangeLog
index 44af605..71edf19 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,7 @@
+2012-06-20         Arnold D. Robbins     <address@hidden>
+
+       * testext.ok: Update contents.
+
 2012-06-19         Arnold D. Robbins     <address@hidden>
 
        * testext.ok: Update contents.
diff --git a/test/testext.ok b/test/testext.ok
index 2f54668..08e272d 100644
--- a/test/testext.ok
+++ b/test/testext.ok
@@ -25,6 +25,14 @@ test_array_elem() returned 1, test_array2[3] = 42
 test_array_elem did remove element "5"
 test_array_elem added element "7" --> seven
 
+test_array_param() returned 1
+isarray(a_new_array) = 1
+a_new_array["hello"] = world
+a_new_array["answer"] = 42
+test_array_param: argument is not undefined (1)
+test_array_param() returned 0
+isarray(a_scalar) = 0
+
 Initial value of LINT is 0
 print_do_lint: lint = 0
 print_do_lint() returned 1

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=cd380faebed56979c993ec46daa8c9d927c2d1dd

commit cd380faebed56979c993ec46daa8c9d927c2d1dd
Author: Arnold D. Robbins <address@hidden>
Date:   Wed Jun 20 20:03:04 2012 +0300

    Restore stopme() debugging function.

diff --git a/ChangeLog b/ChangeLog
index 77f59ec..8ae6d3f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-06-20         Arnold D. Robbins     <address@hidden>
+
+       * awgram.y (stopme): Restore long lost debugging function.
+       * awgram.y (stopme): Add declaration.
+
 2012-06-19         Arnold D. Robbins     <address@hidden>
 
        Remove code duplication in gawkapi.c from msg.c:
diff --git a/awk.h b/awk.h
index eb512f2..77aa111 100644
--- a/awk.h
+++ b/awk.h
@@ -1416,6 +1416,7 @@ extern int parse_program(INSTRUCTION **pcode);
 extern void dump_funcs(void);
 extern void dump_vars(const char *fname);
 extern const char *getfname(NODE *(*)(int));
+extern NODE *stopme(NODE *tree);
 extern void shadow_funcs(void);
 extern int check_special(const char *name);
 extern SRCFILE *add_srcfile(int stype, char *src, SRCFILE *curr, bool 
*already_included, int *errcode);
diff --git a/awkgram.c b/awkgram.c
index bef9a30..ffdf95b 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -4596,6 +4596,9 @@ static const struct token tokentab[] = {
 {"sprintf",    Op_builtin,      LEX_BUILTIN,   0,              do_sprintf,     
0},
 {"sqrt",       Op_builtin,      LEX_BUILTIN,   A(1),           do_sqrt,        
MPF(sqrt)},
 {"srand",      Op_builtin,      LEX_BUILTIN,   NOT_OLD|A(0)|A(1), do_srand,    
MPF(srand)},
+#if defined(GAWKDEBUG) || defined(ARRAYDEBUG) /* || ... */
+{"stopme",     Op_builtin,     LEX_BUILTIN,    GAWKX|A(0),     stopme,         
0},
+#endif
 {"strftime",   Op_builtin,      LEX_BUILTIN,   GAWKX|A(0)|A(1)|A(2)|A(3), 
do_strftime, 0},
 {"strtonum",   Op_builtin,    LEX_BUILTIN,     GAWKX|A(1),     do_strtonum, 
MPF(strtonum)},
 {"sub",                Op_sub_builtin,  LEX_BUILTIN,   NOT_OLD|A(2)|A(3), 0,   
0},
@@ -7210,6 +7213,14 @@ make_assignable(INSTRUCTION *ip)
        return NULL;
 }
 
+/* stopme --- for debugging */
+
+NODE *
+stopme(NODE *tree ATTRIBUTE_UNUSED)
+{
+       return make_number(0.0);
+}
+
 /* dumpintlstr --- write out an initial .po file entry for the string */
 
 static void
diff --git a/awkgram.y b/awkgram.y
index dceca6d..e7f8701 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -1876,6 +1876,9 @@ static const struct token tokentab[] = {
 {"sprintf",    Op_builtin,      LEX_BUILTIN,   0,              do_sprintf,     
0},
 {"sqrt",       Op_builtin,      LEX_BUILTIN,   A(1),           do_sqrt,        
MPF(sqrt)},
 {"srand",      Op_builtin,      LEX_BUILTIN,   NOT_OLD|A(0)|A(1), do_srand,    
MPF(srand)},
+#if defined(GAWKDEBUG) || defined(ARRAYDEBUG) /* || ... */
+{"stopme",     Op_builtin,     LEX_BUILTIN,    GAWKX|A(0),     stopme,         
0},
+#endif
 {"strftime",   Op_builtin,      LEX_BUILTIN,   GAWKX|A(0)|A(1)|A(2)|A(3), 
do_strftime, 0},
 {"strtonum",   Op_builtin,    LEX_BUILTIN,     GAWKX|A(1),     do_strtonum, 
MPF(strtonum)},
 {"sub",                Op_sub_builtin,  LEX_BUILTIN,   NOT_OLD|A(2)|A(3), 0,   
0},
@@ -4490,6 +4493,14 @@ make_assignable(INSTRUCTION *ip)
        return NULL;
 }
 
+/* stopme --- for debugging */
+
+NODE *
+stopme(NODE *tree ATTRIBUTE_UNUSED)
+{
+       return make_number(0.0);
+}
+
 /* dumpintlstr --- write out an initial .po file entry for the string */
 
 static void

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog           |   15 +++++++++
 awk.h               |    2 +
 awkgram.c           |   11 +++++++
 awkgram.y           |   11 +++++++
 ext.c               |    2 +-
 extension/ChangeLog |    6 ++++
 extension/testext.c |   70 ++++++++++++++++++++++++++++++++++++++++----
 gawkapi.c           |   81 ++++++++++++++++++++++++++++++++++++++++++++++----
 gawkapi.h           |   11 ++++++-
 test/ChangeLog      |    4 ++
 test/testext.ok     |    8 +++++
 11 files changed, 205 insertions(+), 16 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

[Prev in Thread] Current Thread [Next in Thread]