diff options
Diffstat (limited to 'gawkapi.c')
-rw-r--r-- | gawkapi.c | 44 |
1 files changed, 39 insertions, 5 deletions
@@ -160,6 +160,9 @@ awk_value_to_node(const awk_value_t *retval) case AWK_UNDEFINED: ext_ret_val = dupnode(Nnull_string); break; + case AWK_BOOL: + ext_ret_val = make_bool_node(retval->bool_value != awk_false); + break; case AWK_NUMBER: switch (retval->num_type) { case AWK_NUMBER_TYPE_DOUBLE: @@ -532,6 +535,16 @@ assign_regex(NODE *node, awk_value_t *val) val->val_type = AWK_REGEX; } +/* assign_bool --- return a bool node */ + +static inline void +assign_bool(NODE *node, awk_value_t *val) +{ + assert((node->flags & BOOL) != 0); + val->val_type = AWK_BOOL; + val->bool_value = get_number_si(node) != 0 ? awk_true : awk_false; +} + /* node_to_awk_value --- convert a node into a value for an extension */ static awk_bool_t @@ -567,8 +580,16 @@ node_to_awk_value(NODE *node, awk_value_t *val, awk_valtype_t wanted) case Node_val: /* a scalar value */ switch (wanted) { + case AWK_BOOL: + if ((node->flags & BOOL) != 0) { + assign_bool(node, val); + ret = awk_true; + } else + ret = awk_false; + break; + case AWK_NUMBER: - if (node->flags & REGEX) + if ((node->flags & REGEX) != 0) val->val_type = AWK_REGEX; else { (void) force_number(node); @@ -578,7 +599,10 @@ node_to_awk_value(NODE *node, awk_value_t *val, awk_valtype_t wanted) break; case AWK_STRNUM: - switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) { + switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX|BOOL)) { + case NUMBER|BOOL: + val->val_type = AWK_BOOL; + break; case STRING: val->val_type = AWK_STRING; break; @@ -612,10 +636,13 @@ node_to_awk_value(NODE *node, awk_value_t *val, awk_valtype_t wanted) break; case AWK_REGEX: - switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) { + switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX|BOOL)) { case STRING: val->val_type = AWK_STRING; break; + case NUMBER|BOOL: + val->val_type = AWK_BOOL; + break; case NUMBER: val->val_type = AWK_NUMBER; break; @@ -640,7 +667,10 @@ node_to_awk_value(NODE *node, awk_value_t *val, awk_valtype_t wanted) break; case AWK_SCALAR: - switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) { + switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX|BOOL)) { + case NUMBER|BOOL: + val->val_type = AWK_BOOL; + break; case STRING: val->val_type = AWK_STRING; break; @@ -668,7 +698,11 @@ node_to_awk_value(NODE *node, awk_value_t *val, awk_valtype_t wanted) case AWK_UNDEFINED: /* return true and actual type for request of undefined */ - switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) { + switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX|BOOL)) { + case NUMBER|BOOL: + assign_bool(node, val); + ret = awk_true; + break; case STRING: assign_string(node, val, AWK_STRING); ret = awk_true; |