aboutsummaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2016-08-03 21:38:50 +0300
committerArnold D. Robbins <arnold@skeeve.com>2016-08-03 21:38:50 +0300
commitf591d307d9af95bfa0ccda4d5eb76a674447ba39 (patch)
tree65c8e2259634653566fc2c49ec996ff416330361 /builtin.c
parent9907a598dca8f129422c42f8c4fa3b4e2c988221 (diff)
downloadegawk-f591d307d9af95bfa0ccda4d5eb76a674447ba39.tar.gz
egawk-f591d307d9af95bfa0ccda4d5eb76a674447ba39.tar.bz2
egawk-f591d307d9af95bfa0ccda4d5eb76a674447ba39.zip
Restore typed regexp code in a new branch.
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/builtin.c b/builtin.c
index b295cd24..87f7fb23 100644
--- a/builtin.c
+++ b/builtin.c
@@ -532,7 +532,7 @@ do_length(int nargs)
return make_number(size);
}
- assert(tmp->type == Node_val);
+ assert(tmp->type == Node_val || tmp->type == Node_typedregex);
if (do_lint && (fixtype(tmp)->flags & STRING) == 0)
lintwarn(_("length: received non-string argument"));
@@ -2191,10 +2191,12 @@ do_print(int nargs, int redirtype)
fatal(_("attempt to use array `%s' in a scalar context"), array_vname(tmp));
}
- if ( (tmp->flags & STRCUR) == 0
- || ( tmp->stfmt != STFMT_UNUSED
- && tmp->stfmt != OFMTidx))
- args_array[i] = format_val(OFMT, OFMTidx, tmp);
+ if (tmp->type == Node_typedregex)
+ args_array[i] = force_string(tmp);
+ else if ( (tmp->flags & STRCUR) == 0
+ || ( tmp->stfmt != STFMT_UNUSED
+ && tmp->stfmt != OFMTidx))
+ args_array[i] = format_val(OFMT, OFMTidx, tmp);
}
if (redir_exp != NULL) {
@@ -3197,7 +3199,8 @@ call_sub(const char *name, int nargs)
* push replace
* push $0
*/
- regex = make_regnode(Node_regex, regex);
+ if (regex->type != Node_typedregex)
+ regex = make_regnode(Node_regex, regex);
PUSH(regex);
PUSH(replace);
lhs = r_get_field(zero, (Func_ptr *) 0, true);
@@ -3221,7 +3224,8 @@ call_sub(const char *name, int nargs)
* nargs++
* }
*/
- regex = make_regnode(Node_regex, regex);
+ if (regex->type != Node_typedregex)
+ regex = make_regnode(Node_regex, regex);
PUSH(regex);
PUSH(replace);
PUSH(glob_flag);
@@ -3258,7 +3262,8 @@ call_match(int nargs)
/* Don't need to pop the string just to push it back ... */
- regex = make_regnode(Node_regex, regex);
+ if (regex->type != Node_typedregex)
+ regex = make_regnode(Node_regex, regex);
PUSH(regex);
if (array)
@@ -3286,7 +3291,8 @@ call_split_func(const char *name, int nargs)
if (nargs >= 3) {
regex = POP_STRING();
- regex = make_regnode(Node_regex, regex);
+ if (regex->type != Node_typedregex)
+ regex = make_regnode(Node_regex, regex);
} else {
if (name[0] == 's') {
regex = make_regnode(Node_regex, FS_node->var_value);
@@ -3942,6 +3948,9 @@ do_typeof(int nargs)
res = "array";
deref = false;
break;
+ case Node_typedregex:
+ res = "regexp";
+ break;
case Node_val:
case Node_var:
switch (arg->flags & (STRING|NUMBER|MAYBE_NUM)) {