|
|
1.1 root 1: /*
2: * picpack -- non-ansi version, uses varargs instead of stdarg
3: * Bugs:
4: * f and d are non-portable
5: * could be faster
6: */
7: #include <picfile.h>
8: #include <stdio.h>
9: #include <varargs.h>
10: void picpack(va_alist)
11: va_dcl
12: {
13: register char *bp, *cp;
14: register short *sp;
15: register long *lp;
16: register float *fp;
17: register double *dp;
18: register char *buf, *ebuf;
19: PICFILE *f;
20: char *fmt;
21: int nchan;
22: va_list pvar;
23: va_start(pvar);
24: f=va_arg(pvar, PICFILE *);
25: buf=va_arg(pvar, char *);
26: nchan=f->nchan;
27: ebuf=buf+f->width*nchan;
28: for(fmt=va_arg(pvar, char *);*fmt;fmt++) switch(*fmt){
29: case 'c':
30: cp=va_arg(pvar, char *);
31: for(bp=buf;bp!=ebuf;bp+=nchan)
32: *bp=*cp++;
33: buf++;
34: ebuf++;
35: break;
36: case 's':
37: sp=va_arg(pvar, short *);
38: for(bp=buf;bp!=ebuf;bp+=nchan){
39: *bp=*sp;
40: bp[1]=*sp++>>8;
41: }
42: buf+=2;
43: ebuf+=2;
44: break;
45: case 'l':
46: lp=va_arg(pvar, long *);
47: for(bp=buf;bp!=ebuf;bp+=nchan){
48: *bp=*lp;
49: bp[1]=*lp>>8;
50: bp[2]=*lp>>16;
51: bp[3]=*lp++>>24;
52: }
53: buf+=4;
54: ebuf+=4;
55: break;
56: case 'f':
57: fp=va_arg(pvar, float *);
58: for(bp=buf;bp!=ebuf;bp+=nchan){
59: cp=(char *)fp++;
60: bp[0]=cp[0];
61: bp[1]=cp[1];
62: bp[2]=cp[2];
63: bp[3]=cp[3];
64: }
65: buf+=4;
66: ebuf+=4;
67: break;
68: case 'd':
69: dp=va_arg(pvar, double *);
70: for(bp=buf;bp!=ebuf;bp+=nchan){
71: cp=(char *)dp++;
72: bp[0]=cp[0];
73: bp[1]=cp[1];
74: bp[2]=cp[2];
75: bp[3]=cp[3];
76: bp[4]=cp[4];
77: bp[5]=cp[5];
78: bp[6]=cp[6];
79: bp[7]=cp[7];
80: }
81: buf+=8;
82: ebuf+=8;
83: break;
84: case '_':
85: buf++;
86: ebuf++;
87: break;
88: }
89: va_end(pvar);
90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.