[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/4] Add iterators to loop over pkl_env
From: |
John Darrington |
Subject: |
[PATCH 2/4] Add iterators to loop over pkl_env |
Date: |
Thu, 14 Nov 2019 13:26:49 +0100 |
* src/pkl-env.h (pkl_ast_node_iter): New struct.
(pkl_env_iter_begin): New declaration.
(pkl_env_iter_next): New declaration.
(pkl_env_iter_end): New declaration.
* src/pkl-env.c (pkl_env_iter_begin): New function.
(pkl_env_iter_next): New function.
(pkl_env_iter_end): New function.
(pkl_env_map_decls): Use them to implement this function.
---
ChangeLog | 11 +++++++++++
src/pkl-env.c | 52 +++++++++++++++++++++++++++++++++++++++++-----------
src/pkl-env.h | 13 +++++++++++++
3 files changed, 65 insertions(+), 11 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 7050cd3..654ed62 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2019-11-13 John Darrington <address@hidden>
+ * src/pkl-env.h (pkl_ast_node_iter): New struct.
+ (pkl_env_iter_begin): New declaration.
+ (pkl_env_iter_next): New declaration.
+ (pkl_env_iter_end): New declaration.
+ * src/pkl-env.c (pkl_env_iter_begin): New function.
+ (pkl_env_iter_next): New function.
+ (pkl_env_iter_end): New function.
+ (pkl_env_map_decls): Use them to implement this function.
+
+2019-11-13 John Darrington <address@hidden>
+
* src/pk-cmd.c (cmds): Rename to dot_cmds.
(pk_cmd_init): Deal with the consequences.
diff --git a/src/pkl-env.c b/src/pkl-env.c
index 7a315e5..b277458 100644
--- a/src/pkl-env.c
+++ b/src/pkl-env.c
@@ -229,23 +229,53 @@ pkl_env_toplevel_p (pkl_env env)
}
void
+pkl_env_iter_begin (pkl_env env, struct pkl_ast_node_iter *iter)
+{
+ iter->bin = 0;
+ iter->node = env->hash_table[iter->bin];
+ while (iter->node == NULL)
+ {
+ iter->bin++;
+ if (iter->bin >= HASH_TABLE_SIZE)
+ break;
+ iter->node = env->hash_table[iter->bin];
+ }
+}
+
+void
+pkl_env_iter_next (pkl_env env, struct pkl_ast_node_iter *iter)
+{
+ assert (iter->node != NULL);
+
+ iter->node = PKL_AST_CHAIN2 (iter->node);
+ while (iter->node == NULL)
+ {
+ iter->bin++;
+ if (iter->bin >= HASH_TABLE_SIZE)
+ break;
+ iter->node = env->hash_table[iter->bin];
+ }
+}
+
+bool
+pkl_env_iter_end (pkl_env env, const struct pkl_ast_node_iter *iter)
+{
+ return iter->bin >= HASH_TABLE_SIZE;
+}
+
+void
pkl_env_map_decls (pkl_env env,
int what,
pkl_map_decl_fn cb,
void *data)
{
- int i;
-
- for (i = 0; i < HASH_TABLE_SIZE; ++i)
+ struct pkl_ast_node_iter iter;
+ for (pkl_env_iter_begin (env, &iter); !pkl_env_iter_end (env, &iter);
+ pkl_env_iter_next (env, &iter))
{
- pkl_ast_node t = env->hash_table[i];
-
- for (; t; t = PKL_AST_CHAIN2 (t))
- {
- if ((what == PKL_AST_DECL_KIND_ANY
- || what == PKL_AST_DECL_KIND (t)))
- cb (t, data);
- }
+ if ((what == PKL_AST_DECL_KIND_ANY
+ || what == PKL_AST_DECL_KIND (iter.node)))
+ cb (iter.node, data);
}
}
diff --git a/src/pkl-env.h b/src/pkl-env.h
index 75b3a89..503e30a 100644
--- a/src/pkl-env.h
+++ b/src/pkl-env.h
@@ -122,4 +122,17 @@ void pkl_env_map_decls (pkl_env env,
pkl_env pkl_env_dup_toplevel (pkl_env env);
+
+struct pkl_ast_node_iter
+{
+ int bin; /* The bin in which this node resides. */
+ pkl_ast_node node; /* A pointer to the node itself. */
+};
+
+
+void pkl_env_iter_begin (pkl_env env, struct pkl_ast_node_iter *iter);
+void pkl_env_iter_next (pkl_env env, struct pkl_ast_node_iter *iter);
+bool pkl_env_iter_end (pkl_env env, const struct pkl_ast_node_iter *iter);
+
+
#endif /* !PKL_ENV_H */
--
2.11.0