|
|
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.