ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/portio.c
Revision: 2.24
Committed: Fri Feb 19 02:59:32 2021 UTC (3 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.23: +8 -2 lines
Log Message:
fix: added handling of writing longer long's that architecture supports

File Contents

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