6 register STR **st = stack->ary_array;
7 register int sp = arglast[1];
9 register char *pat = str_get(st[sp]);
10 register char *patend = pat + st[sp]->str_cur;
15 static char *null10 = "\0\0\0\0\0\0\0\0\0\0";
16 static char *space10 = " ";
18 /* These must not be in registers: */
33 items = arglast[2] - sp;
36 while (pat < patend) {
37 #define NEXTFROM (items-- > 0 ? *st++ : &str_no)
40 len = index("@Xxu",datumtype) ? 0 : items;
43 else if (isDIGIT(*pat)) {
46 len = (len * 10) + (*pat++ - '0');
54 fatal("% may only be used in unpack");
65 if (TARG->str_cur < len)
66 fatal("X outside of string");
68 TARG->str_ptr[TARG->str_cur] = '\0';
73 str_ncat(TARG,null10,10);
76 str_ncat(TARG,null10,len);
81 aptr = str_get(fromstr);
83 len = fromstr->str_cur;
84 if (fromstr->str_cur > len)
85 str_ncat(TARG,aptr,len);
87 str_ncat(TARG,aptr,fromstr->str_cur);
88 len -= fromstr->str_cur;
89 if (datumtype == 'A') {
91 str_ncat(TARG,space10,10);
94 str_ncat(TARG,space10,len);
98 str_ncat(TARG,null10,10);
101 str_ncat(TARG,null10,len);
113 aptr = str_get(fromstr);
115 len = fromstr->str_cur;
117 aint = TARG->str_cur;
118 TARG->str_cur += (len+7)/8;
119 STR_GROW(TARG, TARG->str_cur + 1);
120 aptr = TARG->str_ptr + aint;
121 if (len > fromstr->str_cur)
122 len = fromstr->str_cur;
125 if (datumtype == 'B') {
126 for (len = 0; len++ < aint;) {
131 *aptr++ = items & 0xff;
137 for (len = 0; len++ < aint;) {
143 *aptr++ = items & 0xff;
149 if (datumtype == 'B')
150 items <<= 7 - (aint & 7);
152 items >>= 7 - (aint & 7);
153 *aptr++ = items & 0xff;
155 pat = TARG->str_ptr + TARG->str_cur;
171 aptr = str_get(fromstr);
173 len = fromstr->str_cur;
175 aint = TARG->str_cur;
176 TARG->str_cur += (len+1)/2;
177 STR_GROW(TARG, TARG->str_cur + 1);
178 aptr = TARG->str_ptr + aint;
179 if (len > fromstr->str_cur)
180 len = fromstr->str_cur;
183 if (datumtype == 'H') {
184 for (len = 0; len++ < aint;) {
186 items |= ((*pat++ & 15) + 9) & 15;
188 items |= *pat++ & 15;
192 *aptr++ = items & 0xff;
198 for (len = 0; len++ < aint;) {
200 items |= (((*pat++ & 15) + 9) & 15) << 4;
202 items |= (*pat++ & 15) << 4;
206 *aptr++ = items & 0xff;
212 *aptr++ = items & 0xff;
213 pat = TARG->str_ptr + TARG->str_cur;
225 aint = (int)str_gnum(fromstr);
227 str_ncat(TARG,&achar,sizeof(char));
230 /* Float and double added by gnb@melba.bby.oz.au 22/11/89 */
235 afloat = (float)str_gnum(fromstr);
236 str_ncat(TARG, (char *)&afloat, sizeof (float));
243 adouble = (double)str_gnum(fromstr);
244 str_ncat(TARG, (char *)&adouble, sizeof (double));
250 ashort = (short)str_gnum(fromstr);
252 ashort = htons(ashort);
254 str_ncat(TARG,(char*)&ashort,sizeof(short));
260 ashort = (short)str_gnum(fromstr);
262 ashort = htovs(ashort);
264 str_ncat(TARG,(char*)&ashort,sizeof(short));
271 ashort = (short)str_gnum(fromstr);
272 str_ncat(TARG,(char*)&ashort,sizeof(short));
278 auint = U_I(str_gnum(fromstr));
279 str_ncat(TARG,(char*)&auint,sizeof(unsigned int));
285 aint = (int)str_gnum(fromstr);
286 str_ncat(TARG,(char*)&aint,sizeof(int));
292 aulong = U_L(str_gnum(fromstr));
294 aulong = htonl(aulong);
296 str_ncat(TARG,(char*)&aulong,sizeof(unsigned long));
302 aulong = U_L(str_gnum(fromstr));
304 aulong = htovl(aulong);
306 str_ncat(TARG,(char*)&aulong,sizeof(unsigned long));
312 aulong = U_L(str_gnum(fromstr));
313 str_ncat(TARG,(char*)&aulong,sizeof(unsigned long));
319 along = (long)str_gnum(fromstr);
320 str_ncat(TARG,(char*)&along,sizeof(long));
327 auquad = (unsigned quad)str_gnum(fromstr);
328 str_ncat(TARG,(char*)&auquad,sizeof(unsigned quad));
334 aquad = (quad)str_gnum(fromstr);
335 str_ncat(TARG,(char*)&aquad,sizeof(quad));
342 aptr = str_get(fromstr);
343 str_ncat(TARG,(char*)&aptr,sizeof(char*));
348 aptr = str_get(fromstr);
349 aint = fromstr->str_cur;
350 STR_GROW(TARG,aint * 4 / 3);
362 doencodes(TARG, aptr, todo);
374 doencodes(TARG, s, len)
382 str_ncat(TARG, hunk, 1);
385 hunk[0] = ' ' + (077 & (*s >> 2));
386 hunk[1] = ' ' + (077 & ((*s << 4) & 060 | (s[1] >> 4) & 017));
387 hunk[2] = ' ' + (077 & ((s[1] << 2) & 074 | (s[2] >> 6) & 03));
388 hunk[3] = ' ' + (077 & (s[2] & 077));
389 str_ncat(TARG, hunk, 4);
393 for (s = TARG->str_ptr; *s; s++) {
397 str_ncat(TARG, "\n", 1);