diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2021-03-22 16:33:36 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2021-03-22 16:33:36 +0200 |
commit | 1fc3d1cbc5c31ecd7b232e8845530ce6a6760986 (patch) | |
tree | e971ac583d2b29de4371a0579720bf16ca142ebf /gawkapi.c | |
parent | efc5713d00a0019eb33c8a61c8a5514da7fa303e (diff) | |
download | gawk-1fc3d1cbc5c31ecd7b232e8845530ce6a6760986.tar.gz |
Progress on extension support for boolean types.
Diffstat (limited to 'gawkapi.c')
-rw-r--r-- | gawkapi.c | 38 |
1 files changed, 33 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: @@ -567,9 +570,20 @@ 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) { + val->val_type = AWK_BOOL; + val->bool_value = (get_number_si(node) ? awk_true : awk_false); + 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 if ((node->flags & BOOL) != 0) + val->val_type = AWK_BOOL; else { (void) force_number(node); assign_number(node, val); @@ -578,7 +592,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 BOOL: + val->val_type = AWK_BOOL; + break; case STRING: val->val_type = AWK_STRING; break; @@ -612,10 +629,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 BOOL: + val->val_type = AWK_BOOL; + break; case NUMBER: val->val_type = AWK_NUMBER; break; @@ -640,7 +660,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 BOOL: + val->val_type = AWK_BOOL; + break; case STRING: val->val_type = AWK_STRING; break; @@ -668,7 +691,12 @@ 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 BOOL: + val->val_type = AWK_BOOL; + val->bool_value = (get_number_si(node) ? awk_true : awk_false); + ret = awk_true; + break; case STRING: assign_string(node, val, AWK_STRING); ret = awk_true; |