|
|
1.1 ! root 1: /* ! 2: * picunpack -- 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 picunpack(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: *cp++=*bp; ! 33: buf++; ! 34: ebuf++; ! 35: break; ! 36: case 's': ! 37: sp=va_arg(pvar, short *); ! 38: for(bp=buf;bp!=ebuf;bp+=nchan) ! 39: *sp++=(bp[0]&255)|(bp[1]<<8); ! 40: buf+=2; ! 41: ebuf+=2; ! 42: break; ! 43: case 'l': ! 44: lp=va_arg(pvar, long *); ! 45: for(bp=buf;bp!=ebuf;bp+=nchan) ! 46: *lp++=(bp[0]&255)|((bp[1]&255)<<8)|((bp[2]&255)<<16)|(bp[3]<<24); ! 47: buf+=4; ! 48: ebuf+=4; ! 49: break; ! 50: case 'f': ! 51: fp=va_arg(pvar, float *); ! 52: for(bp=buf;bp!=ebuf;bp+=nchan){ ! 53: cp=(char *)fp++; ! 54: cp[0]=bp[0]; ! 55: cp[1]=bp[1]; ! 56: cp[2]=bp[2]; ! 57: cp[3]=bp[3]; ! 58: } ! 59: buf+=4; ! 60: ebuf+=4; ! 61: break; ! 62: case 'd': ! 63: dp=va_arg(pvar, double *); ! 64: for(bp=buf;bp!=ebuf;bp+=nchan){ ! 65: cp=(char *)dp++; ! 66: cp[0]=bp[0]; ! 67: cp[1]=bp[1]; ! 68: cp[2]=bp[2]; ! 69: cp[3]=bp[3]; ! 70: cp[4]=bp[4]; ! 71: cp[5]=bp[5]; ! 72: cp[6]=bp[6]; ! 73: cp[7]=bp[7]; ! 74: } ! 75: buf+=8; ! 76: ebuf+=8; ! 77: break; ! 78: case '_': ! 79: buf++; ! 80: ebuf++; ! 81: break; ! 82: } ! 83: va_end(pvar); ! 84: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.