--- ray/src/common/portio.c 2003/02/22 02:07:22 2.6 +++ ray/src/common/portio.c 2012/10/19 01:40:33 2.15 @@ -1,83 +1,31 @@ #ifndef lint -static const char RCSid[] = "$Id: portio.c,v 2.6 2003/02/22 02:07:22 greg Exp $"; +static const char RCSid[] = "$Id: portio.c,v 2.15 2012/10/19 01:40:33 greg Exp $"; #endif /* * Portable i/o for binary files * - * External symbols declared in standard.h + * External symbols declared in rtio.h */ -/* ==================================================================== - * The Radiance Software License, Version 1.0 - * - * Copyright (c) 1990 - 2002 The Regents of the University of California, - * through Lawrence Berkeley National Laboratory. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes Radiance software - * (http://radsite.lbl.gov/) - * developed by the Lawrence Berkeley National Laboratory - * (http://www.lbl.gov/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" - * and "The Regents of the University of California" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact radiance@radsite.lbl.gov. - * - * 5. Products derived from this software may not be called "Radiance", - * nor may "Radiance" appear in their name, without prior written - * permission of Lawrence Berkeley National Laboratory. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of Lawrence Berkeley National Laboratory. For more - * information on Lawrence Berkeley National Laboratory, please see - * . - */ +#include "copyright.h" -#include +#include "rtio.h" -#ifndef frexp -extern double frexp(); +#include + +#ifdef getc_unlocked /* avoid horrendous overhead of flockfile */ +#undef getc +#undef putc +#define getc getc_unlocked +#define putc putc_unlocked #endif -#ifndef ldexp -extern double ldexp(); -#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); @@ -86,10 +34,11 @@ 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); @@ -97,24 +46,35 @@ register FILE *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); } 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) @@ -126,12 +86,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); @@ -147,13 +108,20 @@ 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))); }