--- ray/src/common/portio.c 1992/07/13 15:36:01 2.1 +++ ray/src/common/portio.c 2006/12/23 17:27:45 2.14 @@ -1,16 +1,27 @@ -/* Copyright (c) 1992 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: portio.c,v 2.14 2006/12/23 17:27:45 greg Exp $"; #endif - /* * Portable i/o for binary files + * + * External symbols declared in rtio.h */ -#include +#include "copyright.h" +#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; @@ -21,23 +32,34 @@ register FILE *fp; } +void putint(i, siz, fp) /* write a siz-byte integer to fp */ long i; register int siz; register FILE *fp; { while (siz--) - putc(i>>(siz<<3) & 0xff, fp); + putc((int)(i>>(siz<<3) & 0xff), fp); } +void putflt(f, fp) /* put out floating point number */ -double f; +double f; +FILE *fp; { - extern double frexp(); + 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); } @@ -84,9 +106,14 @@ double getflt(fp) /* get a floating point number */ FILE *fp; { - extern double ldexp(); - double d; + long l; + double d; - d = (double)getint(4, fp)/0x7fffffff; + l = getint(4, fp); + 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))); }