FlightGear next
tiny_xdr.cxx
Go to the documentation of this file.
1
2//
3// Tiny XDR implementation for flightgear
4// written by Oliver Schroeder
5// released to the public domain
6//
7// This implementation is not complete, but implements
8// everything we need.
9//
10// For further reading on XDR read RFC 1832.
11//
13
14#include <string>
15
16#include "tiny_xdr.hxx"
17
18/* XDR 8bit integers */
20XDR_encode_int8 ( const int8_t & n_Val )
21{
22 return (SWAP32(static_cast<xdr_data_t> (n_Val)));
23}
24
26XDR_encode_uint8 ( const uint8_t & n_Val )
27{
28 return (SWAP32(static_cast<xdr_data_t> (n_Val)));
29}
30
31int8_t
32XDR_decode_int8 ( const xdr_data_t & n_Val )
33{
34 return (static_cast<int8_t> (SWAP32(n_Val)));
35}
36
37uint8_t
39{
40 return (static_cast<uint8_t> (SWAP32(n_Val)));
41}
42
43/* XDR 16bit integers */
45XDR_encode_int16 ( const int16_t & n_Val )
46{
47 return (SWAP32(static_cast<xdr_data_t> (n_Val)));
48}
49
51XDR_encode_uint16 ( const uint16_t & n_Val )
52{
53 return (SWAP32(static_cast<xdr_data_t> (n_Val)));
54}
55
56int16_t
58{
59 return (static_cast<int16_t> (SWAP32(n_Val)));
60}
61
62uint16_t
64{
65 return (static_cast<uint16_t> (SWAP32(n_Val)));
66}
67
68
69/* XDR 32bit integers */
71XDR_encode_int32 ( const int32_t & n_Val )
72{
73 return (SWAP32(static_cast<xdr_data_t> (n_Val)));
74}
75
76/*
77 * Safely convert from an int into a short. Anything outside the bounds of a short will
78 * simply be the max/min value of short (+/- 32767)
79 */
80static short XDR_convert_int_to_short(int v1)
81{
82 if (v1 < -32767)
83 v1 = -32767;
84
85 if (v1 > 32767)
86 v1 = 32767;
87
88 return (short)v1;
89}
90
91/*
92 * Pack two 16bit shorts into a 32 bit int. By convention v1 is packed in the highword
93 */
94xdr_data_t XDR_encode_shortints32(const int v1, const int v2)
95{
96 return XDR_encode_uint32(((XDR_convert_int_to_short(v1) << 16) & 0xffff0000) | ((XDR_convert_int_to_short(v2)) & 0xffff));
97}
98/* Decode packed shorts into two ints. V1 in the highword ($V1..V2..)*/
99void XDR_decode_shortints32(const xdr_data_t & n_Val, int &v1, int &v2)
100{
101 int _v1 = XDR_decode_int32(n_Val);
102 short s2 = (short)(_v1 & 0xffff);
103 short s1 = (short)(_v1 >> 16);
104 v1 = s1;
105 v2 = s2;
106}
107
109XDR_encode_uint32 ( const uint32_t & n_Val )
110{
111 return (SWAP32(static_cast<xdr_data_t> (n_Val)));
112}
113
114int32_t
116{
117 return (static_cast<int32_t> (SWAP32(n_Val)));
118}
119
120uint32_t
122{
123 return (static_cast<uint32_t> (SWAP32(n_Val)));
124}
125
126
127/* XDR 64bit integers */
129XDR_encode_int64 ( const int64_t & n_Val )
130{
131 return (SWAP64(static_cast<xdr_data2_t> (n_Val)));
132}
133
135XDR_encode_uint64 ( const uint64_t & n_Val )
136{
137 return (SWAP64(static_cast<xdr_data2_t> (n_Val)));
138}
139
140int64_t
142{
143 return (static_cast<int64_t> (SWAP64(n_Val)));
144}
145
146uint64_t
148{
149 return (static_cast<uint64_t> (SWAP64(n_Val)));
150}
151
152
153/* float */
155XDR_encode_float ( const float & f_Val )
156{
157 union {
158 xdr_data_t x;
159 float f;
160 } tmp;
161
162 tmp.f = f_Val;
163 return (XDR_encode_int32 (tmp.x));
164}
165
166float
168{
169 union {
170 xdr_data_t x;
171 float f;
172 } tmp;
173
174 tmp.x = XDR_decode_int32 (f_Val);
175 return tmp.f;
176}
177
178/* double */
180XDR_encode_double ( const double & d_Val )
181{
182 union {
183 xdr_data2_t x;
184 double d;
185 } tmp;
186
187 tmp.d = d_Val;
188 return (XDR_encode_int64 (tmp.x));
189}
190
191double
193{
194 union {
195 xdr_data2_t x;
196 double d;
197 } tmp;
198
199 tmp.x = XDR_decode_int64 (d_Val);
200 return tmp.d;
201}
202
xdr_data_t XDR_encode_int32(const int32_t &n_Val)
Definition tiny_xdr.cxx:71
xdr_data_t XDR_encode_shortints32(const int v1, const int v2)
Definition tiny_xdr.cxx:94
int16_t XDR_decode_int16(const xdr_data_t &n_Val)
Definition tiny_xdr.cxx:57
int64_t XDR_decode_int64(const xdr_data2_t &n_Val)
Definition tiny_xdr.cxx:141
uint32_t XDR_decode_uint32(const xdr_data_t &n_Val)
Definition tiny_xdr.cxx:121
xdr_data2_t XDR_encode_uint64(const uint64_t &n_Val)
Definition tiny_xdr.cxx:135
double XDR_decode_double(const xdr_data2_t &d_Val)
Definition tiny_xdr.cxx:192
uint8_t XDR_decode_uint8(const xdr_data_t &n_Val)
Definition tiny_xdr.cxx:38
xdr_data2_t XDR_encode_double(const double &d_Val)
Definition tiny_xdr.cxx:180
xdr_data_t XDR_encode_uint8(const uint8_t &n_Val)
Definition tiny_xdr.cxx:26
xdr_data2_t XDR_encode_int64(const int64_t &n_Val)
Definition tiny_xdr.cxx:129
xdr_data_t XDR_encode_int8(const int8_t &n_Val)
Definition tiny_xdr.cxx:20
uint16_t XDR_decode_uint16(const xdr_data_t &n_Val)
Definition tiny_xdr.cxx:63
xdr_data_t XDR_encode_uint16(const uint16_t &n_Val)
Definition tiny_xdr.cxx:51
static short XDR_convert_int_to_short(int v1)
Definition tiny_xdr.cxx:80
int8_t XDR_decode_int8(const xdr_data_t &n_Val)
Definition tiny_xdr.cxx:32
int32_t XDR_decode_int32(const xdr_data_t &n_Val)
Definition tiny_xdr.cxx:115
uint64_t XDR_decode_uint64(const xdr_data2_t &n_Val)
Definition tiny_xdr.cxx:147
xdr_data_t XDR_encode_float(const float &f_Val)
Definition tiny_xdr.cxx:155
float XDR_decode_float(const xdr_data_t &f_Val)
Definition tiny_xdr.cxx:167
void XDR_decode_shortints32(const xdr_data_t &n_Val, int &v1, int &v2)
Definition tiny_xdr.cxx:99
xdr_data_t XDR_encode_uint32(const uint32_t &n_Val)
Definition tiny_xdr.cxx:109
xdr_data_t XDR_encode_int16(const int16_t &n_Val)
Definition tiny_xdr.cxx:45
uint32_t xdr_data_t
Definition tiny_xdr.hxx:30
#define SWAP32(arg)
Definition tiny_xdr.hxx:25
#define SWAP64(arg)
Definition tiny_xdr.hxx:26
uint64_t xdr_data2_t
Definition tiny_xdr.hxx:31