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
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