2 do_vec(lvalue,astr,arglast)
7 STR **st = stack->ary_array;
9 register STR *TARG = st[++sp];
10 register int offset = (int)str_gnum(st[++sp]);
11 register int size = (int)str_gnum(st[++sp]);
12 unsigned char *s = (unsigned char*)str_get(TARG);
17 offset *= size; /* turn into bit offset */
18 len = (offset + size + 7) / 8;
19 if (offset < 0 || size < 1)
21 else if (!lvalue && len > TARG->str_cur)
24 if (len > TARG->str_cur) {
26 (void)memzero(TARG->str_ptr + TARG->str_cur, len - TARG->str_cur);
29 s = (unsigned char*)str_get(TARG);
31 retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
37 retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
39 retnum = ((unsigned long) s[offset] << 24) +
40 ((unsigned long) s[offset + 1] << 16) +
41 (s[offset + 2] << 8) + s[offset+3];
44 if (lvalue) { /* it's an lvalue! */
45 struct lstring *lstr = (struct lstring*)astr;
47 astr->str_magic = TARG;
48 st[sp]->str_rare = 'v';
49 lstr->lstr_offset = offset;
50 lstr->lstr_len = size;
54 str_numset(astr,(double)retnum);