|
|
researchv10 Norman
/*
* picunpack -- non-ansi version, uses varargs instead of stdarg
* Bugs:
* f and d are non-portable
* could be faster
*/
#include <picfile.h>
#include <stdio.h>
#include <varargs.h>
void picunpack(va_alist)
va_dcl
{
register char *bp, *cp;
register short *sp;
register long *lp;
register float *fp;
register double *dp;
register char *buf, *ebuf;
PICFILE *f;
char *fmt;
int nchan;
va_list pvar;
va_start(pvar);
f=va_arg(pvar, PICFILE *);
buf=va_arg(pvar, char *);
nchan=f->nchan;
ebuf=buf+f->width*nchan;
for(fmt=va_arg(pvar, char *);*fmt;fmt++) switch(*fmt){
case 'c':
cp=va_arg(pvar, char *);
for(bp=buf;bp!=ebuf;bp+=nchan)
*cp++=*bp;
buf++;
ebuf++;
break;
case 's':
sp=va_arg(pvar, short *);
for(bp=buf;bp!=ebuf;bp+=nchan)
*sp++=(bp[0]&255)|(bp[1]<<8);
buf+=2;
ebuf+=2;
break;
case 'l':
lp=va_arg(pvar, long *);
for(bp=buf;bp!=ebuf;bp+=nchan)
*lp++=(bp[0]&255)|((bp[1]&255)<<8)|((bp[2]&255)<<16)|(bp[3]<<24);
buf+=4;
ebuf+=4;
break;
case 'f':
fp=va_arg(pvar, float *);
for(bp=buf;bp!=ebuf;bp+=nchan){
cp=(char *)fp++;
cp[0]=bp[0];
cp[1]=bp[1];
cp[2]=bp[2];
cp[3]=bp[3];
}
buf+=4;
ebuf+=4;
break;
case 'd':
dp=va_arg(pvar, double *);
for(bp=buf;bp!=ebuf;bp+=nchan){
cp=(char *)dp++;
cp[0]=bp[0];
cp[1]=bp[1];
cp[2]=bp[2];
cp[3]=bp[3];
cp[4]=bp[4];
cp[5]=bp[5];
cp[6]=bp[6];
cp[7]=bp[7];
}
buf+=8;
ebuf+=8;
break;
case '_':
buf++;
ebuf++;
break;
}
va_end(pvar);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.