ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/portio.c
Revision: 2.14
Committed: Sat Dec 23 17:27:45 2006 UTC (17 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad4R1, rad4R0, rad3R9
Changes since 2.13: +2 -4 lines
Log Message:
Added byte-swapping i/o options to rcalc

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.14 static const char RCSid[] = "$Id: portio.c,v 2.13 2005/05/03 05:10:13 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.1 putstr(s, fp) /* write null-terminated string to fp */
26     register char *s;
27     register FILE *fp;
28     {
29     do
30     putc(*s, fp);
31     while (*s++);
32     }
33    
34    
35 greg 2.6 void
36 greg 2.1 putint(i, siz, fp) /* write a siz-byte integer to fp */
37     long i;
38     register int siz;
39     register FILE *fp;
40     {
41     while (siz--)
42 greg 2.2 putc((int)(i>>(siz<<3) & 0xff), fp);
43 greg 2.1 }
44    
45    
46 greg 2.6 void
47 greg 2.1 putflt(f, fp) /* put out floating point number */
48 greg 2.2 double f;
49     FILE *fp;
50 greg 2.1 {
51 greg 2.13 long m;
52 greg 2.1 int e;
53    
54 greg 2.13 m = frexp(f, &e) * 0x7fffffff;
55     if (e > 127) { /* overflow */
56     m = m > 0 ? (long)0x7fffffff : -(long)0x7fffffff;
57     e = 127;
58     } else if (e < -128) { /* underflow */
59     m = 0;
60     e = 0;
61     }
62     putint(m, 4, fp);
63 greg 2.1 putint((long)e, 1, fp);
64     }
65    
66    
67     char *
68     getstr(s, fp) /* get null-terminated string */
69     char *s;
70     register FILE *fp;
71     {
72     register char *cp;
73     register int c;
74    
75     cp = s;
76     while ((c = getc(fp)) != EOF)
77     if ((*cp++ = c) == '\0')
78     return(s);
79    
80     return(NULL);
81     }
82    
83    
84     long
85     getint(siz, fp) /* get a siz-byte integer */
86     int siz;
87     register FILE *fp;
88     {
89     register int c;
90     register long r;
91    
92     if ((c = getc(fp)) == EOF)
93     return(EOF);
94     r = 0x80&c ? -1<<8|c : c; /* sign extend */
95     while (--siz > 0) {
96     if ((c = getc(fp)) == EOF)
97     return(EOF);
98     r <<= 8;
99     r |= c;
100     }
101     return(r);
102     }
103    
104    
105     double
106     getflt(fp) /* get a floating point number */
107     FILE *fp;
108     {
109 greg 2.5 long l;
110 greg 2.2 double d;
111 greg 2.1
112 greg 2.5 l = getint(4, fp);
113 greg 2.12 if (l == 0) {
114     getc(fp); /* exactly zero -- ignore exponent */
115     return(0.0);
116     }
117 greg 2.5 d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff);
118 greg 2.1 return(ldexp(d, (int)getint(1, fp)));
119     }