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

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.19 static const char RCSid[] = "$Id: portio.c,v 2.18 2016/03/15 13:57:09 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 greg 2.3
17 greg 2.6 void
18 greg 2.15 putstr( /* write null-terminated string to fp */
19     char *s,
20     FILE *fp
21     )
22 greg 2.1 {
23     do
24     putc(*s, fp);
25     while (*s++);
26     }
27    
28    
29 greg 2.6 void
30 greg 2.15 putint( /* write a siz-byte integer to fp */
31     long i,
32     int siz,
33     FILE *fp
34     )
35 greg 2.1 {
36 greg 2.18 siz <<= 3;
37     while ((siz -= 8) >= 0)
38     putc((int)(i>>siz & 0xff), fp);
39 greg 2.1 }
40    
41    
42 greg 2.6 void
43 greg 2.15 putflt( /* put out floating point number */
44     double f,
45     FILE *fp
46     )
47 greg 2.1 {
48 greg 2.13 long m;
49 greg 2.1 int e;
50    
51 greg 2.13 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 greg 2.1 putint((long)e, 1, fp);
61     }
62    
63    
64 greg 2.16 int
65     putbinary( /* fwrite() replacement for small objects */
66 greg 2.19 const void *p,
67 greg 2.16 int elsiz,
68     int nel,
69     FILE *fp)
70     {
71 greg 2.19 const char *s = (const char *)p;
72     int nbytes = elsiz*nel;
73 greg 2.16
74     if (nbytes > 512)
75 greg 2.19 return(fwrite(p, elsiz, nel, fp));
76 greg 2.16
77     while (nbytes-- > 0)
78     putc(*s++, fp);
79    
80     return(nel);
81     }
82    
83    
84 greg 2.1 char *
85 greg 2.15 getstr( /* get null-terminated string */
86     char *s,
87     FILE *fp
88     )
89 greg 2.1 {
90 greg 2.15 char *cp;
91     int c;
92 greg 2.1
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 greg 2.15 getint( /* get a siz-byte integer */
104     int siz,
105     FILE *fp
106     )
107 greg 2.1 {
108 greg 2.15 int c;
109     long r;
110 greg 2.1
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 greg 2.15 getflt( /* get a floating point number */
126     FILE *fp
127     )
128 greg 2.1 {
129 greg 2.5 long l;
130 greg 2.2 double d;
131 greg 2.1
132 greg 2.5 l = getint(4, fp);
133 greg 2.15 if (l == EOF && feof(fp)) /* EOF? */
134     return((double)EOF);
135 greg 2.12 if (l == 0) {
136     getc(fp); /* exactly zero -- ignore exponent */
137     return(0.0);
138     }
139 greg 2.5 d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff);
140 greg 2.1 return(ldexp(d, (int)getint(1, fp)));
141     }
142 greg 2.16
143    
144     int
145     getbinary( /* fread() replacement for small objects */
146 greg 2.19 void *p,
147 greg 2.16 int elsiz,
148     int nel,
149     FILE *fp)
150     {
151 greg 2.19 char *s = (char *)p;
152 greg 2.16 int nbytes = elsiz*nel;
153     int c;
154    
155     if (nbytes > 512)
156 greg 2.19 return(fread(p, elsiz, nel, fp));
157 greg 2.16
158     while (nbytes-- > 0) {
159     if ((c = getc(fp)) == EOF)
160     return((elsiz*nel - nbytes)/elsiz);
161     *s++ = c;
162     }
163     return(nel);
164     }