Mercurial > hg > octave-nkf
annotate liboctave/data-conv.cc @ 7893:eb9ccb44ea41
make regexp(...,'once') matlab compatible
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Wed, 18 Jun 2008 21:00:06 +0200 |
parents | 82be108cc558 |
children | 139f47cf17ab |
rev | line source |
---|---|
1960 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, |
4 2006, 2007 John W. Eaton | |
1960 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
1960 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
1960 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
2317 | 28 #include <cctype> |
6482 | 29 #include <cstdlib> |
2317 | 30 |
3503 | 31 #include <iostream> |
5760 | 32 #include <vector> |
1960 | 33 |
34 #include "byte-swap.h" | |
35 #include "data-conv.h" | |
36 #include "lo-error.h" | |
37 | |
5892 | 38 template void swap_bytes<2> (volatile void *, int); |
39 template void swap_bytes<4> (volatile void *, int); | |
40 template void swap_bytes<8> (volatile void *, int); | |
41 | |
4944 | 42 #if defined HAVE_LONG_LONG_INT |
43 #define FIND_SIZED_INT_TYPE(VAL, BITS, TQ, Q) \ | |
44 do \ | |
45 { \ | |
46 int sz = BITS / CHAR_BIT; \ | |
47 if (sizeof (TQ char) == sz) \ | |
48 VAL = oct_data_conv::dt_ ## Q ## char; \ | |
49 else if (sizeof (TQ short) == sz) \ | |
50 VAL = oct_data_conv::dt_ ## Q ## short; \ | |
51 else if (sizeof (TQ int) == sz) \ | |
52 VAL = oct_data_conv::dt_ ## Q ## int; \ | |
53 else if (sizeof (TQ long) == sz) \ | |
54 VAL = oct_data_conv::dt_ ## Q ## long; \ | |
55 else if (sizeof (TQ long long) == sz) \ | |
56 VAL = oct_data_conv::dt_ ## Q ## longlong; \ | |
57 else \ | |
58 VAL = oct_data_conv::dt_unknown; \ | |
59 } \ | |
60 while (0) | |
61 #else | |
3359 | 62 #define FIND_SIZED_INT_TYPE(VAL, BITS, TQ, Q) \ |
3358 | 63 do \ |
64 { \ | |
65 int sz = BITS / CHAR_BIT; \ | |
66 if (sizeof (TQ char) == sz) \ | |
67 VAL = oct_data_conv::dt_ ## Q ## char; \ | |
68 else if (sizeof (TQ short) == sz) \ | |
69 VAL = oct_data_conv::dt_ ## Q ## short; \ | |
70 else if (sizeof (TQ int) == sz) \ | |
71 VAL = oct_data_conv::dt_ ## Q ## int; \ | |
72 else if (sizeof (TQ long) == sz) \ | |
73 VAL = oct_data_conv::dt_ ## Q ## long; \ | |
74 else \ | |
75 VAL = oct_data_conv::dt_unknown; \ | |
76 } \ | |
77 while (0) | |
4944 | 78 #endif |
3358 | 79 |
3359 | 80 #define FIND_SIZED_FLOAT_TYPE(VAL, BITS) \ |
3358 | 81 do \ |
82 { \ | |
83 int sz = BITS / CHAR_BIT; \ | |
84 if (sizeof (float) == sz) \ | |
85 VAL = oct_data_conv::dt_float; \ | |
86 else if (sizeof (double) == sz) \ | |
87 VAL = oct_data_conv::dt_double; \ | |
88 else \ | |
89 VAL = oct_data_conv::dt_unknown; \ | |
90 } \ | |
91 while (0) | |
92 | |
93 // I'm not sure it is worth the trouble, but let's use a lookup table | |
94 // for the types that are supposed to be a specific number of bits | |
95 // wide. Given the macros above, this should work as long as CHAR_BIT | |
96 // is a multiple of 8 and there are types with the right sizes. | |
97 // | |
98 // The sized data type lookup table has the following format: | |
99 // | |
100 // bits | |
101 // +----+----+----+----+ | |
102 // | 8 | 16 | 32 | 64 | | |
103 // +----+----+----+----+ | |
104 // signed integer | | | | | | |
105 // +----+----+----+----+ | |
106 // unsigned integer | | | | | | |
107 // +----+----+----+----+ | |
108 // floating point | | | | | | |
109 // +----+----+----+----+ | |
110 // | |
111 // So, the 0,3 element is supposed to contain the oct_data_conv enum | |
112 // value corresponding to the correct native data type for a signed | |
113 // 32-bit integer. | |
114 | |
115 static void | |
116 init_sized_type_lookup_table (oct_data_conv::data_type table[3][4]) | |
117 { | |
118 int bits = 8; | |
119 | |
120 for (int i = 0; i < 4; i++) | |
121 { | |
3359 | 122 FIND_SIZED_INT_TYPE (table[0][i], bits, , ); |
3358 | 123 |
3359 | 124 FIND_SIZED_INT_TYPE (table[1][i], bits, unsigned, u); |
3358 | 125 |
3359 | 126 FIND_SIZED_FLOAT_TYPE (table[2][i], bits); |
3358 | 127 |
128 bits *= 2; | |
129 } | |
130 } | |
131 | |
4944 | 132 static std::string |
133 strip_spaces (const std::string& str) | |
134 { | |
135 int n = str.length (); | |
136 | |
137 int k = 0; | |
138 | |
139 std::string s (n, ' '); | |
140 | |
141 for (int i = 0; i < n; i++) | |
142 if (! isspace (str[i])) | |
143 s[k++] = tolower (str[i]); | |
144 | |
145 s.resize (k); | |
146 | |
147 return s; | |
148 } | |
149 | |
150 #define GET_SIZED_INT_TYPE(T, U) \ | |
151 do \ | |
152 { \ | |
153 switch (sizeof (T)) \ | |
154 { \ | |
155 case 1: \ | |
156 retval = dt_ ## U ## int8; \ | |
157 break; \ | |
158 \ | |
159 case 2: \ | |
160 retval = dt_ ## U ## int16; \ | |
161 break; \ | |
162 \ | |
163 case 4: \ | |
164 retval = dt_ ## U ## int32; \ | |
165 break; \ | |
166 \ | |
167 case 8: \ | |
168 retval = dt_ ## U ## int64; \ | |
169 break; \ | |
170 \ | |
171 default: \ | |
172 retval = dt_unknown; \ | |
173 break; \ | |
174 } \ | |
175 } \ | |
176 while (0) | |
177 | |
2317 | 178 oct_data_conv::data_type |
3504 | 179 oct_data_conv::string_to_data_type (const std::string& str) |
2317 | 180 { |
181 data_type retval = dt_unknown; | |
182 | |
3358 | 183 static bool initialized = false; |
184 | |
185 static data_type sized_type_table[3][4]; | |
2317 | 186 |
3358 | 187 if (! initialized) |
188 { | |
189 init_sized_type_lookup_table (sized_type_table); | |
190 | |
191 initialized = true; | |
192 } | |
193 | |
4944 | 194 std::string s = strip_spaces (str); |
2317 | 195 |
4944 | 196 if (s == "int8" || s == "integer*1") |
197 retval = dt_int8; | |
198 else if (s == "uint8") | |
199 retval = dt_uint8; | |
200 else if (s == "int16" || s == "integer*2") | |
201 retval = dt_int16; | |
202 else if (s == "uint16") | |
203 retval = dt_uint16; | |
204 else if (s == "int32" || s == "integer*4") | |
205 retval = dt_int32; | |
206 else if (s == "uint32") | |
207 retval = dt_uint32; | |
208 else if (s == "int64" || s == "integer*8") | |
209 retval = dt_int64; | |
210 else if (s == "uint64") | |
211 retval = dt_uint64; | |
212 else if (s == "single" || s == "float32" || s == "real*4") | |
213 retval = dt_single; | |
214 else if (s == "double" || s == "float64" || s == "real*8") | |
215 retval = dt_double; | |
216 else if (s == "char" || s == "char*1") | |
2317 | 217 retval = dt_char; |
218 else if (s == "schar" || s == "signedchar") | |
219 retval = dt_schar; | |
220 else if (s == "uchar" || s == "unsignedchar") | |
221 retval = dt_uchar; | |
222 else if (s == "short") | |
4944 | 223 GET_SIZED_INT_TYPE (short, ); |
2317 | 224 else if (s == "ushort" || s == "unsignedshort") |
4944 | 225 GET_SIZED_INT_TYPE (unsigned short, u); |
2317 | 226 else if (s == "int") |
4944 | 227 GET_SIZED_INT_TYPE (int, ); |
2317 | 228 else if (s == "uint" || s == "unsignedint") |
4944 | 229 GET_SIZED_INT_TYPE (unsigned int, u); |
2317 | 230 else if (s == "long") |
4944 | 231 GET_SIZED_INT_TYPE (long, ); |
2317 | 232 else if (s == "ulong" || s == "unsignedlong") |
4944 | 233 GET_SIZED_INT_TYPE (unsigned long, u); |
234 else if (s == "longlong") | |
235 GET_SIZED_INT_TYPE (long long, ); | |
236 else if (s == "ulonglong" || s == "unsignedlonglong") | |
237 GET_SIZED_INT_TYPE (unsigned long long, u); | |
3358 | 238 else if (s == "float") |
4944 | 239 { |
240 if (sizeof (float) == sizeof (double)) | |
241 retval = dt_double; | |
242 else | |
243 retval = dt_single; | |
244 } | |
4970 | 245 else if (s == "logical") |
246 retval = dt_logical; | |
2317 | 247 else |
248 (*current_liboctave_error_handler) ("invalid data type specified"); | |
249 | |
3358 | 250 if (retval == dt_unknown) |
251 (*current_liboctave_error_handler) | |
252 ("unable to find matching native data type for %s", s.c_str ()); | |
253 | |
2317 | 254 return retval; |
255 } | |
256 | |
4944 | 257 void |
258 oct_data_conv::string_to_data_type | |
259 (const std::string& str, int& block_size, | |
260 oct_data_conv::data_type& input_type, | |
261 oct_data_conv::data_type& output_type) | |
262 { | |
263 block_size = 1; | |
264 input_type = dt_uchar; | |
265 output_type = dt_double; | |
266 | |
267 bool input_is_output = false; | |
268 | |
269 std::string s = strip_spaces (str); | |
270 | |
271 size_t pos = 0; | |
272 | |
273 if (s[0] == '*') | |
274 input_is_output = true; | |
275 else | |
276 { | |
277 size_t len = s.length (); | |
278 | |
279 while (pos < len && isdigit (s[pos])) | |
280 pos++; | |
281 | |
282 if (pos > 0) | |
283 { | |
284 if (s[pos] == '*') | |
285 { | |
286 block_size = atoi (s.c_str ()); | |
287 s = s.substr (pos+1); | |
288 } | |
289 else | |
290 { | |
291 (*current_liboctave_error_handler) | |
292 ("invalid repeat count in `%s'", str.c_str ()); | |
293 | |
294 return; | |
295 } | |
296 } | |
297 } | |
298 | |
299 pos = s.find ('='); | |
300 | |
301 if (pos != std::string::npos) | |
302 { | |
303 if (s[pos+1] == '>') | |
304 { | |
5870 | 305 std::string s1; |
306 | |
4944 | 307 if (input_is_output) |
308 { | |
309 input_is_output = false; | |
310 | |
5870 | 311 s1 = s.substr (1, pos-1); |
312 | |
4944 | 313 (*current_liboctave_warning_handler) |
314 ("warning: ignoring leading * in fread precision"); | |
315 } | |
5870 | 316 else |
317 s1 = s.substr (0, pos); | |
4944 | 318 |
5870 | 319 input_type = string_to_data_type (s1); |
4944 | 320 output_type = string_to_data_type (s.substr (pos+2)); |
321 } | |
322 else | |
323 (*current_liboctave_error_handler) | |
324 ("fread: invalid precision specified"); | |
325 } | |
326 else | |
327 { | |
5870 | 328 if (input_is_output) |
329 s = s.substr (1); | |
330 | |
4944 | 331 input_type = string_to_data_type (s); |
332 | |
333 if (input_is_output) | |
334 output_type = input_type; | |
335 } | |
336 } | |
337 | |
338 void | |
339 oct_data_conv::string_to_data_type | |
340 (const std::string& str, int& block_size, | |
341 oct_data_conv::data_type& output_type) | |
342 { | |
343 block_size = 1; | |
344 output_type = dt_double; | |
345 | |
346 std::string s = strip_spaces (str); | |
347 | |
348 size_t pos = 0; | |
349 | |
350 size_t len = s.length (); | |
351 | |
352 while (pos < len && isdigit (s[pos])) | |
353 pos++; | |
354 | |
355 if (pos > 0) | |
356 { | |
357 if (s[pos] == '*') | |
358 { | |
359 block_size = atoi (s.c_str ()); | |
360 s = s.substr (pos+1); | |
361 } | |
362 else | |
363 { | |
364 (*current_liboctave_error_handler) | |
365 ("invalid repeat count in `%s'", str.c_str ()); | |
366 | |
367 return; | |
368 } | |
369 } | |
370 | |
371 output_type = string_to_data_type (s); | |
372 } | |
373 | |
374 std::string | |
375 oct_data_conv::data_type_as_string (oct_data_conv::data_type dt) | |
376 { | |
377 std::string retval; | |
378 | |
379 switch (dt) | |
380 { | |
381 case oct_data_conv::dt_int8: | |
382 retval = "int8"; | |
383 break; | |
384 | |
385 case oct_data_conv::dt_uint8: | |
386 retval = "uint8"; | |
387 break; | |
388 | |
389 case oct_data_conv::dt_int16: | |
390 retval = "int16"; | |
391 break; | |
392 | |
393 case oct_data_conv::dt_uint16: | |
394 retval = "uint16"; | |
395 break; | |
396 | |
397 case oct_data_conv::dt_int32: | |
398 retval = "int32"; | |
399 break; | |
400 | |
401 case oct_data_conv::dt_uint32: | |
402 retval = "uint32"; | |
403 break; | |
404 | |
405 case oct_data_conv::dt_int64: | |
406 retval = "int64"; | |
407 break; | |
408 | |
409 case oct_data_conv::dt_uint64: | |
410 retval = "uint64"; | |
411 break; | |
412 | |
413 case oct_data_conv::dt_single: | |
414 retval = "single"; | |
415 break; | |
416 | |
417 case oct_data_conv::dt_double: | |
418 retval = "double"; | |
419 break; | |
420 | |
421 case oct_data_conv::dt_char: | |
422 retval = "char"; | |
423 break; | |
424 | |
425 case oct_data_conv::dt_schar: | |
426 retval = "signed char"; | |
427 break; | |
428 | |
429 case oct_data_conv::dt_uchar: | |
430 retval = "usigned char"; | |
431 break; | |
432 | |
433 case oct_data_conv::dt_short: | |
434 retval = "short"; | |
435 break; | |
436 | |
437 case oct_data_conv::dt_ushort: | |
438 retval = "unsigned short"; | |
439 break; | |
440 | |
441 case oct_data_conv::dt_int: | |
442 retval = "int"; | |
443 break; | |
444 | |
445 case oct_data_conv::dt_uint: | |
446 retval = "usigned int"; | |
447 break; | |
448 | |
449 case oct_data_conv::dt_long: | |
450 retval = "long"; | |
451 break; | |
452 | |
453 case oct_data_conv::dt_ulong: | |
454 retval = "usigned long"; | |
455 break; | |
456 | |
457 case oct_data_conv::dt_longlong: | |
458 retval = "long long"; | |
459 break; | |
460 | |
461 case oct_data_conv::dt_ulonglong: | |
462 retval = "unsigned long long"; | |
463 break; | |
464 | |
465 case oct_data_conv::dt_float: | |
466 retval = "float"; | |
467 break; | |
468 | |
4970 | 469 case oct_data_conv::dt_logical: |
470 retval = "logical"; | |
471 break; | |
472 | |
4944 | 473 case oct_data_conv::dt_unknown: |
474 default: | |
475 retval = "unknown"; | |
476 break; | |
477 } | |
478 | |
479 return retval; | |
480 } | |
1960 | 481 |
3359 | 482 #define LS_DO_READ(TYPE, swap, data, size, len, stream) \ |
1960 | 483 do \ |
484 { \ | |
3867 | 485 if (len > 0) \ |
486 { \ | |
5760 | 487 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \ |
488 stream.read (reinterpret_cast<char *> (ptr), size * len); \ | |
3867 | 489 if (swap) \ |
4944 | 490 swap_bytes< size > (ptr, len); \ |
5760 | 491 for (int i = 0; i < len; i++) \ |
3867 | 492 data[i] = ptr[i]; \ |
493 } \ | |
1960 | 494 } \ |
495 while (0) | |
496 | |
497 // Have to use copy here to avoid writing over data accessed via | |
498 // Matrix::data(). | |
499 | |
3359 | 500 #define LS_DO_WRITE(TYPE, data, size, len, stream) \ |
1960 | 501 do \ |
502 { \ | |
3867 | 503 if (len > 0) \ |
504 { \ | |
5760 | 505 char tmp_type = type; \ |
3867 | 506 stream.write (&tmp_type, 1); \ |
5760 | 507 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \ |
3867 | 508 for (int i = 0; i < len; i++) \ |
5760 | 509 ptr[i] = static_cast <TYPE> (data[i]); \ |
510 stream.write (reinterpret_cast<char *> (ptr), size * len); \ | |
3867 | 511 } \ |
1960 | 512 } \ |
513 while (0) | |
514 | |
515 // Loading variables from files. | |
516 | |
517 static void | |
518 gripe_unrecognized_float_fmt (void) | |
519 { | |
520 (*current_liboctave_error_handler) | |
521 ("unrecognized floating point format requested"); | |
522 } | |
523 | |
524 static void | |
525 gripe_data_conversion (const char *from, const char *to) | |
526 { | |
527 (*current_liboctave_error_handler) | |
528 ("unable to convert from %s to %s format", from, to); | |
529 } | |
530 | |
531 // But first, some data conversion routines. | |
532 | |
533 // Currently, we only handle conversions for the IEEE types. To fix | |
534 // that, make more of the following routines work. | |
535 | |
5775 | 536 // FIXME -- assumes sizeof (Complex) == 8 |
537 // FIXME -- assumes sizeof (double) == 8 | |
538 // FIXME -- assumes sizeof (float) == 4 | |
1960 | 539 |
540 static void | |
4944 | 541 IEEE_big_double_to_IEEE_little_double (void *d, int len) |
1960 | 542 { |
4944 | 543 swap_bytes<8> (d, len); |
1960 | 544 } |
545 | |
546 static void | |
4944 | 547 VAX_D_double_to_IEEE_little_double (void * /* d */, int /* len */) |
1960 | 548 { |
549 gripe_data_conversion ("VAX D float", "IEEE little endian format"); | |
550 } | |
551 | |
552 static void | |
4944 | 553 VAX_G_double_to_IEEE_little_double (void * /* d */, int /* len */) |
1960 | 554 { |
555 gripe_data_conversion ("VAX G float", "IEEE little endian format"); | |
556 } | |
557 | |
558 static void | |
4944 | 559 Cray_to_IEEE_little_double (void * /* d */, int /* len */) |
1960 | 560 { |
561 gripe_data_conversion ("Cray", "IEEE little endian format"); | |
562 } | |
563 | |
564 static void | |
4944 | 565 IEEE_big_float_to_IEEE_little_float (void *d, int len) |
1960 | 566 { |
4944 | 567 swap_bytes<4> (d, len); |
1960 | 568 } |
569 | |
570 static void | |
4944 | 571 VAX_D_float_to_IEEE_little_float (void * /* d */, int /* len */) |
1960 | 572 { |
573 gripe_data_conversion ("VAX D float", "IEEE little endian format"); | |
574 } | |
575 | |
576 static void | |
4944 | 577 VAX_G_float_to_IEEE_little_float (void * /* d */, int /* len */) |
1960 | 578 { |
579 gripe_data_conversion ("VAX G float", "IEEE little endian format"); | |
580 } | |
581 | |
582 static void | |
4944 | 583 Cray_to_IEEE_little_float (void * /* d */, int /* len */) |
1960 | 584 { |
585 gripe_data_conversion ("Cray", "IEEE little endian format"); | |
586 } | |
587 | |
588 static void | |
4944 | 589 IEEE_little_double_to_IEEE_big_double (void *d, int len) |
1960 | 590 { |
4944 | 591 swap_bytes<8> (d, len); |
1960 | 592 } |
593 | |
594 static void | |
4944 | 595 VAX_D_double_to_IEEE_big_double (void * /* d */, int /* len */) |
1960 | 596 { |
597 gripe_data_conversion ("VAX D float", "IEEE big endian format"); | |
598 } | |
599 | |
600 static void | |
4944 | 601 VAX_G_double_to_IEEE_big_double (void * /* d */, int /* len */) |
1960 | 602 { |
603 gripe_data_conversion ("VAX G float", "IEEE big endian format"); | |
604 } | |
605 | |
606 static void | |
4944 | 607 Cray_to_IEEE_big_double (void * /* d */, int /* len */) |
1960 | 608 { |
609 gripe_data_conversion ("Cray", "IEEE big endian format"); | |
610 } | |
611 | |
612 static void | |
4944 | 613 IEEE_little_float_to_IEEE_big_float (void *d, int len) |
1960 | 614 { |
4944 | 615 swap_bytes<4> (d, len); |
1960 | 616 } |
617 | |
618 static void | |
4944 | 619 VAX_D_float_to_IEEE_big_float (void * /* d */, int /* len */) |
1960 | 620 { |
621 gripe_data_conversion ("VAX D float", "IEEE big endian format"); | |
622 } | |
623 | |
624 static void | |
4944 | 625 VAX_G_float_to_IEEE_big_float (void * /* d */, int /* len */) |
1960 | 626 { |
627 gripe_data_conversion ("VAX G float", "IEEE big endian format"); | |
628 } | |
629 | |
630 static void | |
4944 | 631 Cray_to_IEEE_big_float (void * /* d */, int /* len */) |
1960 | 632 { |
633 gripe_data_conversion ("Cray", "IEEE big endian format"); | |
634 } | |
635 | |
636 static void | |
4944 | 637 IEEE_little_double_to_VAX_D_double (void * /* d */, int /* len */) |
1960 | 638 { |
639 gripe_data_conversion ("IEEE little endian", "VAX D"); | |
640 } | |
641 | |
642 static void | |
4944 | 643 IEEE_big_double_to_VAX_D_double (void * /* d */, int /* len */) |
1960 | 644 { |
645 gripe_data_conversion ("IEEE big endian", "VAX D"); | |
646 } | |
647 | |
648 static void | |
4944 | 649 VAX_G_double_to_VAX_D_double (void * /* d */, int /* len */) |
1960 | 650 { |
651 gripe_data_conversion ("VAX G float", "VAX D"); | |
652 } | |
653 | |
654 static void | |
4944 | 655 Cray_to_VAX_D_double (void * /* d */, int /* len */) |
1960 | 656 { |
657 gripe_data_conversion ("Cray", "VAX D"); | |
658 } | |
659 | |
660 static void | |
4944 | 661 IEEE_little_float_to_VAX_D_float (void * /* d */, int /* len */) |
1960 | 662 { |
663 gripe_data_conversion ("IEEE little endian", "VAX D"); | |
664 } | |
665 | |
666 static void | |
4944 | 667 IEEE_big_float_to_VAX_D_float (void * /* d */, int /* len */) |
1960 | 668 { |
669 gripe_data_conversion ("IEEE big endian", "VAX D"); | |
670 } | |
671 | |
672 static void | |
4944 | 673 VAX_G_float_to_VAX_D_float (void * /* d */, int /* len */) |
1960 | 674 { |
675 gripe_data_conversion ("VAX G float", "VAX D"); | |
676 } | |
677 | |
678 static void | |
4944 | 679 Cray_to_VAX_D_float (void * /* d */, int /* len */) |
1960 | 680 { |
681 gripe_data_conversion ("Cray", "VAX D"); | |
682 } | |
683 | |
684 static void | |
4944 | 685 IEEE_little_double_to_VAX_G_double (void * /* d */, int /* len */) |
1960 | 686 { |
687 gripe_data_conversion ("IEEE little endian", "VAX G"); | |
688 } | |
689 | |
690 static void | |
4944 | 691 IEEE_big_double_to_VAX_G_double (void * /* d */, int /* len */) |
1960 | 692 { |
693 gripe_data_conversion ("IEEE big endian", "VAX G"); | |
694 } | |
695 | |
696 static void | |
4944 | 697 VAX_D_double_to_VAX_G_double (void * /* d */, int /* len */) |
1960 | 698 { |
699 gripe_data_conversion ("VAX D float", "VAX G"); | |
700 } | |
701 | |
702 static void | |
4944 | 703 Cray_to_VAX_G_double (void * /* d */, int /* len */) |
1960 | 704 { |
705 gripe_data_conversion ("VAX G float", "VAX G"); | |
706 } | |
707 | |
708 static void | |
4944 | 709 IEEE_little_float_to_VAX_G_float (void * /* d */, int /* len */) |
1960 | 710 { |
711 gripe_data_conversion ("IEEE little endian", "VAX G"); | |
712 } | |
713 | |
714 static void | |
4944 | 715 IEEE_big_float_to_VAX_G_float (void * /* d */, int /* len */) |
1960 | 716 { |
717 gripe_data_conversion ("IEEE big endian", "VAX G"); | |
718 } | |
719 | |
720 static void | |
4944 | 721 VAX_D_float_to_VAX_G_float (void * /* d */, int /* len */) |
1960 | 722 { |
723 gripe_data_conversion ("VAX D float", "VAX G"); | |
724 } | |
725 | |
726 static void | |
4944 | 727 Cray_to_VAX_G_float (void * /* d */, int /* len */) |
1960 | 728 { |
729 gripe_data_conversion ("VAX G float", "VAX G"); | |
730 } | |
731 | |
732 void | |
4944 | 733 do_double_format_conversion (void *data, int len, |
734 oct_mach_info::float_format from_fmt, | |
735 oct_mach_info::float_format to_fmt) | |
1960 | 736 { |
4944 | 737 switch (to_fmt) |
1960 | 738 { |
4574 | 739 case oct_mach_info::flt_fmt_ieee_little_endian: |
4944 | 740 switch (from_fmt) |
1960 | 741 { |
4574 | 742 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 743 break; |
744 | |
4574 | 745 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 746 IEEE_big_double_to_IEEE_little_double (data, len); |
747 break; | |
748 | |
4574 | 749 case oct_mach_info::flt_fmt_vax_d: |
1960 | 750 VAX_D_double_to_IEEE_little_double (data, len); |
751 break; | |
752 | |
4574 | 753 case oct_mach_info::flt_fmt_vax_g: |
1960 | 754 VAX_G_double_to_IEEE_little_double (data, len); |
755 break; | |
756 | |
4574 | 757 case oct_mach_info::flt_fmt_cray: |
1960 | 758 Cray_to_IEEE_little_double (data, len); |
759 break; | |
760 | |
761 default: | |
762 gripe_unrecognized_float_fmt (); | |
763 break; | |
764 } | |
765 break; | |
766 | |
4574 | 767 case oct_mach_info::flt_fmt_ieee_big_endian: |
4944 | 768 switch (from_fmt) |
1960 | 769 { |
4574 | 770 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 771 IEEE_little_double_to_IEEE_big_double (data, len); |
772 break; | |
773 | |
4574 | 774 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 775 break; |
776 | |
4574 | 777 case oct_mach_info::flt_fmt_vax_d: |
1960 | 778 VAX_D_double_to_IEEE_big_double (data, len); |
779 break; | |
780 | |
4574 | 781 case oct_mach_info::flt_fmt_vax_g: |
1960 | 782 VAX_G_double_to_IEEE_big_double (data, len); |
783 break; | |
784 | |
4574 | 785 case oct_mach_info::flt_fmt_cray: |
1960 | 786 Cray_to_IEEE_big_double (data, len); |
787 break; | |
788 | |
789 default: | |
790 gripe_unrecognized_float_fmt (); | |
791 break; | |
792 } | |
793 break; | |
794 | |
4574 | 795 case oct_mach_info::flt_fmt_vax_d: |
4944 | 796 switch (from_fmt) |
1960 | 797 { |
4574 | 798 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 799 IEEE_little_double_to_VAX_D_double (data, len); |
800 break; | |
801 | |
4574 | 802 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 803 IEEE_big_double_to_VAX_D_double (data, len); |
804 break; | |
805 | |
4574 | 806 case oct_mach_info::flt_fmt_vax_d: |
1960 | 807 break; |
808 | |
4574 | 809 case oct_mach_info::flt_fmt_vax_g: |
1960 | 810 VAX_G_double_to_VAX_D_double (data, len); |
811 break; | |
812 | |
4574 | 813 case oct_mach_info::flt_fmt_cray: |
1960 | 814 Cray_to_VAX_D_double (data, len); |
815 break; | |
816 | |
817 default: | |
818 gripe_unrecognized_float_fmt (); | |
819 break; | |
820 } | |
821 break; | |
822 | |
4574 | 823 case oct_mach_info::flt_fmt_vax_g: |
4944 | 824 switch (from_fmt) |
1960 | 825 { |
4574 | 826 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 827 IEEE_little_double_to_VAX_G_double (data, len); |
828 break; | |
829 | |
4574 | 830 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 831 IEEE_big_double_to_VAX_G_double (data, len); |
832 break; | |
833 | |
4574 | 834 case oct_mach_info::flt_fmt_vax_d: |
1960 | 835 VAX_D_double_to_VAX_G_double (data, len); |
836 break; | |
837 | |
4574 | 838 case oct_mach_info::flt_fmt_vax_g: |
1960 | 839 break; |
840 | |
4574 | 841 case oct_mach_info::flt_fmt_cray: |
1960 | 842 Cray_to_VAX_G_double (data, len); |
843 break; | |
844 | |
845 default: | |
846 gripe_unrecognized_float_fmt (); | |
847 break; | |
848 } | |
849 break; | |
850 | |
851 default: | |
852 (*current_liboctave_error_handler) | |
853 ("impossible state reached in file `%s' at line %d", | |
854 __FILE__, __LINE__); | |
855 break; | |
856 } | |
857 } | |
858 | |
859 void | |
4944 | 860 do_float_format_conversion (void *data, int len, |
861 oct_mach_info::float_format from_fmt, | |
862 oct_mach_info::float_format to_fmt) | |
1960 | 863 { |
4944 | 864 switch (to_fmt) |
1960 | 865 { |
4574 | 866 case oct_mach_info::flt_fmt_ieee_little_endian: |
4944 | 867 switch (from_fmt) |
1960 | 868 { |
4574 | 869 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 870 break; |
871 | |
4574 | 872 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 873 IEEE_big_float_to_IEEE_little_float (data, len); |
874 break; | |
875 | |
4574 | 876 case oct_mach_info::flt_fmt_vax_d: |
1960 | 877 VAX_D_float_to_IEEE_little_float (data, len); |
878 break; | |
879 | |
4574 | 880 case oct_mach_info::flt_fmt_vax_g: |
1960 | 881 VAX_G_float_to_IEEE_little_float (data, len); |
882 break; | |
883 | |
4574 | 884 case oct_mach_info::flt_fmt_cray: |
1960 | 885 Cray_to_IEEE_little_float (data, len); |
886 break; | |
887 | |
888 default: | |
889 gripe_unrecognized_float_fmt (); | |
890 break; | |
891 } | |
892 break; | |
893 | |
4574 | 894 case oct_mach_info::flt_fmt_ieee_big_endian: |
4944 | 895 switch (from_fmt) |
1960 | 896 { |
4574 | 897 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 898 IEEE_little_float_to_IEEE_big_float (data, len); |
899 break; | |
900 | |
4574 | 901 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 902 break; |
903 | |
4574 | 904 case oct_mach_info::flt_fmt_vax_d: |
1960 | 905 VAX_D_float_to_IEEE_big_float (data, len); |
906 break; | |
907 | |
4574 | 908 case oct_mach_info::flt_fmt_vax_g: |
1960 | 909 VAX_G_float_to_IEEE_big_float (data, len); |
910 break; | |
911 | |
4574 | 912 case oct_mach_info::flt_fmt_cray: |
1960 | 913 Cray_to_IEEE_big_float (data, len); |
914 break; | |
915 | |
916 default: | |
917 gripe_unrecognized_float_fmt (); | |
918 break; | |
919 } | |
920 break; | |
921 | |
4574 | 922 case oct_mach_info::flt_fmt_vax_d: |
4944 | 923 switch (from_fmt) |
1960 | 924 { |
4574 | 925 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 926 IEEE_little_float_to_VAX_D_float (data, len); |
927 break; | |
928 | |
4574 | 929 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 930 IEEE_big_float_to_VAX_D_float (data, len); |
931 break; | |
932 | |
4574 | 933 case oct_mach_info::flt_fmt_vax_d: |
1960 | 934 break; |
935 | |
4574 | 936 case oct_mach_info::flt_fmt_vax_g: |
1960 | 937 VAX_G_float_to_VAX_D_float (data, len); |
938 break; | |
939 | |
4574 | 940 case oct_mach_info::flt_fmt_cray: |
1960 | 941 Cray_to_VAX_D_float (data, len); |
942 break; | |
943 | |
944 default: | |
945 gripe_unrecognized_float_fmt (); | |
946 break; | |
947 } | |
948 break; | |
949 | |
4574 | 950 case oct_mach_info::flt_fmt_vax_g: |
4944 | 951 switch (from_fmt) |
1960 | 952 { |
4574 | 953 case oct_mach_info::flt_fmt_ieee_little_endian: |
1960 | 954 IEEE_little_float_to_VAX_G_float (data, len); |
955 break; | |
956 | |
4574 | 957 case oct_mach_info::flt_fmt_ieee_big_endian: |
1960 | 958 IEEE_big_float_to_VAX_G_float (data, len); |
959 break; | |
960 | |
4574 | 961 case oct_mach_info::flt_fmt_vax_d: |
1960 | 962 VAX_D_float_to_VAX_G_float (data, len); |
963 break; | |
964 | |
4574 | 965 case oct_mach_info::flt_fmt_vax_g: |
1960 | 966 break; |
967 | |
4574 | 968 case oct_mach_info::flt_fmt_cray: |
1960 | 969 Cray_to_VAX_G_float (data, len); |
970 break; | |
971 | |
972 default: | |
973 gripe_unrecognized_float_fmt (); | |
974 break; | |
975 } | |
976 break; | |
977 | |
978 default: | |
979 (*current_liboctave_error_handler) | |
980 ("impossible state reached in file `%s' at line %d", | |
981 __FILE__, __LINE__); | |
982 break; | |
983 } | |
984 } | |
985 | |
986 void | |
4944 | 987 do_float_format_conversion (void *data, size_t sz, int len, |
988 oct_mach_info::float_format from_fmt, | |
989 oct_mach_info::float_format to_fmt) | |
990 { | |
991 switch (sz) | |
992 { | |
993 case sizeof (float): | |
994 do_float_format_conversion (data, len, from_fmt, to_fmt); | |
995 break; | |
996 | |
997 case sizeof (double): | |
998 do_double_format_conversion (data, len, from_fmt, to_fmt); | |
999 break; | |
1000 | |
1001 default: | |
1002 (*current_liboctave_error_handler) | |
1003 ("impossible state reached in file `%s' at line %d", | |
1004 __FILE__, __LINE__); | |
1005 break; | |
1006 } | |
1007 } | |
1008 | |
1009 | |
1010 void | |
3504 | 1011 read_doubles (std::istream& is, double *data, save_type type, int len, |
4944 | 1012 bool swap, oct_mach_info::float_format fmt) |
1960 | 1013 { |
1014 switch (type) | |
1015 { | |
1016 case LS_U_CHAR: | |
5828 | 1017 LS_DO_READ (uint8_t, swap, data, 1, len, is); |
1960 | 1018 break; |
1019 | |
1020 case LS_U_SHORT: | |
5828 | 1021 LS_DO_READ (uint16_t, swap, data, 2, len, is); |
1960 | 1022 break; |
1023 | |
1024 case LS_U_INT: | |
5828 | 1025 LS_DO_READ (uint32_t, swap, data, 4, len, is); |
1960 | 1026 break; |
1027 | |
1028 case LS_CHAR: | |
5828 | 1029 LS_DO_READ (int8_t, swap, data, 1, len, is); |
1960 | 1030 break; |
1031 | |
1032 case LS_SHORT: | |
5828 | 1033 LS_DO_READ (int16_t, swap, data, 2, len, is); |
1960 | 1034 break; |
1035 | |
1036 case LS_INT: | |
5828 | 1037 LS_DO_READ (int32_t, swap, data, 4, len, is); |
1960 | 1038 break; |
1039 | |
1040 case LS_FLOAT: | |
1041 { | |
5760 | 1042 OCTAVE_LOCAL_BUFFER (float, ptr, len); |
1043 is.read (reinterpret_cast<char *> (ptr), 4 * len); | |
1044 do_float_format_conversion (ptr, len, fmt); | |
1045 for (int i = 0; i < len; i++) | |
1960 | 1046 data[i] = ptr[i]; |
1047 } | |
1048 break; | |
1049 | |
3359 | 1050 case LS_DOUBLE: // No conversion necessary. |
5760 | 1051 is.read (reinterpret_cast<char *> (data), 8 * len); |
1960 | 1052 do_double_format_conversion (data, len, fmt); |
1053 break; | |
1054 | |
1055 default: | |
3504 | 1056 is.clear (std::ios::failbit|is.rdstate ()); |
1960 | 1057 break; |
1058 } | |
1059 } | |
1060 | |
1061 void | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1062 read_floats (std::istream& is, float *data, save_type type, int len, |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1063 bool swap, oct_mach_info::float_format fmt) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1064 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1065 switch (type) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1066 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1067 case LS_U_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1068 LS_DO_READ (uint8_t, swap, data, 1, len, is); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1069 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1070 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1071 case LS_U_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1072 LS_DO_READ (uint16_t, swap, data, 2, len, is); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1073 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1074 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1075 case LS_U_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1076 LS_DO_READ (uint32_t, swap, data, 4, len, is); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1077 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1078 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1079 case LS_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1080 LS_DO_READ (int8_t, swap, data, 1, len, is); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1081 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1082 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1083 case LS_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1084 LS_DO_READ (int16_t, swap, data, 2, len, is); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1085 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1086 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1087 case LS_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1088 LS_DO_READ (int32_t, swap, data, 4, len, is); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1089 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1090 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1091 case LS_FLOAT: // No conversion necessary. |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1092 is.read (reinterpret_cast<char *> (data), 4 * len); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1093 do_float_format_conversion (data, len, fmt); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1094 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1095 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1096 case LS_DOUBLE: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1097 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1098 OCTAVE_LOCAL_BUFFER (double, ptr, len); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1099 is.read (reinterpret_cast<char *> (ptr), 8 * len); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1100 do_double_format_conversion (ptr, len, fmt); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1101 for (int i = 0; i < len; i++) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1102 data[i] = ptr[i]; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1103 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1104 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1105 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1106 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1107 is.clear (std::ios::failbit|is.rdstate ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1108 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1109 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1110 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1111 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1112 void |
3504 | 1113 write_doubles (std::ostream& os, const double *data, save_type type, int len) |
1960 | 1114 { |
1115 switch (type) | |
1116 { | |
1117 case LS_U_CHAR: | |
5828 | 1118 LS_DO_WRITE (uint8_t, data, 1, len, os); |
1960 | 1119 break; |
1120 | |
1121 case LS_U_SHORT: | |
5828 | 1122 LS_DO_WRITE (uint16_t, data, 2, len, os); |
1960 | 1123 break; |
1124 | |
1125 case LS_U_INT: | |
5828 | 1126 LS_DO_WRITE (uint32_t, data, 4, len, os); |
1960 | 1127 break; |
1128 | |
1129 case LS_CHAR: | |
5828 | 1130 LS_DO_WRITE (int8_t, data, 1, len, os); |
1960 | 1131 break; |
1132 | |
1133 case LS_SHORT: | |
5828 | 1134 LS_DO_WRITE (int16_t, data, 2, len, os); |
1960 | 1135 break; |
1136 | |
1137 case LS_INT: | |
5828 | 1138 LS_DO_WRITE (int32_t, data, 4, len, os); |
1960 | 1139 break; |
1140 | |
1141 case LS_FLOAT: | |
1142 LS_DO_WRITE (float, data, 4, len, os); | |
1143 break; | |
1144 | |
3359 | 1145 case LS_DOUBLE: // No conversion necessary. |
1960 | 1146 { |
5760 | 1147 char tmp_type = static_cast<char> (type); |
1960 | 1148 os.write (&tmp_type, 1); |
5760 | 1149 os.write (reinterpret_cast <const char *> (data), 8 * len); |
1960 | 1150 } |
1151 break; | |
1152 | |
1153 default: | |
1154 (*current_liboctave_error_handler) | |
1155 ("unrecognized data format requested"); | |
1156 break; | |
1157 } | |
1158 } | |
1159 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1160 void |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1161 write_floats (std::ostream& os, const float *data, save_type type, int len) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1162 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1163 switch (type) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1164 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1165 case LS_U_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1166 LS_DO_WRITE (uint8_t, data, 1, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1167 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1168 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1169 case LS_U_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1170 LS_DO_WRITE (uint16_t, data, 2, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1171 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1172 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1173 case LS_U_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1174 LS_DO_WRITE (uint32_t, data, 4, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1175 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1176 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1177 case LS_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1178 LS_DO_WRITE (int8_t, data, 1, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1179 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1180 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1181 case LS_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1182 LS_DO_WRITE (int16_t, data, 2, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1183 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1184 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1185 case LS_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1186 LS_DO_WRITE (int32_t, data, 4, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1187 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1188 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1189 case LS_FLOAT: // No conversion necessary. |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1190 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1191 char tmp_type = static_cast<char> (type); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1192 os.write (&tmp_type, 1); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1193 os.write (reinterpret_cast <const char *> (data), 4 * len); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1194 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1195 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1196 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1197 case LS_DOUBLE: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1198 LS_DO_WRITE (double, data, 8, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1199 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1200 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1201 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1202 (*current_liboctave_error_handler) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1203 ("unrecognized data format requested"); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1204 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1205 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1206 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1207 |
1960 | 1208 /* |
1209 ;;; Local Variables: *** | |
1210 ;;; mode: C++ *** | |
1211 ;;; End: *** | |
1212 */ |