ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/portio.c
Revision: 2.17
Committed: Thu Mar 3 22:09:59 2016 UTC (8 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.16: +1 -8 lines
Log Message:
Moved putc and getc overrides to rtio.h

File Contents

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