Commit | Line | Data |
---|---|---|
79072805 LW |
1 | void |
2 | XXX(fcmd) | |
3 | register FF *fcmd; | |
4 | { | |
5 | register int i; | |
6 | register OP *arg; | |
7 | register int items; | |
8 | SV *sv; | |
9 | OP *parse_list(); | |
10 | line_t oldline = curcmd->cop_line; | |
11 | ||
12 | sv = fcmd->ff_unparsed; | |
13 | curcmd->cop_line = fcmd->ff_line; | |
14 | fcmd->ff_unparsed = Nullsv; | |
15 | ||
16 | /* Grrf. We have to fake curcmd to be in run_format's package temporarily... */ | |
17 | (void)save_hptr(&curcmd->cop_stash); | |
18 | (void)save_hptr(&curstash); | |
19 | curstash = sv->sv_u.sv_hv; | |
20 | curcmd->cop_stash = sv->sv_u.sv_hv; | |
21 | arg = parse_list(sv); | |
22 | ||
23 | items = arg->arg_len - 1; /* ignore $$ on end */ | |
24 | for (i = 1; i <= items; i++) { | |
25 | if (!fcmd || fcmd->ff_type == FFt_NULL) | |
26 | fatal("Too many field values"); | |
27 | dehoistXXX(arg,i); | |
28 | fcmd->ff_expr = redOP(OP_ITEM,1, | |
29 | arg[i].arg_ptr.arg_arg,Nullop,Nullop); | |
30 | if (fcmd->ff_flags & FFf_CHOP) { | |
31 | if ((fcmd->ff_expr[1].arg_type & A_MASK) == A_STAB) { | |
32 | fcmd->ff_expr[1].arg_type = DD_LVAL; | |
33 | ldehoistXXX(fcmd->ff_expr,1); | |
34 | } | |
35 | else if ((fcmd->ff_expr[1].arg_type & A_MASK) == A_EXPR) | |
36 | fcmd->ff_expr[1].arg_type = A_LEXPR; | |
37 | else | |
38 | fatal("^ field requires scalar lvalue"); | |
39 | } | |
40 | fcmd = fcmd->ff_next; | |
41 | } | |
42 | if (fcmd && fcmd->ff_type) | |
43 | fatal("Not enough field values"); | |
44 | curcmd->cop_line = oldline; | |
45 | Safefree(arg); | |
46 | sv_free(sv); | |
47 | } | |
48 |