ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/portio.c
Revision: 2.16
Committed: Thu Mar 3 22:06:18 2016 UTC (8 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.15: +42 -1 lines
Log Message:
Added fread() and fwrite() replacements

File Contents

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