7 unpack(uchar *b, uchar *p, uchar *e, char *f, ...)
13 r = vunpack(b, p, e, f, a);
19 pack(uchar *b, uchar *p, uchar *e, char *f, ...)
25 r = vpack(b, p, e, f, a);
31 vunpack(uchar *b, uchar *p, uchar *e, char *f, va_list a)
39 int (*funpack)(uchar *, uchar *, uchar *, void *);
44 memset(sub, 0, sizeof(sub));
45 for(sp = sub; sp < sub+nelem(sub); sp++){
61 *va_arg(a, int*) = *p;
67 *va_arg(a, int*) = (int)p[1]<<8 | (int)p[0];
73 *va_arg(a, int*) = (int)p[3]<<24 | (int)p[2]<<16 | (int)p[1]<<8 | (int)p[0];
96 funpack = va_arg(a, void*);
97 if((n = funpack(b, p, e, va_arg(a, void*))) == 0)
106 if((n = unpack(b, p, e, ff, &i)) == 0)
123 if(sp->o >= 0 && b + sp->o > p)
124 if(b + sp->o <= e || *f != '?')
131 e = p + sp->c * sp->i;
136 sp->ap = va_arg(a, uchar**);
137 sp->ae = va_arg(a, uchar**);
144 sp->c = ((p - (b + sp->o))+sp->i-1)/sp->i;
145 p = b + sp->o + sp->c * sp->i;
155 *va_arg(a, uchar**) = p;
164 vpack(uchar *b, uchar *p, uchar *e, char *f, va_list a)
169 uchar *wc, *wo, wcf, wof;
171 int (*fpack)(uchar *, uchar *, uchar *, void *);
177 memset(sub, 0, sizeof(sub));
178 for(sp = sub; sp < sub+nelem(sub); sp++){
193 *p++ = va_arg(a, int);
216 v = va_arg(a, vlong);
235 fpack = va_arg(a, void*);
236 if((n = fpack(b, p, e, va_arg(a, void*))) == 0)
245 if((n = pack(b, p, e, ff, 0)) == 0)
270 s = va_arg(a, uchar*);
271 se = va_arg(a, uchar*);
273 if(n < 0 || p + n > e)
282 n = ((p - (b + sp->o))+sp->i-1)/sp->i;
283 p = b + sp->o + n * sp->i;
287 pack(b, sp->wc, e, ff, n);
292 pack(b, sp->wo, e, ff, sp->o);
297 *va_arg(a, uchar**) = p;