diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2018-11-24 19:30:55 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2018-11-24 19:30:55 +0200 |
commit | 531cf0ed26f857c2a2d3b13baf70eae72cefe6f7 (patch) | |
tree | 9656b093c799382a15e5a309c3cdcb4c1237da3f /main.c | |
parent | 0624fb68b8d0ad2bef23bf4e2b68297a1162ad7d (diff) | |
download | egawk-531cf0ed26f857c2a2d3b13baf70eae72cefe6f7.tar.gz egawk-531cf0ed26f857c2a2d3b13baf70eae72cefe6f7.tar.bz2 egawk-531cf0ed26f857c2a2d3b13baf70eae72cefe6f7.zip |
Allow command line assignment of typed regexps.
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 75 |
1 files changed, 48 insertions, 27 deletions
@@ -1155,15 +1155,34 @@ arg_assign(char *arg, bool initing) if (do_lint) lintwarn(_("`%s' is not a variable name, looking for file `%s=%s'"), arg, arg, cp); - } else { - if (check_special(arg) >= 0) - fatal(_("cannot use gawk builtin `%s' as variable name"), arg); - if (! initing) { - var = lookup(arg); - if (var != NULL && var->type == Node_func) - fatal(_("cannot use function `%s' as variable name"), arg); - } + goto done; + } + + // Assigning a string or typed regex + + if (check_special(arg) >= 0) + fatal(_("cannot use gawk builtin `%s' as variable name"), arg); + + if (! initing) { + var = lookup(arg); + if (var != NULL && var->type == Node_func) + fatal(_("cannot use function `%s' as variable name"), arg); + } + + cp2 = cp + strlen(cp) - 1; // end char + if (! do_traditional + && cp[0] == '@' && cp[1] == '/' && *cp2 == '/') { + // typed regex + size_t len = strlen(cp) - 3; + + ezalloc(cp2, char *, len + 1, "arg_assign"); + memcpy(cp2, cp + 2, len); + + it = make_typed_regex(cp2, len); + // fall through to variable setup + } else { + // string assignment // POSIX disallows any newlines inside strings // The scanner handles that for program files. @@ -1190,28 +1209,30 @@ arg_assign(char *arg, bool initing) if (do_posix) setlocale(LC_NUMERIC, locale); #endif /* LC_NUMERIC */ + } - /* - * since we are restoring the original text of ARGV later, - * need to copy the variable name part if we don't want - * name like v=abc instead of just v in var->vname - */ + /* + * since we are restoring the original text of ARGV later, + * need to copy the variable name part if we don't want + * name like v=abc instead of just v in var->vname + */ - cp2 = estrdup(arg, cp - arg); /* var name */ - - var = variable(0, cp2, Node_var); - if (var == NULL) /* error */ - final_exit(EXIT_FATAL); - if (var->type == Node_var && var->var_update) - var->var_update(); - lhs = get_lhs(var, false); - unref(*lhs); - *lhs = it; - /* check for set_FOO() routine */ - if (var->type == Node_var && var->var_assign) - var->var_assign(); - } + cp2 = estrdup(arg, cp - arg); /* var name */ + + var = variable(0, cp2, Node_var); + if (var == NULL) /* error */ + final_exit(EXIT_FATAL); + + if (var->type == Node_var && var->var_update) + var->var_update(); + lhs = get_lhs(var, false); + unref(*lhs); + *lhs = it; + /* check for set_FOO() routine */ + if (var->type == Node_var && var->var_assign) + var->var_assign(); +done: if (! initing) *--cp = '='; /* restore original text of ARGV */ FNR = save_FNR; |