--- ray/src/common/portio.c 2005/02/18 16:34:27 2.12 +++ ray/src/common/portio.c 2019/07/05 03:04:22 2.21 @@ -1,32 +1,24 @@ #ifndef lint -static const char RCSid[] = "$Id: portio.c,v 2.12 2005/02/18 16:34:27 greg Exp $"; +static const char RCSid[] = "$Id: portio.c,v 2.21 2019/07/05 03:04:22 greg Exp $"; #endif /* * Portable i/o for binary files * - * External symbols declared in standard.h + * External symbols declared in rtio.h */ #include "copyright.h" -#include - #include "rtio.h" #include -#ifdef getc_unlocked /* avoid horrendous overhead of flockfile */ -#undef getc -#undef putc -#define getc getc_unlocked -#define putc putc_unlocked -#endif - void -putstr(s, fp) /* write null-terminated string to fp */ -register char *s; -register FILE *fp; +putstr( /* write null-terminated string to fp */ + char *s, + FILE *fp +) { do putc(*s, fp); @@ -35,35 +27,69 @@ register FILE *fp; void -putint(i, siz, fp) /* write a siz-byte integer to fp */ -long i; -register int siz; -register FILE *fp; +putint( /* write a siz-byte integer to fp */ + long i, + int siz, + FILE *fp +) { - while (siz--) - putc((int)(i>>(siz<<3) & 0xff), fp); + siz <<= 3; + while ((siz -= 8) >= 0) + putc((int)(i>>siz & 0xff), fp); } void -putflt(f, fp) /* put out floating point number */ -double f; -FILE *fp; +putflt( /* put out floating point number */ + double f, + FILE *fp +) { + long m; int e; - putint((long)(frexp(f,&e)*0x7fffffff), 4, fp); + m = frexp(f, &e) * 0x7fffffff; + if (e > 127) { /* overflow */ + m = m > 0 ? (long)0x7fffffff : -(long)0x7fffffff; + e = 127; + } else if (e < -128) { /* underflow */ + m = 0; + e = 0; + } + putint(m, 4, fp); putint((long)e, 1, fp); } +int +putbinary( /* fwrite() replacement for small objects */ + const void *p, + int elsiz, + int nel, + FILE *fp) +{ + const char *s = (const char *)p; + int nbytes = elsiz*nel; + + if (nbytes > 256) + return(fwrite(p, elsiz, nel, fp)); + + while (nbytes-- > 0) + if (putc(*s++, fp) == EOF) + return((elsiz*nel - nbytes)/elsiz); + + return(nel); +} + + char * -getstr(s, fp) /* get null-terminated string */ -char *s; -register FILE *fp; +getstr( /* get null-terminated string */ + char *s, + FILE *fp +) { - register char *cp; - register int c; + char *cp; + int c; cp = s; while ((c = getc(fp)) != EOF) @@ -75,12 +101,13 @@ register FILE *fp; long -getint(siz, fp) /* get a siz-byte integer */ -int siz; -register FILE *fp; +getint( /* get a siz-byte integer */ + int siz, + FILE *fp +) { - register int c; - register long r; + int c; + long r; if ((c = getc(fp)) == EOF) return(EOF); @@ -96,17 +123,43 @@ register FILE *fp; double -getflt(fp) /* get a floating point number */ -FILE *fp; +getflt( /* get a floating point number */ + FILE *fp +) { long l; double d; l = getint(4, fp); + if (l == EOF && feof(fp)) /* EOF? */ + return((double)EOF); if (l == 0) { getc(fp); /* exactly zero -- ignore exponent */ return(0.0); } d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff); return(ldexp(d, (int)getint(1, fp))); +} + + +int +getbinary( /* fread() replacement for small objects */ + void *p, + int elsiz, + int nel, + FILE *fp) +{ + char *s = (char *)p; + int nbytes = elsiz*nel; + int c; + + if (nbytes > 256) + return(fread(p, elsiz, nel, fp)); + + while (nbytes-- > 0) { + if ((c = getc(fp)) == EOF) + return((elsiz*nel - nbytes)/elsiz); + *s++ = c; + } + return(nel); }