ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/portio.c
Revision: 2.19
Committed: Thu Aug 18 00:52:48 2016 UTC (7 years, 8 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad5R1
Changes since 2.18: +8 -6 lines
Log Message:
Switched over to more efficient fread/fwrite replacements getbinary/putbinary

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: portio.c,v 2.18 2016/03/15 13:57:09 greg Exp $";
3 #endif
4 /*
5 * Portable i/o for binary files
6 *
7 * External symbols declared in rtio.h
8 */
9
10 #include "copyright.h"
11
12 #include "rtio.h"
13
14 #include <math.h>
15
16
17 void
18 putstr( /* write null-terminated string to fp */
19 char *s,
20 FILE *fp
21 )
22 {
23 do
24 putc(*s, fp);
25 while (*s++);
26 }
27
28
29 void
30 putint( /* write a siz-byte integer to fp */
31 long i,
32 int siz,
33 FILE *fp
34 )
35 {
36 siz <<= 3;
37 while ((siz -= 8) >= 0)
38 putc((int)(i>>siz & 0xff), fp);
39 }
40
41
42 void
43 putflt( /* put out floating point number */
44 double f,
45 FILE *fp
46 )
47 {
48 long m;
49 int e;
50
51 m = frexp(f, &e) * 0x7fffffff;
52 if (e > 127) { /* overflow */
53 m = m > 0 ? (long)0x7fffffff : -(long)0x7fffffff;
54 e = 127;
55 } else if (e < -128) { /* underflow */
56 m = 0;
57 e = 0;
58 }
59 putint(m, 4, fp);
60 putint((long)e, 1, fp);
61 }
62
63
64 int
65 putbinary( /* fwrite() replacement for small objects */
66 const void *p,
67 int elsiz,
68 int nel,
69 FILE *fp)
70 {
71 const char *s = (const char *)p;
72 int nbytes = elsiz*nel;
73
74 if (nbytes > 512)
75 return(fwrite(p, elsiz, nel, fp));
76
77 while (nbytes-- > 0)
78 putc(*s++, fp);
79
80 return(nel);
81 }
82
83
84 char *
85 getstr( /* get null-terminated string */
86 char *s,
87 FILE *fp
88 )
89 {
90 char *cp;
91 int c;
92
93 cp = s;
94 while ((c = getc(fp)) != EOF)
95 if ((*cp++ = c) == '\0')
96 return(s);
97
98 return(NULL);
99 }
100
101
102 long
103 getint( /* get a siz-byte integer */
104 int siz,
105 FILE *fp
106 )
107 {
108 int c;
109 long r;
110
111 if ((c = getc(fp)) == EOF)
112 return(EOF);
113 r = 0x80&c ? -1<<8|c : c; /* sign extend */
114 while (--siz > 0) {
115 if ((c = getc(fp)) == EOF)
116 return(EOF);
117 r <<= 8;
118 r |= c;
119 }
120 return(r);
121 }
122
123
124 double
125 getflt( /* get a floating point number */
126 FILE *fp
127 )
128 {
129 long l;
130 double d;
131
132 l = getint(4, fp);
133 if (l == EOF && feof(fp)) /* EOF? */
134 return((double)EOF);
135 if (l == 0) {
136 getc(fp); /* exactly zero -- ignore exponent */
137 return(0.0);
138 }
139 d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff);
140 return(ldexp(d, (int)getint(1, fp)));
141 }
142
143
144 int
145 getbinary( /* fread() replacement for small objects */
146 void *p,
147 int elsiz,
148 int nel,
149 FILE *fp)
150 {
151 char *s = (char *)p;
152 int nbytes = elsiz*nel;
153 int c;
154
155 if (nbytes > 512)
156 return(fread(p, elsiz, nel, fp));
157
158 while (nbytes-- > 0) {
159 if ((c = getc(fp)) == EOF)
160 return((elsiz*nel - nbytes)/elsiz);
161 *s++ = c;
162 }
163 return(nel);
164 }