perl 5.0 alpha 3
[perl.git] / do / vop
1 void
2 do_vop(optype,TARG,left,right)
3 STR *TARG;
4 STR *left;
5 STR *right;
6 {
7     register char *s;
8     register char *l = str_get(left);
9     register char *r = str_get(right);
10     register int len;
11
12     len = left->str_cur;
13     if (len > right->str_cur)
14         len = right->str_cur;
15     if (TARG->str_cur > len)
16         TARG->str_cur = len;
17     else if (TARG->str_cur < len) {
18         STR_GROW(TARG,len);
19         (void)memzero(TARG->str_ptr + TARG->str_cur, len - TARG->str_cur);
20         TARG->str_cur = len;
21     }
22     TARG->str_pok = 1;
23     TARG->str_nok = 0;
24     s = TARG->str_ptr;
25     if (!s) {
26         str_nset(TARG,"",0);
27         s = TARG->str_ptr;
28     }
29     switch (optype) {
30     case O_BIT_AND:
31         while (len--)
32             *s++ = *l++ & *r++;
33         break;
34     case O_XOR:
35         while (len--)
36             *s++ = *l++ ^ *r++;
37         goto mop_up;
38     case O_BIT_OR:
39         while (len--)
40             *s++ = *l++ | *r++;
41       mop_up:
42         len = TARG->str_cur;
43         if (right->str_cur > len)
44             str_ncat(TARG,right->str_ptr+len,right->str_cur - len);
45         else if (left->str_cur > len)
46             str_ncat(TARG,left->str_ptr+len,left->str_cur - len);
47         break;
48     }
49 }
50