94598ab6ea18d2697ed2e1c4dccf7c8900f4d053
[perl.git] / do / grep
1 int
2 do_grep(arg,TARG,gimme,arglast)
3 register ARG *arg;
4 STR *TARG;
5 int gimme;
6 int *arglast;
7 {
8     STR **st = stack->ary_array;
9     register int dst = arglast[1];
10     register int src = dst + 1;
11     register int sp = arglast[2];
12     register int i = sp - arglast[1];
13     int oldsave = savestack->ary_fill;
14     SPAT *oldspat = curspat;
15     int oldtmps_base = tmps_base;
16
17     savesptr(&stab_val(defstab));
18     tmps_base = tmps_max;
19     if ((arg[1].arg_type & A_MASK) != A_EXPR) {
20         arg[1].arg_type &= A_MASK;
21         dehoist(arg,1);
22         arg[1].arg_type |= A_DONT;
23     }
24     arg = arg[1].arg_ptr.arg_arg;
25     while (i-- > 0) {
26         if (st[src]) {
27             st[src]->str_pok &= ~SP_TEMP;
28             stab_val(defstab) = st[src];
29         }
30         else
31             stab_val(defstab) = str_mortal(&str_undef);
32         (void)eval(arg,G_SCALAR,sp);
33         st = stack->ary_array;
34         if (str_true(st[sp+1]))
35             st[dst++] = st[src];
36         src++;
37         curspat = oldspat;
38     }
39     restorelist(oldsave);
40     tmps_base = oldtmps_base;
41     if (gimme != G_ARRAY) {
42         str_numset(TARG,(double)(dst - arglast[1]));
43         STABSET(TARG);
44         st[arglast[0]+1] = TARG;
45         return arglast[0]+1;
46     }
47     return arglast[0] + (dst - arglast[1]);
48 }
49