Mercurial > hg > octave-lyh
annotate liboctave/util/data-conv.cc @ 17535:c12c688a35ed default tip lyh
Fix warnings
author | LYH <lyh.kernel@gmail.com> |
---|---|
date | Fri, 27 Sep 2013 17:43:27 +0800 |
parents | 6690dba6078a |
children |
rev | line source |
---|---|
1960 | 1 /* |
2 | |
14138
72c96de7a403
maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
3 Copyright (C) 1996-2012 John W. Eaton |
1960 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
1960 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
1960 | 20 |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 | |
2317 | 27 #include <cctype> |
6482 | 28 #include <cstdlib> |
2317 | 29 |
3503 | 30 #include <iostream> |
17404 | 31 #include <limits> |
5760 | 32 #include <vector> |
1960 | 33 |
34 #include "byte-swap.h" | |
35 #include "data-conv.h" | |
36 #include "lo-error.h" | |
7991
139f47cf17ab
Change NA value to support single to double precision conversion
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
37 #include "lo-ieee.h" |
8377
25bc2d31e1bf
improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
7991
diff
changeset
|
38 #include "oct-locbuf.h" |
1960 | 39 |
4944 | 40 #if defined HAVE_LONG_LONG_INT |
41 #define FIND_SIZED_INT_TYPE(VAL, BITS, TQ, Q) \ | |
42 do \ | |
43 { \ | |
17404 | 44 int sz = BITS / std::numeric_limits<unsigned char>::digits; \ |
4944 | 45 if (sizeof (TQ char) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
46 VAL = oct_data_conv::dt_ ## Q ## char; \ |
4944 | 47 else if (sizeof (TQ short) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
48 VAL = oct_data_conv::dt_ ## Q ## short; \ |
4944 | 49 else if (sizeof (TQ int) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
50 VAL = oct_data_conv::dt_ ## Q ## int; \ |
4944 | 51 else if (sizeof (TQ long) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
52 VAL = oct_data_conv::dt_ ## Q ## long; \ |
4944 | 53 else if (sizeof (TQ long long) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
54 VAL = oct_data_conv::dt_ ## Q ## longlong; \ |
4944 | 55 else \ |
56 VAL = oct_data_conv::dt_unknown; \ | |
57 } \ | |
58 while (0) | |
59 #else | |
3359 | 60 #define FIND_SIZED_INT_TYPE(VAL, BITS, TQ, Q) \ |
3358 | 61 do \ |
62 { \ | |
17404 | 63 int sz = BITS / std::numeric_limits<unsigned char>::digits; \ |
3358 | 64 if (sizeof (TQ char) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
65 VAL = oct_data_conv::dt_ ## Q ## char; \ |
3358 | 66 else if (sizeof (TQ short) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
67 VAL = oct_data_conv::dt_ ## Q ## short; \ |
3358 | 68 else if (sizeof (TQ int) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
69 VAL = oct_data_conv::dt_ ## Q ## int; \ |
3358 | 70 else if (sizeof (TQ long) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
71 VAL = oct_data_conv::dt_ ## Q ## long; \ |
3358 | 72 else \ |
73 VAL = oct_data_conv::dt_unknown; \ | |
74 } \ | |
75 while (0) | |
4944 | 76 #endif |
3358 | 77 |
3359 | 78 #define FIND_SIZED_FLOAT_TYPE(VAL, BITS) \ |
3358 | 79 do \ |
80 { \ | |
17404 | 81 int sz = BITS / std::numeric_limits<unsigned char>::digits; \ |
3358 | 82 if (sizeof (float) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
83 VAL = oct_data_conv::dt_float; \ |
3358 | 84 else if (sizeof (double) == sz) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
85 VAL = oct_data_conv::dt_double; \ |
3358 | 86 else \ |
87 VAL = oct_data_conv::dt_unknown; \ | |
88 } \ | |
89 while (0) | |
90 | |
91 // I'm not sure it is worth the trouble, but let's use a lookup table | |
92 // for the types that are supposed to be a specific number of bits | |
17404 | 93 // wide. Given the macros above, this should work as long as |
94 // std::numeric_limits<unsigned char>::digits is a multiple of 8 and | |
95 // there are types with the right sizes. | |
3358 | 96 // |
97 // The sized data type lookup table has the following format: | |
98 // | |
99 // bits | |
100 // +----+----+----+----+ | |
101 // | 8 | 16 | 32 | 64 | | |
102 // +----+----+----+----+ | |
103 // signed integer | | | | | | |
104 // +----+----+----+----+ | |
105 // unsigned integer | | | | | | |
106 // +----+----+----+----+ | |
107 // floating point | | | | | | |
108 // +----+----+----+----+ | |
109 // | |
110 // So, the 0,3 element is supposed to contain the oct_data_conv enum | |
111 // value corresponding to the correct native data type for a signed | |
112 // 32-bit integer. | |
113 | |
114 static void | |
115 init_sized_type_lookup_table (oct_data_conv::data_type table[3][4]) | |
116 { | |
117 int bits = 8; | |
118 | |
119 for (int i = 0; i < 4; i++) | |
120 { | |
3359 | 121 FIND_SIZED_INT_TYPE (table[0][i], bits, , ); |
3358 | 122 |
3359 | 123 FIND_SIZED_INT_TYPE (table[1][i], bits, unsigned, u); |
3358 | 124 |
3359 | 125 FIND_SIZED_FLOAT_TYPE (table[2][i], bits); |
3358 | 126 |
127 bits *= 2; | |
128 } | |
129 } | |
130 | |
4944 | 131 static std::string |
132 strip_spaces (const std::string& str) | |
133 { | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
134 size_t n = str.length (); |
4944 | 135 |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
136 size_t k = 0; |
4944 | 137 |
138 std::string s (n, ' '); | |
139 | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
140 for (size_t i = 0; i < n; i++) |
4944 | 141 if (! isspace (str[i])) |
142 s[k++] = tolower (str[i]); | |
143 | |
144 s.resize (k); | |
145 | |
146 return s; | |
147 } | |
148 | |
149 #define GET_SIZED_INT_TYPE(T, U) \ | |
150 do \ | |
151 { \ | |
152 switch (sizeof (T)) \ | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
153 { \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
154 case 1: \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
155 retval = dt_ ## U ## int8; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
156 break; \ |
4944 | 157 \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
158 case 2: \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
159 retval = dt_ ## U ## int16; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
160 break; \ |
4944 | 161 \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
162 case 4: \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
163 retval = dt_ ## U ## int32; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
164 break; \ |
4944 | 165 \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
166 case 8: \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
167 retval = dt_ ## U ## int64; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
168 break; \ |
4944 | 169 \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
170 default: \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
171 retval = dt_unknown; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
172 break; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
173 } \ |
4944 | 174 } \ |
175 while (0) | |
176 | |
17424
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
177 size_t |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
178 oct_data_conv::data_type_size (data_type dt) |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
179 { |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
180 size_t retval = -1; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
181 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
182 switch (dt) |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
183 { |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
184 case oct_data_conv::dt_int8: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
185 retval = sizeof (int8_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
186 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
187 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
188 case oct_data_conv::dt_uint8: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
189 retval = sizeof (uint8_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
190 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
191 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
192 case oct_data_conv::dt_int16: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
193 retval = sizeof (int16_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
194 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
195 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
196 case oct_data_conv::dt_uint16: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
197 retval = sizeof (uint16_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
198 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
199 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
200 case oct_data_conv::dt_int32: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
201 retval = sizeof (int32_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
202 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
203 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
204 case oct_data_conv::dt_uint32: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
205 retval = sizeof (uint32_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
206 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
207 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
208 case oct_data_conv::dt_int64: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
209 retval = sizeof (int64_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
210 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
211 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
212 case oct_data_conv::dt_uint64: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
213 retval = sizeof (uint64_t); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
214 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
215 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
216 case oct_data_conv::dt_float: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
217 case oct_data_conv::dt_single: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
218 retval = sizeof (float); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
219 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
220 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
221 case oct_data_conv::dt_double: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
222 retval = sizeof (double); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
223 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
224 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
225 case oct_data_conv::dt_char: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
226 retval = sizeof (char); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
227 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
228 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
229 case oct_data_conv::dt_schar: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
230 retval = sizeof (signed char); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
231 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
232 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
233 case oct_data_conv::dt_uchar: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
234 retval = sizeof (unsigned char); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
235 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
236 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
237 case oct_data_conv::dt_short: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
238 retval = sizeof (short); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
239 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
240 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
241 case oct_data_conv::dt_ushort: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
242 retval = sizeof (unsigned short); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
243 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
244 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
245 case oct_data_conv::dt_int: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
246 retval = sizeof (int); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
247 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
248 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
249 case oct_data_conv::dt_uint: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
250 retval = sizeof (unsigned int); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
251 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
252 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
253 case oct_data_conv::dt_long: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
254 retval = sizeof (long); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
255 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
256 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
257 case oct_data_conv::dt_ulong: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
258 retval = sizeof (unsigned long); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
259 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
260 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
261 case oct_data_conv::dt_longlong: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
262 retval = sizeof (long long); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
263 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
264 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
265 case oct_data_conv::dt_ulonglong: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
266 retval = sizeof (unsigned long long); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
267 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
268 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
269 case oct_data_conv::dt_logical: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
270 retval = sizeof (bool); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
271 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
272 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
273 case oct_data_conv::dt_unknown: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
274 default: |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
275 abort (); |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
276 break; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
277 } |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
278 |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
279 return retval; |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
280 } |
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
281 |
2317 | 282 oct_data_conv::data_type |
3504 | 283 oct_data_conv::string_to_data_type (const std::string& str) |
2317 | 284 { |
285 data_type retval = dt_unknown; | |
286 | |
3358 | 287 static bool initialized = false; |
288 | |
289 static data_type sized_type_table[3][4]; | |
2317 | 290 |
3358 | 291 if (! initialized) |
292 { | |
293 init_sized_type_lookup_table (sized_type_table); | |
294 | |
295 initialized = true; | |
296 } | |
297 | |
4944 | 298 std::string s = strip_spaces (str); |
2317 | 299 |
4944 | 300 if (s == "int8" || s == "integer*1") |
301 retval = dt_int8; | |
302 else if (s == "uint8") | |
303 retval = dt_uint8; | |
304 else if (s == "int16" || s == "integer*2") | |
305 retval = dt_int16; | |
306 else if (s == "uint16") | |
307 retval = dt_uint16; | |
308 else if (s == "int32" || s == "integer*4") | |
309 retval = dt_int32; | |
310 else if (s == "uint32") | |
311 retval = dt_uint32; | |
312 else if (s == "int64" || s == "integer*8") | |
313 retval = dt_int64; | |
314 else if (s == "uint64") | |
315 retval = dt_uint64; | |
316 else if (s == "single" || s == "float32" || s == "real*4") | |
317 retval = dt_single; | |
318 else if (s == "double" || s == "float64" || s == "real*8") | |
319 retval = dt_double; | |
320 else if (s == "char" || s == "char*1") | |
2317 | 321 retval = dt_char; |
322 else if (s == "schar" || s == "signedchar") | |
323 retval = dt_schar; | |
324 else if (s == "uchar" || s == "unsignedchar") | |
325 retval = dt_uchar; | |
326 else if (s == "short") | |
4944 | 327 GET_SIZED_INT_TYPE (short, ); |
2317 | 328 else if (s == "ushort" || s == "unsignedshort") |
4944 | 329 GET_SIZED_INT_TYPE (unsigned short, u); |
2317 | 330 else if (s == "int") |
4944 | 331 GET_SIZED_INT_TYPE (int, ); |
2317 | 332 else if (s == "uint" || s == "unsignedint") |
4944 | 333 GET_SIZED_INT_TYPE (unsigned int, u); |
2317 | 334 else if (s == "long") |
4944 | 335 GET_SIZED_INT_TYPE (long, ); |
2317 | 336 else if (s == "ulong" || s == "unsignedlong") |
4944 | 337 GET_SIZED_INT_TYPE (unsigned long, u); |
338 else if (s == "longlong") | |
339 GET_SIZED_INT_TYPE (long long, ); | |
340 else if (s == "ulonglong" || s == "unsignedlonglong") | |
341 GET_SIZED_INT_TYPE (unsigned long long, u); | |
3358 | 342 else if (s == "float") |
4944 | 343 { |
344 if (sizeof (float) == sizeof (double)) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
345 retval = dt_double; |
4944 | 346 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
347 retval = dt_single; |
4944 | 348 } |
4970 | 349 else if (s == "logical") |
350 retval = dt_logical; | |
2317 | 351 else |
352 (*current_liboctave_error_handler) ("invalid data type specified"); | |
353 | |
3358 | 354 if (retval == dt_unknown) |
355 (*current_liboctave_error_handler) | |
356 ("unable to find matching native data type for %s", s.c_str ()); | |
357 | |
2317 | 358 return retval; |
359 } | |
360 | |
4944 | 361 void |
362 oct_data_conv::string_to_data_type | |
363 (const std::string& str, int& block_size, | |
364 oct_data_conv::data_type& input_type, | |
365 oct_data_conv::data_type& output_type) | |
366 { | |
367 block_size = 1; | |
368 input_type = dt_uchar; | |
369 output_type = dt_double; | |
370 | |
371 bool input_is_output = false; | |
372 | |
373 std::string s = strip_spaces (str); | |
374 | |
375 size_t pos = 0; | |
376 | |
377 if (s[0] == '*') | |
378 input_is_output = true; | |
379 else | |
380 { | |
381 size_t len = s.length (); | |
382 | |
383 while (pos < len && isdigit (s[pos])) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
384 pos++; |
4944 | 385 |
386 if (pos > 0) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
387 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
388 if (s[pos] == '*') |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
389 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
390 block_size = atoi (s.c_str ()); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
391 s = s.substr (pos+1); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
392 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
393 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
394 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
395 (*current_liboctave_error_handler) |
15466
d174210ce1ec
use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
396 ("invalid repeat count in '%s'", str.c_str ()); |
4944 | 397 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
398 return; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
399 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
400 } |
4944 | 401 } |
402 | |
403 pos = s.find ('='); | |
404 | |
405 if (pos != std::string::npos) | |
406 { | |
407 if (s[pos+1] == '>') | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
408 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
409 std::string s1; |
5870 | 410 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
411 if (input_is_output) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
412 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
413 input_is_output = false; |
4944 | 414 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
415 s1 = s.substr (1, pos-1); |
5870 | 416 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
417 (*current_liboctave_warning_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
418 ("warning: ignoring leading * in fread precision"); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
419 } |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
420 else |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
421 s1 = s.substr (0, pos); |
4944 | 422 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
423 input_type = string_to_data_type (s1); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
424 output_type = string_to_data_type (s.substr (pos+2)); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
425 } |
4944 | 426 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
427 (*current_liboctave_error_handler) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
428 ("fread: invalid precision specified"); |
4944 | 429 } |
430 else | |
431 { | |
5870 | 432 if (input_is_output) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
433 s = s.substr (1); |
5870 | 434 |
4944 | 435 input_type = string_to_data_type (s); |
436 | |
437 if (input_is_output) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
438 output_type = input_type; |
4944 | 439 } |
440 } | |
441 | |
442 void | |
443 oct_data_conv::string_to_data_type | |
444 (const std::string& str, int& block_size, | |
445 oct_data_conv::data_type& output_type) | |
446 { | |
447 block_size = 1; | |
448 output_type = dt_double; | |
449 | |
450 std::string s = strip_spaces (str); | |
451 | |
452 size_t pos = 0; | |
453 | |
454 size_t len = s.length (); | |
455 | |
456 while (pos < len && isdigit (s[pos])) | |
457 pos++; | |
458 | |
459 if (pos > 0) | |
460 { | |
461 if (s[pos] == '*') | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
462 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
463 block_size = atoi (s.c_str ()); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
464 s = s.substr (pos+1); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
465 } |
4944 | 466 else |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
467 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
468 (*current_liboctave_error_handler) |
15466
d174210ce1ec
use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
469 ("invalid repeat count in '%s'", str.c_str ()); |
4944 | 470 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
471 return; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
472 } |
4944 | 473 } |
474 | |
475 output_type = string_to_data_type (s); | |
476 } | |
477 | |
478 std::string | |
479 oct_data_conv::data_type_as_string (oct_data_conv::data_type dt) | |
480 { | |
481 std::string retval; | |
482 | |
483 switch (dt) | |
484 { | |
485 case oct_data_conv::dt_int8: | |
486 retval = "int8"; | |
487 break; | |
488 | |
489 case oct_data_conv::dt_uint8: | |
490 retval = "uint8"; | |
491 break; | |
492 | |
493 case oct_data_conv::dt_int16: | |
494 retval = "int16"; | |
495 break; | |
496 | |
497 case oct_data_conv::dt_uint16: | |
498 retval = "uint16"; | |
499 break; | |
500 | |
501 case oct_data_conv::dt_int32: | |
502 retval = "int32"; | |
503 break; | |
504 | |
505 case oct_data_conv::dt_uint32: | |
506 retval = "uint32"; | |
507 break; | |
508 | |
509 case oct_data_conv::dt_int64: | |
510 retval = "int64"; | |
511 break; | |
512 | |
513 case oct_data_conv::dt_uint64: | |
514 retval = "uint64"; | |
515 break; | |
516 | |
517 case oct_data_conv::dt_single: | |
518 retval = "single"; | |
519 break; | |
520 | |
521 case oct_data_conv::dt_double: | |
522 retval = "double"; | |
523 break; | |
524 | |
525 case oct_data_conv::dt_char: | |
526 retval = "char"; | |
527 break; | |
528 | |
529 case oct_data_conv::dt_schar: | |
530 retval = "signed char"; | |
531 break; | |
532 | |
533 case oct_data_conv::dt_uchar: | |
17424
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
534 retval = "unsigned char"; |
4944 | 535 break; |
536 | |
537 case oct_data_conv::dt_short: | |
538 retval = "short"; | |
539 break; | |
540 | |
541 case oct_data_conv::dt_ushort: | |
542 retval = "unsigned short"; | |
543 break; | |
544 | |
545 case oct_data_conv::dt_int: | |
546 retval = "int"; | |
547 break; | |
548 | |
549 case oct_data_conv::dt_uint: | |
17424
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
550 retval = "unsigned int"; |
4944 | 551 break; |
552 | |
553 case oct_data_conv::dt_long: | |
554 retval = "long"; | |
555 break; | |
556 | |
557 case oct_data_conv::dt_ulong: | |
17424
6690dba6078a
improve efficiency of fwrite
John W. Eaton <jwe@octave.org>
parents:
17423
diff
changeset
|
558 retval = "unsigned long"; |
4944 | 559 break; |
560 | |
561 case oct_data_conv::dt_longlong: | |
562 retval = "long long"; | |
563 break; | |
564 | |
565 case oct_data_conv::dt_ulonglong: | |
566 retval = "unsigned long long"; | |
567 break; | |
568 | |
569 case oct_data_conv::dt_float: | |
570 retval = "float"; | |
571 break; | |
572 | |
4970 | 573 case oct_data_conv::dt_logical: |
574 retval = "logical"; | |
575 break; | |
576 | |
4944 | 577 case oct_data_conv::dt_unknown: |
578 default: | |
579 retval = "unknown"; | |
580 break; | |
581 } | |
582 | |
583 return retval; | |
584 } | |
1960 | 585 |
3359 | 586 #define LS_DO_READ(TYPE, swap, data, size, len, stream) \ |
1960 | 587 do \ |
588 { \ | |
3867 | 589 if (len > 0) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
590 { \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
591 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \ |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
592 std::streamsize n_bytes = size * len; \ |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
593 stream.read (reinterpret_cast<char *> (ptr), n_bytes); \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
594 if (swap) \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
595 swap_bytes< size > (ptr, len); \ |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
596 for (octave_idx_type i = 0; i < len; i++) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
597 data[i] = ptr[i]; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
598 } \ |
1960 | 599 } \ |
600 while (0) | |
601 | |
602 // Have to use copy here to avoid writing over data accessed via | |
15018
3d8ace26c5b4
maint: Use Octave coding conventions for cuddled parentheses in liboctave/.
Rik <rik@octave.org>
parents:
14138
diff
changeset
|
603 // Matrix::data (). |
1960 | 604 |
3359 | 605 #define LS_DO_WRITE(TYPE, data, size, len, stream) \ |
1960 | 606 do \ |
607 { \ | |
3867 | 608 if (len > 0) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
609 { \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
610 char tmp_type = type; \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
611 stream.write (&tmp_type, 1); \ |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
612 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \ |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
613 for (octave_idx_type i = 0; i < len; i++) \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
614 ptr[i] = static_cast <TYPE> (data[i]); \ |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
615 std::streamsize n_bytes = size * len; \ |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
616 stream.write (reinterpret_cast<char *> (ptr), n_bytes); \ |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
617 } \ |
1960 | 618 } \ |
619 while (0) | |
620 | |
621 // Loading variables from files. | |
622 | |
623 static void | |
624 gripe_unrecognized_float_fmt (void) | |
625 { | |
626 (*current_liboctave_error_handler) | |
627 ("unrecognized floating point format requested"); | |
628 } | |
629 | |
630 static void | |
631 gripe_data_conversion (const char *from, const char *to) | |
632 { | |
633 (*current_liboctave_error_handler) | |
634 ("unable to convert from %s to %s format", from, to); | |
635 } | |
636 | |
637 // But first, some data conversion routines. | |
638 | |
639 // Currently, we only handle conversions for the IEEE types. To fix | |
640 // that, make more of the following routines work. | |
641 | |
5775 | 642 // FIXME -- assumes sizeof (Complex) == 8 |
643 // FIXME -- assumes sizeof (double) == 8 | |
644 // FIXME -- assumes sizeof (float) == 4 | |
1960 | 645 |
646 static void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
647 IEEE_big_double_to_IEEE_little_double (void *d, octave_idx_type len) |
1960 | 648 { |
4944 | 649 swap_bytes<8> (d, len); |
1960 | 650 } |
651 | |
652 static void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
653 IEEE_big_float_to_IEEE_little_float (void *d, octave_idx_type len) |
1960 | 654 { |
4944 | 655 swap_bytes<4> (d, len); |
1960 | 656 } |
657 | |
658 static void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
659 IEEE_little_double_to_IEEE_big_double (void *d, octave_idx_type len) |
1960 | 660 { |
4944 | 661 swap_bytes<8> (d, len); |
1960 | 662 } |
663 | |
664 static void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
665 IEEE_little_float_to_IEEE_big_float (void *d, octave_idx_type len) |
1960 | 666 { |
4944 | 667 swap_bytes<4> (d, len); |
1960 | 668 } |
669 | |
670 void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
671 do_double_format_conversion (void *data, octave_idx_type len, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
672 oct_mach_info::float_format from_fmt, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
673 oct_mach_info::float_format to_fmt) |
1960 | 674 { |
4944 | 675 switch (to_fmt) |
1960 | 676 { |
4574 | 677 case oct_mach_info::flt_fmt_ieee_little_endian: |
4944 | 678 switch (from_fmt) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
679 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
680 case oct_mach_info::flt_fmt_ieee_little_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
681 break; |
1960 | 682 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
683 case oct_mach_info::flt_fmt_ieee_big_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
684 IEEE_big_double_to_IEEE_little_double (data, len); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
685 break; |
1960 | 686 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
687 default: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
688 gripe_unrecognized_float_fmt (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
689 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
690 } |
1960 | 691 break; |
692 | |
4574 | 693 case oct_mach_info::flt_fmt_ieee_big_endian: |
4944 | 694 switch (from_fmt) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
695 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
696 case oct_mach_info::flt_fmt_ieee_little_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
697 IEEE_little_double_to_IEEE_big_double (data, len); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
698 break; |
1960 | 699 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
700 case oct_mach_info::flt_fmt_ieee_big_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
701 break; |
1960 | 702 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
703 default: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
704 gripe_unrecognized_float_fmt (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
705 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
706 } |
1960 | 707 break; |
708 | |
709 default: | |
710 (*current_liboctave_error_handler) | |
15466
d174210ce1ec
use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
711 ("impossible state reached in file '%s' at line %d", |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
712 __FILE__, __LINE__); |
1960 | 713 break; |
714 } | |
715 } | |
716 | |
717 void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
718 do_float_format_conversion (void *data, octave_idx_type len, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
719 oct_mach_info::float_format from_fmt, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
720 oct_mach_info::float_format to_fmt) |
1960 | 721 { |
4944 | 722 switch (to_fmt) |
1960 | 723 { |
4574 | 724 case oct_mach_info::flt_fmt_ieee_little_endian: |
4944 | 725 switch (from_fmt) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
726 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
727 case oct_mach_info::flt_fmt_ieee_little_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
728 break; |
1960 | 729 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
730 case oct_mach_info::flt_fmt_ieee_big_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
731 IEEE_big_float_to_IEEE_little_float (data, len); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
732 break; |
1960 | 733 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
734 default: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
735 gripe_unrecognized_float_fmt (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
736 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
737 } |
1960 | 738 break; |
739 | |
4574 | 740 case oct_mach_info::flt_fmt_ieee_big_endian: |
4944 | 741 switch (from_fmt) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
742 { |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
743 case oct_mach_info::flt_fmt_ieee_little_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
744 IEEE_little_float_to_IEEE_big_float (data, len); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
745 break; |
1960 | 746 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
747 case oct_mach_info::flt_fmt_ieee_big_endian: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
748 break; |
1960 | 749 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
750 default: |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
751 gripe_unrecognized_float_fmt (); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
752 break; |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
753 } |
1960 | 754 break; |
755 | |
756 default: | |
757 (*current_liboctave_error_handler) | |
15466
d174210ce1ec
use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
758 ("impossible state reached in file '%s' at line %d", |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
759 __FILE__, __LINE__); |
1960 | 760 break; |
761 } | |
762 } | |
763 | |
764 void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
765 do_float_format_conversion (void *data, size_t sz, octave_idx_type len, |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
766 oct_mach_info::float_format from_fmt, |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
767 oct_mach_info::float_format to_fmt) |
4944 | 768 { |
769 switch (sz) | |
770 { | |
771 case sizeof (float): | |
772 do_float_format_conversion (data, len, from_fmt, to_fmt); | |
773 break; | |
774 | |
775 case sizeof (double): | |
776 do_double_format_conversion (data, len, from_fmt, to_fmt); | |
777 break; | |
778 | |
779 default: | |
780 (*current_liboctave_error_handler) | |
15466
d174210ce1ec
use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
781 ("impossible state reached in file '%s' at line %d", |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
782 __FILE__, __LINE__); |
4944 | 783 break; |
784 } | |
785 } | |
786 | |
787 void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
788 read_doubles (std::istream& is, double *data, save_type type, |
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
789 octave_idx_type len, bool swap, |
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
790 oct_mach_info::float_format fmt) |
1960 | 791 { |
792 switch (type) | |
793 { | |
794 case LS_U_CHAR: | |
5828 | 795 LS_DO_READ (uint8_t, swap, data, 1, len, is); |
1960 | 796 break; |
797 | |
798 case LS_U_SHORT: | |
5828 | 799 LS_DO_READ (uint16_t, swap, data, 2, len, is); |
1960 | 800 break; |
801 | |
802 case LS_U_INT: | |
5828 | 803 LS_DO_READ (uint32_t, swap, data, 4, len, is); |
1960 | 804 break; |
805 | |
806 case LS_CHAR: | |
5828 | 807 LS_DO_READ (int8_t, swap, data, 1, len, is); |
1960 | 808 break; |
809 | |
810 case LS_SHORT: | |
5828 | 811 LS_DO_READ (int16_t, swap, data, 2, len, is); |
1960 | 812 break; |
813 | |
814 case LS_INT: | |
5828 | 815 LS_DO_READ (int32_t, swap, data, 4, len, is); |
1960 | 816 break; |
817 | |
818 case LS_FLOAT: | |
819 { | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
820 OCTAVE_LOCAL_BUFFER (float, ptr, len); |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
821 std::streamsize n_bytes = 4 * len; |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
822 is.read (reinterpret_cast<char *> (ptr), n_bytes); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
823 do_float_format_conversion (ptr, len, fmt); |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
824 for (octave_idx_type i = 0; i < len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
825 data[i] = ptr[i]; |
1960 | 826 } |
827 break; | |
828 | |
3359 | 829 case LS_DOUBLE: // No conversion necessary. |
7991
139f47cf17ab
Change NA value to support single to double precision conversion
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
830 { |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
831 std::streamsize n_bytes = 8 * static_cast<std::streamsize> (len); |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
832 is.read (reinterpret_cast<char *> (data), n_bytes); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
833 do_double_format_conversion (data, len, fmt); |
7991
139f47cf17ab
Change NA value to support single to double precision conversion
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
834 |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
835 for (int i = 0; i < len; i++) |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
836 data[i] = __lo_ieee_replace_old_NA (data[i]); |
7991
139f47cf17ab
Change NA value to support single to double precision conversion
David Bateman <dbateman@free.fr>
parents:
7789
diff
changeset
|
837 } |
1960 | 838 break; |
839 | |
840 default: | |
3504 | 841 is.clear (std::ios::failbit|is.rdstate ()); |
1960 | 842 break; |
843 } | |
844 } | |
845 | |
846 void | |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
847 read_floats (std::istream& is, float *data, save_type type, |
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
848 octave_idx_type len, bool swap, |
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
849 oct_mach_info::float_format fmt) |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
850 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
851 switch (type) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
852 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
853 case LS_U_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
854 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
|
855 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
856 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
857 case LS_U_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
858 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
|
859 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
860 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
861 case LS_U_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
862 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
|
863 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
864 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
865 case LS_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
866 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
|
867 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
868 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
869 case LS_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
870 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
|
871 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
872 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
873 case LS_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
874 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
|
875 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
876 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
877 case LS_FLOAT: // No conversion necessary. |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
878 { |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
879 std::streamsize n_bytes = 4 * len; |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
880 is.read (reinterpret_cast<char *> (data), n_bytes); |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
881 do_float_format_conversion (data, len, fmt); |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
882 } |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
883 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
884 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
885 case LS_DOUBLE: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
886 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
887 OCTAVE_LOCAL_BUFFER (double, ptr, len); |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
888 std::streamsize n_bytes = 8 * len; |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
889 is.read (reinterpret_cast<char *> (ptr), n_bytes); |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
890 do_double_format_conversion (ptr, len, fmt); |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
891 for (octave_idx_type i = 0; i < len; i++) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
892 data[i] = ptr[i]; |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
893 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
894 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
895 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
896 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
897 is.clear (std::ios::failbit|is.rdstate ()); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
898 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
899 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
900 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
901 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
902 void |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
903 write_doubles (std::ostream& os, const double *data, save_type type, |
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
904 octave_idx_type len) |
1960 | 905 { |
906 switch (type) | |
907 { | |
908 case LS_U_CHAR: | |
5828 | 909 LS_DO_WRITE (uint8_t, data, 1, len, os); |
1960 | 910 break; |
911 | |
912 case LS_U_SHORT: | |
5828 | 913 LS_DO_WRITE (uint16_t, data, 2, len, os); |
1960 | 914 break; |
915 | |
916 case LS_U_INT: | |
5828 | 917 LS_DO_WRITE (uint32_t, data, 4, len, os); |
1960 | 918 break; |
919 | |
920 case LS_CHAR: | |
5828 | 921 LS_DO_WRITE (int8_t, data, 1, len, os); |
1960 | 922 break; |
923 | |
924 case LS_SHORT: | |
5828 | 925 LS_DO_WRITE (int16_t, data, 2, len, os); |
1960 | 926 break; |
927 | |
928 case LS_INT: | |
5828 | 929 LS_DO_WRITE (int32_t, data, 4, len, os); |
1960 | 930 break; |
931 | |
932 case LS_FLOAT: | |
933 LS_DO_WRITE (float, data, 4, len, os); | |
934 break; | |
935 | |
3359 | 936 case LS_DOUBLE: // No conversion necessary. |
1960 | 937 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
938 char tmp_type = static_cast<char> (type); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
939 os.write (&tmp_type, 1); |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
940 std::streamsize n_bytes = 8 * static_cast<std::streamsize> (len); |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
941 os.write (reinterpret_cast <const char *> (data), n_bytes); |
1960 | 942 } |
943 break; | |
944 | |
945 default: | |
946 (*current_liboctave_error_handler) | |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
947 ("unrecognized data format requested"); |
1960 | 948 break; |
949 } | |
950 } | |
951 | |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
952 void |
10349
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
953 write_floats (std::ostream& os, const float *data, save_type type, |
d4d13389c957
make load-save to matlab format work when using --enable-64
John W. Eaton <jwe@octave.org>
parents:
10314
diff
changeset
|
954 octave_idx_type len) |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
955 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
956 switch (type) |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
957 { |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
958 case LS_U_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
959 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
|
960 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
961 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
962 case LS_U_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
963 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
|
964 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
965 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
966 case LS_U_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
967 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
|
968 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
969 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
970 case LS_CHAR: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
971 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
|
972 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
973 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
974 case LS_SHORT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
975 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
|
976 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
977 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
978 case LS_INT: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
979 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
|
980 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
981 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
982 case LS_FLOAT: // No conversion necessary. |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
983 { |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
984 char tmp_type = static_cast<char> (type); |
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
985 os.write (&tmp_type, 1); |
16074
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
986 std::streamsize n_bytes = 4 * len; |
821922270b66
Fix saving binary matrices with up to 2^31 elements (Bug #38326).
Rik <rik@octave.org>
parents:
15467
diff
changeset
|
987 os.write (reinterpret_cast <const char *> (data), n_bytes); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
988 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
989 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
990 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
991 case LS_DOUBLE: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
992 LS_DO_WRITE (double, data, 8, len, os); |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
993 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
994 |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
995 default: |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
996 (*current_liboctave_error_handler) |
10314
07ebe522dac2
untabify liboctave C++ sources
John W. Eaton <jwe@octave.org>
parents:
10158
diff
changeset
|
997 ("unrecognized data format requested"); |
7789
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
998 break; |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
999 } |
82be108cc558
First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
1000 } |