diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2012-07-20 12:00:31 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2012-07-20 12:00:31 +0300 |
commit | 50831fa7f402480d83d5e3647d09acdad7cd0eeb (patch) | |
tree | c046caf1aff844f764da81f8544805f275859828 /gawkapi.c | |
parent | 2abd3979c829934905f5a84dd2f5836b1d8eec37 (diff) | |
download | egawk-50831fa7f402480d83d5e3647d09acdad7cd0eeb.tar.gz egawk-50831fa7f402480d83d5e3647d09acdad7cd0eeb.tar.bz2 egawk-50831fa7f402480d83d5e3647d09acdad7cd0eeb.zip |
Update doc in header. Redo update_scalar.
Diffstat (limited to 'gawkapi.c')
-rw-r--r-- | gawkapi.c | 60 |
1 files changed, 27 insertions, 33 deletions
@@ -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; } /* |