diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2016-11-15 21:45:58 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2016-11-15 21:45:58 +0200 |
commit | 4f1eec385831018980e4c7424e1a544c5313b52a (patch) | |
tree | dc9ffe7aba416c469113a03ff08629d2bfeb6312 /awkgram.y | |
parent | b37675aa79213f2665abb2bbb4db90560642bdee (diff) | |
download | egawk-4f1eec385831018980e4c7424e1a544c5313b52a.tar.gz egawk-4f1eec385831018980e4c7424e1a544c5313b52a.tar.bz2 egawk-4f1eec385831018980e4c7424e1a544c5313b52a.zip |
Finish reworking typed regexes. Tests pass!
Diffstat (limited to 'awkgram.y')
-rw-r--r-- | awkgram.y | 23 |
1 files changed, 11 insertions, 12 deletions
@@ -516,7 +516,7 @@ regexp typed_regexp : TYPED_REGEXP { - NODE *n, *exp; + NODE *n, *exp, *n2; char *re; size_t len; @@ -525,14 +525,21 @@ typed_regexp len = strlen(re); exp = make_str_node(re, len, ALREADY_MALLOCED); - n = make_regnode(Node_val, exp); + n = make_regnode(Node_regex, exp); if (n == NULL) { unref(exp); YYABORT; } + + n2 = make_string(re, len); + n2->typed_re = n; + n2->numbr = 0; + n2->flags |= NUMCUR|STRCUR|REGEX; + n2->flags &= ~(STRING|NUMBER); + $$ = $1; $$->opcode = Op_push_re; - $$->memory = n; + $$->memory = n2; } a_slash @@ -5006,9 +5013,9 @@ make_regnode(int type, NODE *exp) getnode(n); memset(n, 0, sizeof(NODE)); n->type = type; + n->re_cnt = 1; if (type == Node_regex) { - n->re_cnt = 1; n->re_reg = make_regexp(exp->stptr, exp->stlen, false, true, false); if (n->re_reg == NULL) { freenode(n); @@ -5017,14 +5024,6 @@ make_regnode(int type, NODE *exp) n->re_exp = exp; n->re_flags = CONSTANT; n->valref = 1; - } else if (type == Node_val) { - exp->tre_regs = make_regexp(exp->stptr, exp->stlen, false, true, false); - exp->flags |= REGEX|MALLOC|STRCUR|NUMCUR; - exp->numbr = 0; - exp->flags &= ~(STRING|NUMBER); - exp->valref = 1; - unref(n); - n = exp; } return n; } |