This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl 5.0 alpha 2
[perl5.git] / parse_format
CommitLineData
79072805
LW
1void
2XXX(fcmd)
3register 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