@@ -32,183 +32,144 @@ with this program; if not, write to the Free Software Foundation, Inc.,
32
32
#define FIXEDPOINT_FACTOR 1000 .0f
33
33
#define FIXEDPOINT_INVFACTOR (1 .0f /FIXEDPOINT_FACTOR)
34
34
35
+ #define STRING_MAX_LEN 0xFFFF
36
+ #define WIDE_STRING_MAX_LEN 0xFFFF
37
+ // 64 MB ought to be enough for anybody - Billy G.
38
+ #define LONG_STRING_MAX_LEN (64 * 1024 * 1024 )
39
+
40
+
35
41
#if HAVE_ENDIAN_H
36
42
// use machine native byte swapping routines
37
43
// Note: memcpy below is optimized out by modern compilers
38
44
39
- inline void writeU64 (u8* data, u64 i)
40
- {
41
- u64 val = htobe64 (i);
42
- memcpy (data, &val, 8 );
43
- }
44
-
45
- inline void writeU32 (u8* data, u32 i)
45
+ inline u16 readU16 (const u8 *data)
46
46
{
47
- u32 val = htobe32 (i);
48
- memcpy (data, &val, 4 );
47
+ u16 val;
48
+ memcpy (&val, data, 2 );
49
+ return be16toh (val);
49
50
}
50
51
51
- inline void writeU16 (u8* data, u16 i )
52
+ inline u32 readU32 ( const u8 * data)
52
53
{
53
- u16 val = htobe16 (i);
54
- memcpy (data, &val, 2 );
54
+ u32 val;
55
+ memcpy (&val, data, 4 );
56
+ return be32toh (val);
55
57
}
56
58
57
- inline u64 readU64 (const u8* data)
59
+ inline u64 readU64 (const u8 * data)
58
60
{
59
61
u64 val;
60
62
memcpy (&val, data, 8 );
61
63
return be64toh (val);
62
64
}
63
65
64
- inline u32 readU32 ( const u8* data)
66
+ inline void writeU16 (u8 * data, u16 i )
65
67
{
66
- u32 val;
67
- memcpy (&val, data, 4 );
68
- return be32toh (val);
68
+ u16 val = htobe16 (i);
69
+ memcpy (data, &val, 2 );
69
70
}
70
71
71
- inline u16 readU16 ( const u8* data)
72
+ inline void writeU32 (u8 * data, u32 i )
72
73
{
73
- u16 val;
74
- memcpy (&val, data, 2 );
75
- return be16toh (val);
74
+ u32 val = htobe32 (i);
75
+ memcpy (data, &val, 4 );
76
76
}
77
77
78
- #else
79
- // generic byte-swapping implementation
80
-
81
78
inline void writeU64 (u8 *data, u64 i)
82
79
{
83
- data[0 ] = ((i>>56 )&0xff );
84
- data[1 ] = ((i>>48 )&0xff );
85
- data[2 ] = ((i>>40 )&0xff );
86
- data[3 ] = ((i>>32 )&0xff );
87
- data[4 ] = ((i>>24 )&0xff );
88
- data[5 ] = ((i>>16 )&0xff );
89
- data[6 ] = ((i>> 8 )&0xff );
90
- data[7 ] = ((i>> 0 )&0xff );
80
+ u64 val = htobe64 (i);
81
+ memcpy (data, &val, 8 );
91
82
}
92
83
93
- inline void writeU32 (u8 *data, u32 i)
84
+ #else
85
+ // generic byte-swapping implementation
86
+
87
+ inline u16 readU16 (const u8 *data)
94
88
{
95
- data[0 ] = ((i>>24 )&0xff );
96
- data[1 ] = ((i>>16 )&0xff );
97
- data[2 ] = ((i>> 8 )&0xff );
98
- data[3 ] = ((i>> 0 )&0xff );
89
+ return
90
+ ((u16)data[0 ] << 8 ) | ((u16)data[1 ] << 0 );
99
91
}
100
92
101
- inline void writeU16 ( u8 *data, u16 i )
93
+ inline u32 readU32 ( const u8 *data)
102
94
{
103
- data[0 ] = ((i>> 8 )&0xff );
104
- data[1 ] = ((i>> 0 )&0xff );
95
+ return
96
+ ((u32)data[0 ] << 24 ) | ((u32)data[1 ] << 16 ) |
97
+ ((u32)data[2 ] << 8 ) | ((u32)data[3 ] << 0 );
105
98
}
106
99
107
100
inline u64 readU64 (const u8 *data)
108
101
{
109
- return ((u64)data[0 ]<<56 ) | ((u64)data[1 ]<<48 )
110
- | ((u64)data[2 ]<<40 ) | ((u64)data[3 ]<<32 )
111
- | ((u64)data[4 ]<<24 ) | ((u64)data[5 ]<<16 )
112
- | ((u64)data[6 ]<<8 ) | ((u64)data[7 ]<<0 );
102
+ return
103
+ ((u64)data[0 ] << 56 ) | ((u64)data[1 ] << 48 ) |
104
+ ((u64)data[2 ] << 40 ) | ((u64)data[3 ] << 32 ) |
105
+ ((u64)data[4 ] << 24 ) | ((u64)data[5 ] << 16 ) |
106
+ ((u64)data[6 ] << 8 ) | ((u64)data[7 ] << 0 );
113
107
}
114
108
115
- inline u32 readU32 ( const u8 *data)
109
+ inline void writeU16 ( u8 *data, u16 i )
116
110
{
117
- return (data[0 ]<<24 ) | (data[1 ]<<16 ) | (data[2 ]<<8 ) | (data[3 ]<<0 );
111
+ data[0 ] = (i >> 8 ) & 0xFF ;
112
+ data[1 ] = (i >> 0 ) & 0xFF ;
118
113
}
119
114
120
- inline u16 readU16 ( const u8 *data)
115
+ inline void writeU32 ( u8 *data, u32 i )
121
116
{
122
- return (data[0 ]<<8 ) | (data[1 ]<<0 );
117
+ data[0 ] = (i >> 24 ) & 0xFF ;
118
+ data[1 ] = (i >> 16 ) & 0xFF ;
119
+ data[2 ] = (i >> 8 ) & 0xFF ;
120
+ data[3 ] = (i >> 0 ) & 0xFF ;
123
121
}
124
122
125
- #endif
126
-
127
- inline void writeU8 (u8 *data, u8 i)
123
+ inline void writeU64 (u8 *data, u64 i)
128
124
{
129
- data[0 ] = ((i>> 0 )&0xff );
125
+ data[0 ] = (i >> 56 ) & 0xFF ;
126
+ data[1 ] = (i >> 48 ) & 0xFF ;
127
+ data[2 ] = (i >> 40 ) & 0xFF ;
128
+ data[3 ] = (i >> 32 ) & 0xFF ;
129
+ data[4 ] = (i >> 24 ) & 0xFF ;
130
+ data[5 ] = (i >> 16 ) & 0xFF ;
131
+ data[6 ] = (i >> 8 ) & 0xFF ;
132
+ data[7 ] = (i >> 0 ) & 0xFF ;
130
133
}
131
134
132
- inline u8 readU8 (const u8 *data)
133
- {
134
- return (data[0 ]<<0 );
135
- }
135
+ #endif // HAVE_ENDIAN_H
136
136
137
- inline void writeS32 (u8 *data, s32 i){
138
- writeU32 (data, (u32)i);
139
- }
140
- inline s32 readS32 (const u8 *data){
141
- return (s32)readU32 (data);
142
- }
137
+ // ////////////// read routines ////////////////
143
138
144
- inline void writeS16 (u8 *data, s16 i){
145
- writeU16 (data, (u16)i);
146
- }
147
- inline s16 readS16 (const u8 *data){
148
- return (s16)readU16 (data);
139
+ inline u8 readU8 (const u8 *data)
140
+ {
141
+ return ((u8)data[0 ] << 0 );
149
142
}
150
143
151
- inline void writeS8 (u8 *data, s8 i){
152
- writeU8 (data, (u8)i);
153
- }
154
- inline s8 readS8 (const u8 *data){
144
+ inline s8 readS8 (const u8 *data)
145
+ {
155
146
return (s8)readU8 (data);
156
147
}
157
148
158
- inline void writeF1000 (u8 *data, f32 i){
159
- writeS32 (data, i*FIXEDPOINT_FACTOR);
160
- }
161
- inline f32 readF1000 (const u8 *data){
162
- return (f32)readS32 (data)*FIXEDPOINT_INVFACTOR;
163
- }
164
-
165
- inline void writeV3S32 (u8 *data, v3s32 p)
149
+ inline s16 readS16 (const u8 *data)
166
150
{
167
- writeS32 (&data[0 ], p.X );
168
- writeS32 (&data[4 ], p.Y );
169
- writeS32 (&data[8 ], p.Z );
170
- }
171
- inline v3s32 readV3S32 (const u8 *data)
172
- {
173
- v3s32 p;
174
- p.X = readS32 (&data[0 ]);
175
- p.Y = readS32 (&data[4 ]);
176
- p.Z = readS32 (&data[8 ]);
177
- return p;
151
+ return (s16)readU16 (data);
178
152
}
179
153
180
- inline void writeV3F1000 ( u8 *data, v3f p )
154
+ inline s32 readS32 ( const u8 *data)
181
155
{
182
- writeF1000 (&data[0 ], p.X );
183
- writeF1000 (&data[4 ], p.Y );
184
- writeF1000 (&data[8 ], p.Z );
185
- }
186
- inline v3f readV3F1000 (const u8 *data)
187
- {
188
- v3f p;
189
- p.X = (float )readF1000 (&data[0 ]);
190
- p.Y = (float )readF1000 (&data[4 ]);
191
- p.Z = (float )readF1000 (&data[8 ]);
192
- return p;
156
+ return (s32)readU32 (data);
193
157
}
194
158
195
- inline void writeV2F1000 ( u8 *data, v2f p )
159
+ inline s64 readS64 ( const u8 *data)
196
160
{
197
- writeF1000 (&data[0 ], p.X );
198
- writeF1000 (&data[4 ], p.Y );
161
+ return (s64)readU64 (data);
199
162
}
200
- inline v2f readV2F1000 (const u8 *data)
163
+
164
+ inline f32 readF1000 (const u8 *data)
201
165
{
202
- v2f p;
203
- p.X = (float )readF1000 (&data[0 ]);
204
- p.Y = (float )readF1000 (&data[4 ]);
205
- return p;
166
+ return (f32)readS32 (data) * FIXEDPOINT_INVFACTOR;
206
167
}
207
168
208
- inline void writeV2S16 ( u8 *data, v2s16 p )
169
+ inline video::SColor readARGB8 ( const u8 *data)
209
170
{
210
- writeS16 (&data[ 0 ], p. X );
211
- writeS16 (&data[ 2 ], p. Y ) ;
171
+ video::SColor p ( readU32 (data) );
172
+ return p ;
212
173
}
213
174
214
175
inline v2s16 readV2S16 (const u8 *data)
@@ -219,10 +180,13 @@ inline v2s16 readV2S16(const u8 *data)
219
180
return p;
220
181
}
221
182
222
- inline void writeV2S32 ( u8 *data, v2s32 p )
183
+ inline v3s16 readV3S16 ( const u8 *data)
223
184
{
224
- writeS32 (&data[0 ], p.X );
225
- writeS32 (&data[4 ], p.Y );
185
+ v3s16 p;
186
+ p.X = readS16 (&data[0 ]);
187
+ p.Y = readS16 (&data[2 ]);
188
+ p.Z = readS16 (&data[4 ]);
189
+ return p;
226
190
}
227
191
228
192
inline v2s32 readV2S32 (const u8 *data)
@@ -233,201 +197,165 @@ inline v2s32 readV2S32(const u8 *data)
233
197
return p;
234
198
}
235
199
236
- inline void writeV3S16 (u8 *data, v3s16 p)
237
- {
238
- writeS16 (&data[0 ], p.X );
239
- writeS16 (&data[2 ], p.Y );
240
- writeS16 (&data[4 ], p.Z );
241
- }
242
-
243
- inline v3s16 readV3S16 (const u8 *data)
200
+ inline v3s32 readV3S32 (const u8 *data)
244
201
{
245
- v3s16 p;
246
- p.X = readS16 (&data[0 ]);
247
- p.Y = readS16 (&data[2 ]);
248
- p.Z = readS16 (&data[4 ]);
202
+ v3s32 p;
203
+ p.X = readS32 (&data[0 ]);
204
+ p.Y = readS32 (&data[4 ]);
205
+ p.Z = readS32 (&data[8 ]);
249
206
return p;
250
207
}
251
208
252
- inline void writeARGB8 ( u8 *data, video::SColor p )
209
+ inline v2f readV2F1000 ( const u8 *data)
253
210
{
254
- writeU32 (data, p.color );
211
+ v2f p;
212
+ p.X = (float )readF1000 (&data[0 ]);
213
+ p.Y = (float )readF1000 (&data[4 ]);
214
+ return p;
255
215
}
256
216
257
- inline video::SColor readARGB8 (const u8 *data)
217
+ inline v3f readV3F1000 (const u8 *data)
258
218
{
259
- video::SColor p (readU32 (data));
219
+ v3f p;
220
+ p.X = (float )readF1000 (&data[0 ]);
221
+ p.Y = (float )readF1000 (&data[4 ]);
222
+ p.Z = (float )readF1000 (&data[8 ]);
260
223
return p;
261
224
}
262
225
263
- /*
264
- The above stuff directly interfaced to iostream
265
- */
226
+ // ///////////// write routines ////////////////
266
227
267
- inline void writeU8 (std::ostream &os, u8 p)
268
- {
269
- char buf[1 ];
270
- writeU8 ((u8*)buf, p);
271
- os.write (buf, 1 );
272
- }
273
- inline u8 readU8 (std::istream &is)
274
- {
275
- char buf[1 ] = {0 };
276
- is.read (buf, 1 );
277
- return readU8 ((u8*)buf);
278
- }
279
-
280
- inline void writeU16 (std::ostream &os, u16 p)
281
- {
282
- char buf[2 ];
283
- writeU16 ((u8*)buf, p);
284
- os.write (buf, 2 );
285
- }
286
- inline u16 readU16 (std::istream &is)
228
+ inline void writeU8 (u8 *data, u8 i)
287
229
{
288
- char buf[2 ] = {0 };
289
- is.read (buf, 2 );
290
- return readU16 ((u8*)buf);
230
+ data[0 ] = (i >> 0 ) & 0xFF ;
291
231
}
292
232
293
- inline void writeU32 (std::ostream &os, u32 p)
294
- {
295
- char buf[4 ];
296
- writeU32 ((u8*)buf, p);
297
- os.write (buf, 4 );
298
- }
299
- inline u32 readU32 (std::istream &is)
233
+ inline void writeS8 (u8 *data, s8 i)
300
234
{
301
- char buf[4 ] = {0 };
302
- is.read (buf, 4 );
303
- return readU32 ((u8*)buf);
235
+ writeU8 (data, (u8)i);
304
236
}
305
237
306
- inline void writeS32 (std::ostream &os, s32 p)
307
- {
308
- writeU32 (os, (u32) p);
309
- }
310
- inline s32 readS32 (std::istream &is)
238
+ inline void writeS16 (u8 *data, s16 i)
311
239
{
312
- return (s32) readU32 (is );
240
+ writeU16 (data, (u16)i );
313
241
}
314
242
315
- inline void writeS16 (std::ostream &os, s16 p)
316
- {
317
- writeU16 (os, (u16) p);
318
- }
319
- inline s16 readS16 (std::istream &is)
243
+ inline void writeS32 (u8 *data, s32 i)
320
244
{
321
- return (s16) readU16 (is );
245
+ writeU32 (data, (u32)i );
322
246
}
323
247
324
- inline void writeS8 (std::ostream &os, s8 p )
248
+ inline void writeS64 (u8 *data, s64 i )
325
249
{
326
- writeU8 (os, (u8) p);
327
- }
328
- inline s8 readS8 (std::istream &is)
329
- {
330
- return (s8)readU8 (is);
250
+ writeU64 (data, (u64)i);
331
251
}
332
252
333
- inline void writeF1000 (std::ostream &os , f32 p )
253
+ inline void writeF1000 (u8 *data , f32 i )
334
254
{
335
- char buf[4 ];
336
- writeF1000 ((u8*)buf, p);
337
- os.write (buf, 4 );
338
- }
339
- inline f32 readF1000 (std::istream &is)
340
- {
341
- char buf[4 ] = {0 };
342
- is.read (buf, 4 );
343
- return readF1000 ((u8*)buf);
255
+ writeS32 (data, i * FIXEDPOINT_FACTOR);
344
256
}
345
257
346
- inline void writeV3F1000 (std::ostream &os, v3f p)
347
- {
348
- char buf[12 ];
349
- writeV3F1000 ((u8*)buf, p);
350
- os.write (buf, 12 );
351
- }
352
- inline v3f readV3F1000 (std::istream &is)
258
+ inline void writeARGB8 (u8 *data, video::SColor p)
353
259
{
354
- char buf[12 ];
355
- is.read (buf, 12 );
356
- return readV3F1000 ((u8*)buf);
260
+ writeU32 (data, p.color );
357
261
}
358
262
359
- inline void writeV2F1000 (std::ostream &os, v2f p)
360
- {
361
- char buf[8 ];
362
- writeV2F1000 ((u8*)buf, p);
363
- os.write (buf, 8 );
364
- }
365
- inline v2f readV2F1000 (std::istream &is)
263
+ inline void writeV2S16 (u8 *data, v2s16 p)
366
264
{
367
- char buf[8 ] = {0 };
368
- is.read (buf, 8 );
369
- return readV2F1000 ((u8*)buf);
265
+ writeS16 (&data[0 ], p.X );
266
+ writeS16 (&data[2 ], p.Y );
370
267
}
371
268
372
- inline void writeV2S16 (std::ostream &os, v2s16 p)
373
- {
374
- char buf[4 ];
375
- writeV2S16 ((u8*)buf, p);
376
- os.write (buf, 4 );
377
- }
378
- inline v2s16 readV2S16 (std::istream &is)
269
+ inline void writeV3S16 (u8 *data, v3s16 p)
379
270
{
380
- char buf[ 4 ] = { 0 } ;
381
- is. read (buf, 4 );
382
- return readV2S16 ((u8*)buf );
271
+ writeS16 (&data[ 0 ], p. X ) ;
272
+ writeS16 (&data[ 2 ], p. Y );
273
+ writeS16 (&data[ 4 ], p. Z );
383
274
}
384
275
385
- inline void writeV2S32 (std::ostream &os, v2s32 p)
386
- {
387
- char buf[8 ];
388
- writeV2S32 ((u8*)buf, p);
389
- os.write (buf, 8 );
390
- }
391
- inline v2s32 readV2S32 (std::istream &is)
276
+ inline void writeV2S32 (u8 *data, v2s32 p)
392
277
{
393
- char buf[8 ] = {0 };
394
- is.read (buf, 8 );
395
- return readV2S32 ((u8*)buf);
278
+ writeS32 (&data[0 ], p.X );
279
+ writeS32 (&data[4 ], p.Y );
396
280
}
397
281
398
- inline void writeV3S16 (std::ostream &os, v3s16 p)
399
- {
400
- char buf[6 ];
401
- writeV3S16 ((u8*)buf, p);
402
- os.write (buf, 6 );
403
- }
404
- inline v3s16 readV3S16 (std::istream &is)
282
+ inline void writeV3S32 (u8 *data, v3s32 p)
405
283
{
406
- char buf[ 6 ] = { 0 } ;
407
- is. read (buf, 6 );
408
- return readV3S16 ((u8*)buf );
284
+ writeS32 (&data[ 0 ], p. X ) ;
285
+ writeS32 (&data[ 4 ], p. Y );
286
+ writeS32 (&data[ 8 ], p. Z );
409
287
}
410
288
411
- inline void writeARGB8 (std::ostream &os, video::SColor p)
289
+ inline void writeV2F1000 (u8 *data, v2f p)
412
290
{
413
- char buf[4 ];
414
- writeARGB8 ((u8*)buf, p);
415
- os.write (buf, 4 );
291
+ writeF1000 (&data[0 ], p.X );
292
+ writeF1000 (&data[4 ], p.Y );
416
293
}
417
294
418
- inline video::SColor readARGB8 (std::istream &is )
295
+ inline void writeV3F1000 (u8 *data, v3f p )
419
296
{
420
- char buf[ 4 ] = { 0 } ;
421
- is. read (buf, 4 );
422
- return readARGB8 ((u8*)buf );
297
+ writeF1000 (&data[ 0 ], p. X ) ;
298
+ writeF1000 (&data[ 4 ], p. Y );
299
+ writeF1000 (&data[ 8 ], p. Z );
423
300
}
424
301
425
- /*
426
- More serialization stuff
427
- */
428
-
429
- // 64 MB ought to be enough for anybody - Billy G.
430
- #define LONG_STRING_MAX (64 * 1024 * 1024 )
302
+ // //
303
+ // // Iostream wrapper for data read/write
304
+ // //
305
+
306
+ #define MAKE_STREAM_READ_FXN (T, N, S ) \
307
+ inline T read ## N(std::istream &is) \
308
+ { \
309
+ char buf[S] = {0 }; \
310
+ is.read (buf, sizeof (buf)); \
311
+ return read ## N ((u8 *)buf); \
312
+ }
313
+
314
+ #define MAKE_STREAM_WRITE_FXN (T, N, S ) \
315
+ inline void write ## N(std::ostream &os, T val) \
316
+ { \
317
+ char buf[S]; \
318
+ write ## N ((u8 *)buf, val); \
319
+ os.write (buf, sizeof (buf)); \
320
+ }
321
+
322
+ MAKE_STREAM_READ_FXN (u8, U8, 1 );
323
+ MAKE_STREAM_READ_FXN (u16, U16, 2 );
324
+ MAKE_STREAM_READ_FXN (u32, U32, 4 );
325
+ MAKE_STREAM_READ_FXN (u64, U64, 8 );
326
+ MAKE_STREAM_READ_FXN (s8, S8, 1 );
327
+ MAKE_STREAM_READ_FXN (s16, S16, 2 );
328
+ MAKE_STREAM_READ_FXN (s32, S32, 4 );
329
+ MAKE_STREAM_READ_FXN (s64, S64, 8 );
330
+ MAKE_STREAM_READ_FXN (f32, F1000, 4 );
331
+ MAKE_STREAM_READ_FXN (v2s16, V2S16, 4 );
332
+ MAKE_STREAM_READ_FXN (v3s16, V3S16, 6 );
333
+ MAKE_STREAM_READ_FXN (v2s32, V2S32, 8 );
334
+ MAKE_STREAM_READ_FXN (v3s32, V3S32, 12 );
335
+ MAKE_STREAM_READ_FXN (v2f, V2F1000, 8 );
336
+ MAKE_STREAM_READ_FXN (v3f, V3F1000, 12 );
337
+ MAKE_STREAM_READ_FXN (video::SColor, ARGB8, 4 );
338
+
339
+ MAKE_STREAM_WRITE_FXN (u8, U8, 1 );
340
+ MAKE_STREAM_WRITE_FXN (u16, U16, 2 );
341
+ MAKE_STREAM_WRITE_FXN (u32, U32, 4 );
342
+ MAKE_STREAM_WRITE_FXN (u64, U64, 8 );
343
+ MAKE_STREAM_WRITE_FXN (s8, S8, 1 );
344
+ MAKE_STREAM_WRITE_FXN (s16, S16, 2 );
345
+ MAKE_STREAM_WRITE_FXN (s32, S32, 4 );
346
+ MAKE_STREAM_WRITE_FXN (s64, S64, 8 );
347
+ MAKE_STREAM_WRITE_FXN (f32, F1000, 4 );
348
+ MAKE_STREAM_WRITE_FXN (v2s16, V2S16, 4 );
349
+ MAKE_STREAM_WRITE_FXN (v3s16, V3S16, 6 );
350
+ MAKE_STREAM_WRITE_FXN (v2s32, V2S32, 8 );
351
+ MAKE_STREAM_WRITE_FXN (v3s32, V3S32, 12 );
352
+ MAKE_STREAM_WRITE_FXN (v2f, V2F1000, 8 );
353
+ MAKE_STREAM_WRITE_FXN (v3f, V3F1000, 12 );
354
+ MAKE_STREAM_WRITE_FXN (video::SColor, ARGB8, 4 );
355
+
356
+ // //
357
+ // // More serialization stuff
358
+ // //
431
359
432
360
// Creates a string with the length as the first two bytes
433
361
std::string serializeString (const std::string &plain);
@@ -467,4 +395,3 @@ bool deSerializeStringToStruct(std::string valstr,
467
395
std::string format, void *out, size_t olen);
468
396
469
397
#endif
470
-
0 commit comments