aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--awk.h1
-rw-r--r--awkgram.c6
-rw-r--r--awkgram.y6
-rw-r--r--main.c2
-rw-r--r--symbol.c81
6 files changed, 96 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index d7290276..d43af15d 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 <arnold@skeeve.com>
* configure.ac: Determination of DYNAMIC adjusted. Hopefully is
diff --git a/awk.h b/awk.h
index b0208e54..bafb4b98 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 e2b42b4b..2349e9d6 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 a6669e97..1d7bf813 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 8ac9493e..f2a3c66b 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 5d89bf07..9d4c6808 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;