]> git.mxchange.org Git - simgear.git/blob - simgear/io/lowlevel.hxx
Don't refference simgear_config.h because this header gets installed :-(
[simgear.git] / simgear / io / lowlevel.hxx
1 // lowlevel.hxx -- routines to handle lowlevel compressed binary IO of
2 //                 various datatypes
3 //
4 // Shamelessly adapted from plib  January 2001
5 //
6 // Original version Copyright (C) 2000  the plib team
7 // Local changes Copyright (C) 2000  Curtis L. Olson  - http://www.flightgear.org/~curt
8 //
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
13 //
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 //
23 // $Id$
24 //
25
26
27 #ifndef _SG_LOWLEVEL_HXX
28 #define _SG_LOWLEVEL_HXX
29
30 #include <stdio.h>
31 #include <zlib.h>
32 #ifndef _MSC_VER
33 # include <stdint.h>
34 #endif
35
36 #include <plib/sg.h>
37
38 #include <simgear/compiler.h>
39
40 // Note that output is written in little endian form (and converted as
41 // necessary for big endian machines)
42
43 void sgReadChar ( gzFile fd, char *var ) ;
44 void sgWriteChar ( gzFile fd, const char var ) ;
45 void sgReadFloat ( gzFile fd, float *var ) ;
46 void sgWriteFloat ( gzFile fd, const float var ) ;
47 void sgReadDouble ( gzFile fd, double *var ) ;
48 void sgWriteDouble ( gzFile fd, const double var ) ;
49 void sgReadUInt ( gzFile fd, unsigned int *var ) ;
50 void sgWriteUInt ( gzFile fd, const unsigned int var ) ;
51 void sgReadInt ( gzFile fd, int *var ) ;
52 void sgWriteInt ( gzFile fd, const int var ) ;
53 void sgReadLong ( gzFile fd, int32_t *var ) ;
54 void sgWriteLong ( gzFile fd, const int32_t var ) ;
55 void sgReadLongLong ( gzFile fd, int64_t *var ) ;
56 void sgWriteLongLong ( gzFile fd, const int64_t var ) ;
57 void sgReadUShort ( gzFile fd, unsigned short *var ) ;
58 void sgWriteUShort ( gzFile fd, const unsigned short var ) ;
59 void sgReadShort ( gzFile fd, short *var ) ;
60 void sgWriteShort ( gzFile fd, const short var ) ;
61
62 void sgReadFloat ( gzFile fd, const unsigned int n, float *var ) ;
63 void sgWriteFloat ( gzFile fd, const unsigned int n, const float *var ) ;
64 void sgReadDouble ( gzFile fd, const unsigned int n, double *var ) ;
65 void sgWriteDouble ( gzFile fd, const unsigned int n, const double *var ) ;
66 void sgReadUInt ( gzFile fd, const unsigned int n, unsigned int *var ) ;
67 void sgWriteUInt ( gzFile fd, const unsigned int n, const unsigned int *var ) ;
68 void sgReadInt ( gzFile fd, const unsigned int n, int *var ) ;
69 void sgWriteInt ( gzFile fd, const unsigned int n, const int *var ) ;
70 void sgReadUShort ( gzFile fd, const unsigned int n, unsigned short *var ) ;
71 void sgWriteUShort ( gzFile fd, const unsigned int n, const unsigned short *var ) ;
72 void sgReadShort ( gzFile fd, const unsigned int n, short *var ) ;
73 void sgWriteShort ( gzFile fd, const unsigned int n, const short *var ) ;
74 void sgReadBytes ( gzFile fd, const unsigned int n, void *var ) ;
75 void sgWriteBytes ( gzFile fd, const unsigned int n, const void *var ) ;
76
77 void sgReadString ( gzFile fd, char **var ) ;
78 void sgWriteString ( gzFile fd, const char *var ) ;
79
80 inline void sgReadVec2  ( gzFile fd, sgVec2 var ) {
81     sgReadFloat  ( fd, 2, var ) ;
82 }
83 inline void sgWriteVec2 ( gzFile fd, const sgVec2 var ) {
84     sgWriteFloat ( fd, 2, var ) ;
85 }
86
87 inline void sgReadVec3  ( gzFile fd, sgVec3 var ) {
88     sgReadFloat  ( fd, 3, var ) ;
89 }
90 inline void sgWriteVec3 ( gzFile fd, const sgVec3 var ) {
91     sgWriteFloat ( fd, 3, var ) ;
92 }
93
94 inline void sgReaddVec3  ( gzFile fd, sgdVec3 var ) {
95     sgReadDouble  ( fd, 3, var ) ;
96 }
97 inline void sgWritedVec3 ( gzFile fd, const sgdVec3 var ) {
98     sgWriteDouble ( fd, 3, var ) ;
99 }
100
101 inline void sgReadVec4  ( gzFile fd, sgVec4 var ) {
102     sgReadFloat  ( fd, 4, var ) ;
103 }
104 inline void sgWriteVec4 ( gzFile fd, const sgVec4 var ) {
105     sgWriteFloat ( fd, 4, var ) ;
106 }
107
108 inline void sgReadMat4  ( gzFile fd, sgMat4 var ) {
109     sgReadFloat  ( fd, 16, (float *)var ) ;
110 }
111 inline void sgWriteMat4 ( gzFile fd, const sgMat4 var ) {
112     sgWriteFloat ( fd, 16, (float *)var ) ;
113 }
114
115 void sgClearReadError();
116 void sgClearWriteError();
117 int sgReadError();
118 int sgWriteError();
119
120 inline bool sgIsLittleEndian() {
121     static const int sgEndianTest = 1;
122     return (*((char *) &sgEndianTest ) != 0);
123 }
124
125 inline bool sgIsBigEndian() {
126     static const int sgEndianTest = 1;
127     return (*((char *) &sgEndianTest ) == 0);
128 }
129
130 inline void sgEndianSwap(unsigned short *x) {
131     *x =
132         (( *x >>  8 ) & 0x00FF ) | 
133         (( *x <<  8 ) & 0xFF00 ) ;
134 }
135   
136 inline void sgEndianSwap(unsigned int *x) {
137     *x =
138         (( *x >> 24 ) & 0x000000FF ) | 
139         (( *x >>  8 ) & 0x0000FF00 ) | 
140         (( *x <<  8 ) & 0x00FF0000 ) | 
141         (( *x << 24 ) & 0xFF000000 ) ;
142 }
143   
144 inline void sgEndianSwap(uint64_t *x) {
145 #ifndef _MSC_VER
146     *x =
147         (( *x >> 56 ) & 0x00000000000000FFULL ) | 
148         (( *x >> 40 ) & 0x000000000000FF00ULL ) | 
149         (( *x >> 24 ) & 0x0000000000FF0000ULL ) | 
150         (( *x >>  8 ) & 0x00000000FF000000ULL ) | 
151         (( *x <<  8 ) & 0x000000FF00000000ULL ) | 
152         (( *x << 24 ) & 0x0000FF0000000000ULL ) |
153         (( *x << 40 ) & 0x00FF000000000000ULL ) |
154         (( *x << 56 ) & 0xFF00000000000000ULL ) ;
155 #else
156     *x =
157         (( *x >> 56 ) & 0x00000000000000FF ) | 
158         (( *x >> 40 ) & 0x000000000000FF00 ) | 
159         (( *x >> 24 ) & 0x0000000000FF0000 ) | 
160         (( *x >>  8 ) & 0x00000000FF000000 ) | 
161         (( *x <<  8 ) & 0x000000FF00000000 ) | 
162         (( *x << 24 ) & 0x0000FF0000000000 ) |
163         (( *x << 40 ) & 0x00FF000000000000 ) |
164         (( *x << 56 ) & 0xFF00000000000000 ) ;
165 #endif
166 }
167
168 #endif // _SG_LOWLEVEL_HXX