gawk-diffs
[Top][All Lists]
Advanced

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

[gawk-diffs] [SCM] gawk branch, master, updated. 5117dd79ab0271ae5e1bb77


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, master, updated. 5117dd79ab0271ae5e1bb775876e9e1b80fd2f4a
Date: Fri, 14 Sep 2012 09:27:38 +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, master has been updated
       via  5117dd79ab0271ae5e1bb775876e9e1b80fd2f4a (commit)
      from  8eb919e188c5a903a7d0194e42a97698b649d9ac (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=5117dd79ab0271ae5e1bb775876e9e1b80fd2f4a

commit 5117dd79ab0271ae5e1bb775876e9e1b80fd2f4a
Author: Arnold D. Robbins <address@hidden>
Date:   Fri Sep 14 12:27:06 2012 +0300

    Add undocumented-for-now PROCINFO["identifiers"].

diff --git a/ChangeLog b/ChangeLog
index d729027..d43af15 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,13 @@
        api_release_flattened_array): Adjust logic.
        * gawkapi.h: Adjust documentation.
 
+       Provide PROCINFO["identifiers"]. Undocumented for now.
+
+       * awk.h (load_symbols): Add declaration.
+       * awkgram.y (variable): Adjust comment formatting.
+       * main.c (main): Call load_symbols().
+       * symbol.c (load_symbols): New function.
+
 2012-09-13         Arnold D. Robbins     <address@hidden>
 
        * configure.ac: Determination of DYNAMIC adjusted. Hopefully is
diff --git a/awk.h b/awk.h
index b0208e5..bafb4b9 100644
--- a/awk.h
+++ b/awk.h
@@ -1670,6 +1670,7 @@ extern int reisstring(const char *text, size_t len, 
Regexp *re, const char *buf)
 extern int get_numbase(const char *str, bool use_locale);
 
 /* symbol.c */
+extern void load_symbols();
 extern NODE *install_symbol(char *name, NODETYPE type);
 extern NODE *remove_symbol(NODE *r);
 extern void destroy_symbol(NODE *r);
diff --git a/awkgram.c b/awkgram.c
index e2b42b4..2349e9d 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -6956,9 +6956,9 @@ variable(int location, char *name, NODETYPE type)
 
                for (dv = deferred_variables; true; dv = dv->next) {
                        if (dv == NULL) {
-                       /*
-                        * This is the only case in which we may not free the 
string.
-                        */
+                               /*
+                                * This is the only case in which we may not 
free the string.
+                                */
                                return install_symbol(name, type);
                        }
                        if (strcmp(name, dv->name) == 0) {
diff --git a/awkgram.y b/awkgram.y
index a6669e9..1d7bf81 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -4396,9 +4396,9 @@ variable(int location, char *name, NODETYPE type)
 
                for (dv = deferred_variables; true; dv = dv->next) {
                        if (dv == NULL) {
-                       /*
-                        * This is the only case in which we may not free the 
string.
-                        */
+                               /*
+                                * This is the only case in which we may not 
free the string.
+                                */
                                return install_symbol(name, type);
                        }
                        if (strcmp(name, dv->name) == 0) {
diff --git a/main.c b/main.c
index 8ac9493..f2a3c66 100644
--- a/main.c
+++ b/main.c
@@ -693,6 +693,8 @@ out:
        if (do_lint && code_block->nexti->opcode == Op_atexit)
                lintwarn(_("no program text at all!"));
 
+       load_symbols();
+
        if (do_profile)
                init_profiling_signals();
 
diff --git a/symbol.c b/symbol.c
index 5d89bf0..9d4c680 100644
--- a/symbol.c
+++ b/symbol.c
@@ -43,7 +43,6 @@ static void free_bcpool(INSTRUCTION *pl);
 static AWK_CONTEXT *curr_ctxt = NULL;
 static int ctxt_level;
 
-
 /*
  * install_symbol:
  * Install a global name in the symbol table, even if it is already there.
@@ -475,6 +474,86 @@ release_symbols(NODE *symlist, int keep_globals)
        symlist->rnode = NULL;
 }
 
+/* load_symbols --- fill in symbols' information */
+
+void
+load_symbols()
+{
+       NODE *hp, *r;
+       NODE *tmp;
+       NODE *sym_array;
+       NODE **aptr;
+       long i;
+       NODE *user, *extension, *variable, *scalar,*array;
+
+       if (PROCINFO_node == NULL)
+               return;
+
+       tmp = make_string("identifiers", 11);
+       aptr = assoc_lookup(PROCINFO_node, tmp);
+
+       getnode(sym_array);
+       init_array(sym_array);
+
+       unref(*aptr);
+       *aptr = sym_array;
+
+       sym_array->parent_array = PROCINFO_node;
+       sym_array->vname = estrdup("identifiers", 11);
+       make_aname(sym_array);
+
+       user = make_string("user", 4);
+       extension = make_string("extension", 9);
+       scalar = make_string("scalar", 6);
+       variable = make_string("variable", 8);
+       array = make_string("array", 5);
+
+       for (i = 0; i < HASHSIZE; i++) {
+               for (hp = variables[i]; hp != NULL; hp = hp->hnext) {
+                       if (hp->type != Node_hashnode)
+                               continue;
+
+                       r = hp->hvalue;
+                       if (   r->type == Node_ext_func
+                           || r->type == Node_func
+                           || r->type == Node_var
+                           || r->type == Node_var_array
+                           || r->type == Node_var_new) {
+                               tmp = make_string(r->vname, strlen(r->vname));
+                               aptr = assoc_lookup(sym_array, tmp);
+                               unref(tmp);
+                               unref(*aptr);
+                               switch (r->type) {
+                               case Node_ext_func:
+                                       *aptr = dupnode(extension);
+                                       break;
+                               case Node_func:
+                                       *aptr = dupnode(user);
+                                       break;
+                               case Node_var:
+                                       *aptr = dupnode(scalar);
+                                       break;
+                               case Node_var_array:
+                                       *aptr = dupnode(array);
+                                       break;
+                               case Node_var_new:
+                                       *aptr = dupnode(variable);
+                                       break;
+                               default:
+                                       cant_happen();
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       unref(user);
+       unref(extension);
+       unref(scalar);
+       unref(variable);
+       unref(array);
+}
+
 #define pool_size      d.dl
 #define freei          x.xi
 static INSTRUCTION *pool_list;

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

Summary of changes:
 ChangeLog |    7 +++++
 awk.h     |    1 +
 awkgram.c |    6 ++--
 awkgram.y |    6 ++--
 main.c    |    2 +
 symbol.c  |   81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 6 files changed, 96 insertions(+), 7 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

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