aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--gawkapi.c60
-rw-r--r--gawkapi.h39
3 files changed, 55 insertions, 50 deletions
diff --git a/ChangeLog b/ChangeLog
index 2ebb17de..6aeaf89b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-07-20 Arnold D. Robbins <arnold@skeeve.com>
+
+ * gawkapi.h: Rework table to not take up so much space.
+ * gawkapi.c (api_sym_update_scalar): Rework optimization code
+ to clean up the function.
+
2012-07-17 Arnold D. Robbins <arnold@skeeve.com>
Speedup:
diff --git a/gawkapi.c b/gawkapi.c
index c750f064..8dd900ec 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -589,57 +589,51 @@ api_sym_update_scalar(awk_ext_id_t id,
switch (value->val_type) {
case AWK_NUMBER:
- if (node->var_value->valref == 1 && ! do_mpfr) {
+ case AWK_STRING:
+ /* try for optimization */
+ if (node->var_value->valref == 1) {
NODE *r = node->var_value;
- r->numbr = value->num_value;
+ if (value->val_type == AWK_NUMBER && do_mpfr)
+ break; /* break switch, do it the hard way */
+
+ /* release the old string value if any */
if (r->flags & STRCUR) {
- efree(r->stptr);
+ if (r->flags & MALLOC)
+ efree(r->stptr);
r->stptr = NULL;
r->stlen = 0;
}
free_wstr(r);
- r->flags = MALLOC|NUMBER|NUMCUR;
+
+ if (value->val_type == AWK_NUMBER) {
+ r->flags = MALLOC|NUMBER|NUMCUR;
+ r->numbr = value->num_value;
+ } else {
+ r->flags &= ~(NUMBER|NUMCUR);
+ r->flags |= (STRING|STRCUR|MALLOC);
+ r->stfmt = -1;
+ r->stptr = value->str_value.str;
+ r->stlen = value->str_value.len;
+ }
+
return true;
}
- /* otherwise, fall through */
-
+ /* else
+ fall through */
case AWK_UNDEFINED:
case AWK_SCALAR:
case AWK_VALUE_COOKIE:
- break;
- case AWK_STRING:
- /* convert value to string, optimized */
- if (node->var_value->valref == 1) {
- 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 = awk_value_to_node(value);
- new_value->stptr = value->str_value.str;
- new_value->stlen = value->str_value.len;
- new_value->flags |= (STRING|STRCUR|MALLOC);
+ return true;
- return true;
- }
- break;
case AWK_ARRAY:
- return false;
break;
}
- /* do it the harder way */
-
- unref(node->var_value);
- node->var_value = awk_value_to_node(value);
-
- return true;
+ return false;
}
/*
diff --git a/gawkapi.h b/gawkapi.h
index 29631cdd..5cc8fc10 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -232,23 +232,28 @@ typedef struct gawk_api {
Table entry is type returned:
- +---------------------------------------------------+
- | Type Requested: |
- +----------+----------+-------+---------+-----------+
- | String | Number | Array | Scalar | Undefined |
- +---------+-----------+----------+----------+-------+---------+-----------+
- | Type | String | String | Number if| false | Scalar | String |
- | | | | it can be| | | |
- | | | |converted,| | | |
- | | | | else | | | |
- | | | | false | | | |
- | of +-----------+----------+----------+-------+---------+-----------+
- | Actual | Number | String | Number | false | Scalar | Number |
- | Value: +-----------+----------+----------+-------+---------+-----------+
- | | Array | false | false | Array | false | Array |
- | +-----------+----------+----------+-------+---------+-----------+
- | | Undefined | false | false | false | false | Undefined |
- +---------+-----------+----------+----------+-------+---------+-----------+
+
+ +-------------------------------------------------+
+ | Type of Actual Value: |
+ +------------+------------+-----------+-----------+
+ | String | Number | Array | Undefined |
+ +-----------+-----------+------------+------------+-----------+-----------+
+ | | String | String | String | false | false |
+ | |-----------+------------+------------+-----------+-----------+
+ | | Number | Number if | Number | false | false |
+ | | | can be | | | |
+ | | | converted, | | | |
+ | | | else false | | | |
+ | |-----------+------------+------------+-----------+-----------+
+ | Type | Array | false | false | Array | false |
+ | Requested |-----------+------------+------------+-----------+-----------+
+ | | Scalar | Scalar | Scalar | false | false |
+ | |-----------+------------+------------+-----------+-----------+
+ | | Undefined | String | Number | Array | Undefined |
+ | |-----------+------------+------------+-----------+-----------+
+ | | Value | false | false | false | false |
+ | | Cookie | | | | |
+ +-----------+-----------+------------+------------+-----------+-----------+
*/
/*