ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/portio.c
Revision: 2.13
Committed: Tue May 3 05:10:13 2005 UTC (19 years ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad3R8
Changes since 2.12: +11 -2 lines
Log Message:
Added handling of overflow and underflow conditions in putflt()

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.13 static const char RCSid[] = "$Id: portio.c,v 2.12 2005/02/18 16:34:27 greg Exp $";
3 greg 2.1 #endif
4     /*
5     * Portable i/o for binary files
6 greg 2.6 *
7     * External symbols declared in standard.h
8     */
9    
10 greg 2.7 #include "copyright.h"
11 greg 2.1
12     #include <stdio.h>
13 schorsch 2.8
14     #include "rtio.h"
15 greg 2.1
16 greg 2.9 #include <math.h>
17 greg 2.10
18     #ifdef getc_unlocked /* avoid horrendous overhead of flockfile */
19 greg 2.11 #undef getc
20     #undef putc
21 greg 2.10 #define getc getc_unlocked
22     #define putc putc_unlocked
23     #endif
24 greg 2.1
25 greg 2.3
26 greg 2.6 void
27 greg 2.1 putstr(s, fp) /* write null-terminated string to fp */
28     register char *s;
29     register FILE *fp;
30     {
31     do
32     putc(*s, fp);
33     while (*s++);
34     }
35    
36    
37 greg 2.6 void
38 greg 2.1 putint(i, siz, fp) /* write a siz-byte integer to fp */
39     long i;
40     register int siz;
41     register FILE *fp;
42     {
43     while (siz--)
44 greg 2.2 putc((int)(i>>(siz<<3) & 0xff), fp);
45 greg 2.1 }
46    
47    
48 greg 2.6 void
49 greg 2.1 putflt(f, fp) /* put out floating point number */
50 greg 2.2 double f;
51     FILE *fp;
52 greg 2.1 {
53 greg 2.13 long m;
54 greg 2.1 int e;
55    
56 greg 2.13 m = frexp(f, &e) * 0x7fffffff;
57     if (e > 127) { /* overflow */
58     m = m > 0 ? (long)0x7fffffff : -(long)0x7fffffff;
59     e = 127;
60     } else if (e < -128) { /* underflow */
61     m = 0;
62     e = 0;
63     }
64     putint(m, 4, fp);
65 greg 2.1 putint((long)e, 1, fp);
66     }
67    
68    
69     char *
70     getstr(s, fp) /* get null-terminated string */
71     char *s;
72     register FILE *fp;
73     {
74     register char *cp;
75     register int c;
76    
77     cp = s;
78     while ((c = getc(fp)) != EOF)
79     if ((*cp++ = c) == '\0')
80     return(s);
81    
82     return(NULL);
83     }
84    
85    
86     long
87     getint(siz, fp) /* get a siz-byte integer */
88     int siz;
89     register FILE *fp;
90     {
91     register int c;
92     register long r;
93    
94     if ((c = getc(fp)) == EOF)
95     return(EOF);
96     r = 0x80&c ? -1<<8|c : c; /* sign extend */
97     while (--siz > 0) {
98     if ((c = getc(fp)) == EOF)
99     return(EOF);
100     r <<= 8;
101     r |= c;
102     }
103     return(r);
104     }
105    
106    
107     double
108     getflt(fp) /* get a floating point number */
109     FILE *fp;
110     {
111 greg 2.5 long l;
112 greg 2.2 double d;
113 greg 2.1
114 greg 2.5 l = getint(4, fp);
115 greg 2.12 if (l == 0) {
116     getc(fp); /* exactly zero -- ignore exponent */
117     return(0.0);
118     }
119 greg 2.5 d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff);
120 greg 2.1 return(ldexp(d, (int)getint(1, fp)));
121     }