~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to main.c

  • Committer: Arnold D. Robbins
  • Date: 2018-11-24 17:30:55 UTC
  • mto: (731.15.90) (1056.1.1)
  • mto: This revision was merged to the branch mainline in revision 1025.
  • Revision ID: git-v1:531cf0ed26f857c2a2d3b13baf70eae72cefe6f7
Allow command line assignment of typed regexps.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1155
1155
                if (do_lint)
1156
1156
                        lintwarn(_("`%s' is not a variable name, looking for file `%s=%s'"),
1157
1157
                                arg, arg, cp);
 
1158
 
 
1159
                goto done;
 
1160
        }
 
1161
 
 
1162
        // Assigning a string or typed regex
 
1163
 
 
1164
        if (check_special(arg) >= 0)
 
1165
                fatal(_("cannot use gawk builtin `%s' as variable name"), arg);
 
1166
 
 
1167
        if (! initing) {
 
1168
                var = lookup(arg);
 
1169
                if (var != NULL && var->type == Node_func)
 
1170
                        fatal(_("cannot use function `%s' as variable name"), arg);
 
1171
        }
 
1172
 
 
1173
        cp2 = cp + strlen(cp) - 1;      // end char
 
1174
        if (! do_traditional
 
1175
            && cp[0] == '@' && cp[1] == '/' && *cp2 == '/') {
 
1176
                // typed regex
 
1177
                size_t len = strlen(cp) - 3;
 
1178
 
 
1179
                ezalloc(cp2, char *, len + 1, "arg_assign");
 
1180
                memcpy(cp2, cp + 2, len);
 
1181
 
 
1182
                it = make_typed_regex(cp2, len);
 
1183
                // fall through to variable setup
1158
1184
        } else {
1159
 
                if (check_special(arg) >= 0)
1160
 
                        fatal(_("cannot use gawk builtin `%s' as variable name"), arg);
1161
 
 
1162
 
                if (! initing) {
1163
 
                        var = lookup(arg);
1164
 
                        if (var != NULL && var->type == Node_func)
1165
 
                                fatal(_("cannot use function `%s' as variable name"), arg);
1166
 
                }
 
1185
                // string assignment
1167
1186
 
1168
1187
                // POSIX disallows any newlines inside strings
1169
1188
                // The scanner handles that for program files.
1190
1209
                if (do_posix)
1191
1210
                        setlocale(LC_NUMERIC, locale);
1192
1211
#endif /* LC_NUMERIC */
1193
 
 
1194
 
                /*
1195
 
                 * since we are restoring the original text of ARGV later,
1196
 
                 * need to copy the variable name part if we don't want
1197
 
                 * name like v=abc instead of just v in var->vname
1198
 
                 */
1199
 
 
1200
 
                cp2 = estrdup(arg, cp - arg);   /* var name */
1201
 
 
1202
 
                var = variable(0, cp2, Node_var);
1203
 
                if (var == NULL)        /* error */
1204
 
                        final_exit(EXIT_FATAL);
1205
 
                if (var->type == Node_var && var->var_update)
1206
 
                        var->var_update();
1207
 
                lhs = get_lhs(var, false);
1208
 
                unref(*lhs);
1209
 
                *lhs = it;
1210
 
                /* check for set_FOO() routine */
1211
 
                if (var->type == Node_var && var->var_assign)
1212
 
                        var->var_assign();
1213
1212
        }
1214
1213
 
 
1214
        /*
 
1215
         * since we are restoring the original text of ARGV later,
 
1216
         * need to copy the variable name part if we don't want
 
1217
         * name like v=abc instead of just v in var->vname
 
1218
         */
 
1219
 
 
1220
        cp2 = estrdup(arg, cp - arg);   /* var name */
 
1221
 
 
1222
        var = variable(0, cp2, Node_var);
 
1223
        if (var == NULL)        /* error */
 
1224
                final_exit(EXIT_FATAL);
 
1225
 
 
1226
        if (var->type == Node_var && var->var_update)
 
1227
                var->var_update();
 
1228
        lhs = get_lhs(var, false);
 
1229
        unref(*lhs);
 
1230
        *lhs = it;
 
1231
        /* check for set_FOO() routine */
 
1232
        if (var->type == Node_var && var->var_assign)
 
1233
                var->var_assign();
 
1234
 
 
1235
done:
1215
1236
        if (! initing)
1216
1237
                *--cp = '=';    /* restore original text of ARGV */
1217
1238
        FNR = save_FNR;