60b8d529f9bc0b44934f62a7b6a114c85af090df
[perl.git] / do / vecset
1 void
2 do_vecset(mstr,TARG)
3 STR *mstr;
4 STR *TARG;
5 {
6     struct lstring *lstr = (struct lstring*)TARG;
7     register int offset;
8     register int size;
9     register unsigned char *s = (unsigned char*)mstr->str_ptr;
10     register unsigned long lval = U_L(str_gnum(TARG));
11     int mask;
12
13     mstr->str_rare = 0;
14     TARG->str_magic = Nullstr;
15     offset = lstr->lstr_offset;
16     size = lstr->lstr_len;
17     if (size < 8) {
18         mask = (1 << size) - 1;
19         size = offset & 7;
20         lval &= mask;
21         offset >>= 3;
22         s[offset] &= ~(mask << size);
23         s[offset] |= lval << size;
24     }
25     else {
26         if (size == 8)
27             s[offset] = lval & 255;
28         else if (size == 16) {
29             s[offset] = (lval >> 8) & 255;
30             s[offset+1] = lval & 255;
31         }
32         else if (size == 32) {
33             s[offset] = (lval >> 24) & 255;
34             s[offset+1] = (lval >> 16) & 255;
35             s[offset+2] = (lval >> 8) & 255;
36             s[offset+3] = lval & 255;
37         }
38     }
39 }
40