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, 3 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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: portio.c,v 2.13 2005/05/03 05:10:13 greg Exp $";
3 #endif
4 /*
5 * Portable i/o for binary files
6 *
7 * External symbols declared in rtio.h
8 */
9
10 #include "copyright.h"
11
12 #include "rtio.h"
13
14 #include <math.h>
15
16 #ifdef getc_unlocked /* avoid horrendous overhead of flockfile */
17 #undef getc
18 #undef putc
19 #define getc getc_unlocked
20 #define putc putc_unlocked
21 #endif
22
23
24 void
25 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 void
36 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 putc((int)(i>>(siz<<3) & 0xff), fp);
43 }
44
45
46 void
47 putflt(f, fp) /* put out floating point number */
48 double f;
49 FILE *fp;
50 {
51 long m;
52 int e;
53
54 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 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 long l;
110 double d;
111
112 l = getint(4, fp);
113 if (l == 0) {
114 getc(fp); /* exactly zero -- ignore exponent */
115 return(0.0);
116 }
117 d = (l + (l > 0 ? .5 : -.5)) * (1./0x7fffffff);
118 return(ldexp(d, (int)getint(1, fp)));
119 }