ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/portio.c
Revision: 2.22
Committed: Mon Jul 15 21:27:25 2019 UTC (4 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R3
Changes since 2.21: +6 -5 lines
Log Message:
Reduced size limit for fread() & fwrite() again and other minor changes

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.22 static const char RCSid[] = "$Id: portio.c,v 2.21 2019/07/05 03:04:22 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 greg 2.22 while ((siz -= 8) > 0)
38 greg 2.18 putc((int)(i>>siz & 0xff), fp);
39 greg 2.22 putc((int)(i & 0xff), fp);
40 greg 2.1 }
41    
42    
43 greg 2.6 void
44 greg 2.15 putflt( /* put out floating point number */
45     double f,
46     FILE *fp
47     )
48 greg 2.1 {
49 greg 2.13 long m;
50 greg 2.1 int e;
51    
52 greg 2.13 m = frexp(f, &e) * 0x7fffffff;
53     if (e > 127) { /* overflow */
54     m = m > 0 ? (long)0x7fffffff : -(long)0x7fffffff;
55     e = 127;
56     } else if (e < -128) { /* underflow */
57     m = 0;
58     e = 0;
59     }
60     putint(m, 4, fp);
61 greg 2.22 putint(e, 1, fp);
62 greg 2.1 }
63    
64    
65 greg 2.16 int
66     putbinary( /* fwrite() replacement for small objects */
67 greg 2.19 const void *p,
68 greg 2.16 int elsiz,
69     int nel,
70     FILE *fp)
71     {
72 greg 2.19 const char *s = (const char *)p;
73     int nbytes = elsiz*nel;
74 greg 2.16
75 greg 2.22 if (nbytes > 128)
76 greg 2.19 return(fwrite(p, elsiz, nel, fp));
77 greg 2.16
78     while (nbytes-- > 0)
79 greg 2.21 if (putc(*s++, fp) == EOF)
80     return((elsiz*nel - nbytes)/elsiz);
81 greg 2.16
82     return(nel);
83     }
84    
85    
86 greg 2.1 char *
87 greg 2.15 getstr( /* get null-terminated string */
88     char *s,
89     FILE *fp
90     )
91 greg 2.1 {
92 greg 2.15 char *cp;
93     int c;
94 greg 2.1
95     cp = s;
96     while ((c = getc(fp)) != EOF)
97     if ((*cp++ = c) == '\0')
98     return(s);
99    
100     return(NULL);
101     }
102    
103    
104     long
105 greg 2.15 getint( /* get a siz-byte integer */
106     int siz,
107     FILE *fp
108     )
109 greg 2.1 {
110 greg 2.15 int c;
111     long r;
112 greg 2.1
113     if ((c = getc(fp)) == EOF)
114     return(EOF);
115     r = 0x80&c ? -1<<8|c : c; /* sign extend */
116     while (--siz > 0) {
117     if ((c = getc(fp)) == EOF)
118     return(EOF);
119     r <<= 8;
120     r |= c;
121     }
122     return(r);
123     }
124    
125    
126     double
127 greg 2.15 getflt( /* get a floating point number */
128     FILE *fp
129     )
130 greg 2.1 {
131 greg 2.5 long l;
132 greg 2.2 double d;
133 greg 2.1
134 greg 2.5 l = getint(4, fp);
135 greg 2.15 if (l == EOF && feof(fp)) /* EOF? */
136     return((double)EOF);
137 greg 2.12 if (l == 0) {
138     getc(fp); /* exactly zero -- ignore exponent */
139     return(0.0);
140     }
141 greg 2.5 d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff);
142 greg 2.1 return(ldexp(d, (int)getint(1, fp)));
143     }
144 greg 2.16
145    
146     int
147     getbinary( /* fread() replacement for small objects */
148 greg 2.19 void *p,
149 greg 2.16 int elsiz,
150     int nel,
151     FILE *fp)
152     {
153 greg 2.19 char *s = (char *)p;
154 greg 2.16 int nbytes = elsiz*nel;
155     int c;
156    
157 greg 2.22 if (nbytes > 128)
158 greg 2.19 return(fread(p, elsiz, nel, fp));
159 greg 2.16
160     while (nbytes-- > 0) {
161     if ((c = getc(fp)) == EOF)
162     return((elsiz*nel - nbytes)/elsiz);
163     *s++ = c;
164     }
165     return(nel);
166     }