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 (18 years, 11 months 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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: portio.c,v 2.12 2005/02/18 16:34:27 greg Exp $";
3 #endif
4 /*
5 * Portable i/o for binary files
6 *
7 * External symbols declared in standard.h
8 */
9
10 #include "copyright.h"
11
12 #include <stdio.h>
13
14 #include "rtio.h"
15
16 #include <math.h>
17
18 #ifdef getc_unlocked /* avoid horrendous overhead of flockfile */
19 #undef getc
20 #undef putc
21 #define getc getc_unlocked
22 #define putc putc_unlocked
23 #endif
24
25
26 void
27 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 void
38 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 putc((int)(i>>(siz<<3) & 0xff), fp);
45 }
46
47
48 void
49 putflt(f, fp) /* put out floating point number */
50 double f;
51 FILE *fp;
52 {
53 long m;
54 int e;
55
56 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 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 long l;
112 double d;
113
114 l = getint(4, fp);
115 if (l == 0) {
116 getc(fp); /* exactly zero -- ignore exponent */
117 return(0.0);
118 }
119 d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff);
120 return(ldexp(d, (int)getint(1, fp)));
121 }