aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--gawkapi.c19
-rw-r--r--gawkapi.h21
3 files changed, 48 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 44793ba1..04bd15d1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2012-07-11 Andrew J. Schorr <aschorr@telemetry-investments.com>
+ * gawkapi.h: Fix typo in comment.
+ (awk_value_t): Type for scalar_cookie should be awk_scalar_t,
+ not awk_array_t.
+ (gawk_api): Add new api_sym_lookup_scalar function.
+ (sym_lookup_scalar): New wrapper macro for api_sym_lookup_scalar hook.
+ * gawkapi.c (api_sym_lookup_scalar): New function for faster scalar
+ lookup.
+ (api_impl): Add entry for api_sym_lookup_scalar.
+
+2012-07-11 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
* gawkapi.c (awk_value_to_node): Change to a switch statement
so AWK_SCALAR or other invalid type is handled properly.
(valid_subscript_type): Test whether a value type is acceptable
diff --git a/gawkapi.c b/gawkapi.c
index 9e4f731b..b6d83acb 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -442,6 +442,24 @@ api_sym_lookup(awk_ext_id_t id,
return node_to_awk_value(node, result, wanted);
}
+/* api_sym_lookup_scalar --- retrieve the current value of a scalar */
+
+static awk_bool_t
+api_sym_lookup_scalar(awk_ext_id_t id,
+ awk_scalar_t cookie,
+ awk_valtype_t wanted,
+ awk_value_t *result)
+{
+ NODE *node = (NODE *) cookie;
+
+ if (node == NULL
+ || result == NULL
+ || node->type != Node_var)
+ return false;
+
+ return node_to_awk_value(node, result, wanted);
+}
+
/* api_sym_update --- update a symbol's value, see gawkapi.h for semantics */
static awk_bool_t
@@ -844,6 +862,7 @@ gawk_api_t api_impl = {
api_awk_atexit,
api_sym_lookup,
+ api_sym_lookup_scalar,
api_sym_update,
api_sym_update_scalar,
diff --git a/gawkapi.h b/gawkapi.h
index 9f541cfc..50ca327a 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -34,7 +34,7 @@
/*
* General introduction:
*
- * This API purposely restricts itself to C90 features. In paticular, no
+ * This API purposely restricts itself to C90 features. In particular, no
* bool, no // comments, no use of the restrict keyword, or anything else,
* in order to provide maximal portability.
*
@@ -122,7 +122,7 @@ typedef struct {
awk_string_t s;
double d;
awk_array_t a;
- awk_array_t scl;
+ awk_scalar_t scl;
} u;
#define str_value u.s
#define num_value u.d
@@ -317,6 +317,18 @@ typedef struct gawk_api {
awk_value_t *result);
/*
+ * Retrieve the current value of a scalar cookie. Once
+ * you have obtained a saclar_cookie using sym_lookup, you can
+ * use this function to get its value more efficiently.
+ *
+ * Return will be false if the value cannot be retrieved.
+ */
+ awk_bool_t (*api_sym_lookup_scalar)(awk_ext_id_t id,
+ awk_scalar_t cookie,
+ awk_valtype_t wanted,
+ awk_value_t *result);
+
+ /*
* Update a value. Adds it to the symbol table if not there.
* Changing types (scalar <--> array) is not allowed.
* In fact, using this to update an array is not allowed, either.
@@ -427,7 +439,10 @@ typedef struct gawk_api {
#define add_ext_func(func, ns) (api->api_add_ext_func(ext_id, func, ns))
#define awk_atexit(funcp, arg0) (api->api_awk_atexit(ext_id, funcp, arg0))
-#define sym_lookup(name, wanted, result) (api->api_sym_lookup(ext_id, name, wanted, result))
+#define sym_lookup(name, wanted, result) \
+ (api->api_sym_lookup(ext_id, name, wanted, result))
+#define sym_lookup_scalar(scalar_cookie, wanted, result) \
+ (api->api_sym_lookup_scalar(ext_id, scalar_cookie, wanted, result))
#define sym_update(name, value) \
(api->api_sym_update(ext_id, name, value))
#define sym_update_scalar(scalar_cookie, value) \