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. 7e99da1009403952ec84ad


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, extgawk, updated. 7e99da1009403952ec84ade1cad199b59927f735
Date: Mon, 16 Jul 2012 18:17:06 +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  7e99da1009403952ec84ade1cad199b59927f735 (commit)
       via  b06c8780cef407a0a6421691f60496ffd7d369de (commit)
      from  518a62884ff2b87b94cbfa1e2fa759f1829f6bd9 (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=7e99da1009403952ec84ade1cad199b59927f735

commit 7e99da1009403952ec84ade1cad199b59927f735
Author: Arnold D. Robbins <address@hidden>
Date:   Mon Jul 16 21:16:22 2012 +0300

    Minor performance improvement in sym_update_scalar.

diff --git a/ChangeLog b/ChangeLog
index bd444d2..bc403ce 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-07-16         Arnold D. Robbins     <address@hidden>
+
+       * gawkapi.c (awk_value_to_node): Support AWK_SCALAR.
+       (api_sym_update_scalar): Performance improvements.
+
 2012-07-12         Arnold D. Robbins     <address@hidden>
 
        Allow creation of constants. Thanks to John Haque for the
diff --git a/gawkapi.c b/gawkapi.c
index e8d50e8..6c03dd0 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -129,6 +129,7 @@ NODE *
 awk_value_to_node(const awk_value_t *retval)
 {
        NODE *ext_ret_val;
+       NODE *v;
 
        if (retval == NULL)
                fatal(_("awk_value_to_node: received null retval"));
@@ -147,7 +148,14 @@ awk_value_to_node(const awk_value_t *retval)
                ext_ret_val = make_str_node(retval->str_value.str,
                                retval->str_value.len, ALREADY_MALLOCED);
                break;
-       default:        /* AWK_SCALAR or any invalid type */
+       case AWK_SCALAR:
+               v = (NODE *) retval->scalar_cookie;
+               if (v->type != Node_var)
+                       ext_ret_val = NULL;
+               else
+                       ext_ret_val = dupnode(v->var_value);
+               break;
+       default:        /* any invalid type */
                ext_ret_val = NULL;
                break;
        }
@@ -568,20 +576,52 @@ api_sym_update_scalar(awk_ext_id_t id,
 {
        NODE *node = (NODE *) cookie;
        NODE *new_value;
+       bool hard_way = false;
 
        if (value == NULL
            || node == NULL
            || node->type != Node_var)
                return false;
 
-       new_value = awk_value_to_node(value);
-       if (new_value->type != Node_val) {
-               unref(new_value);
+       switch (value->val_type) {
+       case AWK_NUMBER:
+       case AWK_UNDEFINED:
+       case AWK_SCALAR:
+               hard_way = true;
+               /* fall through */
+       case AWK_STRING:
+               break;
+       default:
                return false;
+               break;
+       }
+
+       hard_way = (hard_way || node->var_value->valref > 1);
+
+       if (hard_way) {
+               /* do it the harder way */
+
+               unref(node->var_value);
+               node->var_value = awk_value_to_node(value);
+
+               return true;
+       }
+
+       /* convert value to string, optimized */
+       new_value = node->var_value;
+       free_wstr(new_value);
+       new_value->flags &= ~(NUMBER|NUMCUR);
+       new_value->stfmt = -1;
+
+       if ((new_value->flags & STRING) != 0) {
+               if ((new_value->flags & MALLOC) != 0) {
+                       efree(new_value->stptr);
+               }
        }
 
-       unref(node->var_value);
-       node->var_value = new_value;
+       new_value->stptr = value->str_value.str;
+       new_value->stlen = value->str_value.len;
+       new_value->flags |= (STRING|STRCUR|MALLOC);
 
        return true;
 }

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

commit b06c8780cef407a0a6421691f60496ffd7d369de
Author: Arnold D. Robbins <address@hidden>
Date:   Mon Jul 16 21:15:16 2012 +0300

    fnmatch extension improvements.

diff --git a/extension/ChangeLog b/extension/ChangeLog
index f62f37a..66c88ec 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,7 @@
+2012-07-16         Arnold D. Robbins     <address@hidden>
+
+       * fnmatch.c: Simplify flag table.
+
 2012-07-15         Arnold D. Robbins     <address@hidden>
 
        * testext.c (test_scalar): New function and new tests.
diff --git a/extension/fnmatch.c b/extension/fnmatch.c
index aa8a730..d28e265 100644
--- a/extension/fnmatch.c
+++ b/extension/fnmatch.c
@@ -113,16 +113,18 @@ out:
        return result;
 }
 
+#define ENTRY(x)       { #x, FNM_##x }
+
 static struct fnmflags {
        const char *name;
        int value;
 } flagtable[] = {
-       { "CASEFOLD", FNM_CASEFOLD },
-       { "FILE_NAME", FNM_FILE_NAME },
-       { "LEADING_DIR", FNM_LEADING_DIR },
-       { "NOESCAPE", FNM_NOESCAPE },
-       { "PATHNAME", FNM_PATHNAME },
-       { "PERIOD", FNM_PERIOD },
+       ENTRY(CASEFOLD),
+       ENTRY(FILE_NAME),
+       ENTRY(LEADING_DIR),
+       ENTRY(NOESCAPE),
+       ENTRY(PATHNAME),
+       ENTRY(PERIOD),
        { NULL, 0 }
 };
 
diff --git a/test/ChangeLog b/test/ChangeLog
index bb270e9..b38cf27 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,7 @@
+2012-07-16         Arnold D. Robbins     <address@hidden>
+
+       * fnmatch.awk, fnmatch.ok: Portability updates.
+
 2012-07-15         Arnold D. Robbins     <address@hidden>
 
        * testext.ok: Update contents.
diff --git a/test/fnmatch.awk b/test/fnmatch.awk
index e8ef937..c088507 100644
--- a/test/fnmatch.awk
+++ b/test/fnmatch.awk
@@ -2,8 +2,9 @@
 
 BEGIN {
        print "FNM_NOMATCH =", FNM_NOMATCH 
+       # can't print the values; they vary from system to system
        for (i in FNM)
-               printf("FNM[\"%s\"] = %d\n", i, FNM[i])
+               printf("\"%s\" is an element in FNM\n", i)
 
        printf("fnmatch(\"*.a\", \"foo.a\", 0)  = %d\n", fnmatch("*.a", 
"foo.a", 0) )
        printf("fnmatch(\"*.a\", \"foo.c\", 0) = %d\n", fnmatch("*.a", "foo.c", 
0))
diff --git a/test/fnmatch.ok b/test/fnmatch.ok
index cc17c6b..fd8a78c 100644
--- a/test/fnmatch.ok
+++ b/test/fnmatch.ok
@@ -1,9 +1,9 @@
 FNM_NOMATCH = 1
-FNM["LEADING_DIR"] = 8
-FNM["CASEFOLD"] = 16
-FNM["NOESCAPE"] = 2
-FNM["PERIOD"] = 4
-FNM["PATHNAME"] = 1
-FNM["FILE_NAME"] = 1
+"LEADING_DIR" is an element in FNM
+"CASEFOLD" is an element in FNM
+"NOESCAPE" is an element in FNM
+"PERIOD" is an element in FNM
+"PATHNAME" is an element in FNM
+"FILE_NAME" is an element in FNM
 fnmatch("*.a", "foo.a", 0)  = 0
 fnmatch("*.a", "foo.c", 0) = 1

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

Summary of changes:
 ChangeLog           |    5 ++++
 extension/ChangeLog |    4 +++
 extension/fnmatch.c |   14 +++++++-----
 gawkapi.c           |   52 +++++++++++++++++++++++++++++++++++++++++++++-----
 test/ChangeLog      |    4 +++
 test/fnmatch.awk    |    3 +-
 test/fnmatch.ok     |   12 +++++-----
 7 files changed, 75 insertions(+), 19 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

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