comparison liboctave/util/data-conv.cc @ 16074:821922270b66

Fix saving binary matrices with up to 2^31 elements (Bug #38326). * liboctave/util/data-conv.cc(LS_DO_READ, LS_DO_WRITE, read_doubles, read_floats, write_doubles, write_floats): Calculate number of bytes to read/write using std::streamsize variable rather than octave_idx_type.
author Rik <rik@octave.org>
date Wed, 20 Feb 2013 14:58:39 -0800
parents 049e8bbff782
children 0b644adf4f31
comparison
equal deleted inserted replaced
16073:1c8234f0b642 16074:821922270b66
485 do \ 485 do \
486 { \ 486 { \
487 if (len > 0) \ 487 if (len > 0) \
488 { \ 488 { \
489 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \ 489 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \
490 stream.read (reinterpret_cast<char *> (ptr), size * len); \ 490 std::streamsize n_bytes = size * len; \
491 stream.read (reinterpret_cast<char *> (ptr), n_bytes); \
491 if (swap) \ 492 if (swap) \
492 swap_bytes< size > (ptr, len); \ 493 swap_bytes< size > (ptr, len); \
493 for (octave_idx_type i = 0; i < len; i++) \ 494 for (octave_idx_type i = 0; i < len; i++) \
494 data[i] = ptr[i]; \ 495 data[i] = ptr[i]; \
495 } \ 496 } \
507 char tmp_type = type; \ 508 char tmp_type = type; \
508 stream.write (&tmp_type, 1); \ 509 stream.write (&tmp_type, 1); \
509 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \ 510 OCTAVE_LOCAL_BUFFER (TYPE, ptr, len); \
510 for (octave_idx_type i = 0; i < len; i++) \ 511 for (octave_idx_type i = 0; i < len; i++) \
511 ptr[i] = static_cast <TYPE> (data[i]); \ 512 ptr[i] = static_cast <TYPE> (data[i]); \
512 stream.write (reinterpret_cast<char *> (ptr), size * len); \ 513 std::streamsize n_bytes = size * len; \
514 stream.write (reinterpret_cast<char *> (ptr), n_bytes); \
513 } \ 515 } \
514 } \ 516 } \
515 while (0) 517 while (0)
516 518
517 // Loading variables from files. 519 // Loading variables from files.
1006 __FILE__, __LINE__); 1008 __FILE__, __LINE__);
1007 break; 1009 break;
1008 } 1010 }
1009 } 1011 }
1010 1012
1011
1012 void 1013 void
1013 read_doubles (std::istream& is, double *data, save_type type, 1014 read_doubles (std::istream& is, double *data, save_type type,
1014 octave_idx_type len, bool swap, 1015 octave_idx_type len, bool swap,
1015 oct_mach_info::float_format fmt) 1016 oct_mach_info::float_format fmt)
1016 { 1017 {
1041 break; 1042 break;
1042 1043
1043 case LS_FLOAT: 1044 case LS_FLOAT:
1044 { 1045 {
1045 OCTAVE_LOCAL_BUFFER (float, ptr, len); 1046 OCTAVE_LOCAL_BUFFER (float, ptr, len);
1046 is.read (reinterpret_cast<char *> (ptr), 4 * len); 1047 std::streamsize n_bytes = 4 * len;
1048 is.read (reinterpret_cast<char *> (ptr), n_bytes);
1047 do_float_format_conversion (ptr, len, fmt); 1049 do_float_format_conversion (ptr, len, fmt);
1048 for (octave_idx_type i = 0; i < len; i++) 1050 for (octave_idx_type i = 0; i < len; i++)
1049 data[i] = ptr[i]; 1051 data[i] = ptr[i];
1050 } 1052 }
1051 break; 1053 break;
1052 1054
1053 case LS_DOUBLE: // No conversion necessary. 1055 case LS_DOUBLE: // No conversion necessary.
1054 { 1056 {
1055 is.read (reinterpret_cast<char *> (data), 8 * len); 1057 std::streamsize n_bytes = 8 * static_cast<std::streamsize> (len);
1058 is.read (reinterpret_cast<char *> (data), n_bytes);
1056 do_double_format_conversion (data, len, fmt); 1059 do_double_format_conversion (data, len, fmt);
1057 1060
1058 for (int i = 0; i < len; i++) 1061 for (int i = 0; i < len; i++)
1059 data[i] = __lo_ieee_replace_old_NA (data[i]); 1062 data[i] = __lo_ieee_replace_old_NA (data[i]);
1060 } 1063 }
1096 case LS_INT: 1099 case LS_INT:
1097 LS_DO_READ (int32_t, swap, data, 4, len, is); 1100 LS_DO_READ (int32_t, swap, data, 4, len, is);
1098 break; 1101 break;
1099 1102
1100 case LS_FLOAT: // No conversion necessary. 1103 case LS_FLOAT: // No conversion necessary.
1101 is.read (reinterpret_cast<char *> (data), 4 * len); 1104 {
1102 do_float_format_conversion (data, len, fmt); 1105 std::streamsize n_bytes = 4 * len;
1106 is.read (reinterpret_cast<char *> (data), n_bytes);
1107 do_float_format_conversion (data, len, fmt);
1108 }
1103 break; 1109 break;
1104 1110
1105 case LS_DOUBLE: 1111 case LS_DOUBLE:
1106 { 1112 {
1107 OCTAVE_LOCAL_BUFFER (double, ptr, len); 1113 OCTAVE_LOCAL_BUFFER (double, ptr, len);
1108 is.read (reinterpret_cast<char *> (ptr), 8 * len); 1114 std::streamsize n_bytes = 8 * len;
1115 is.read (reinterpret_cast<char *> (ptr), n_bytes);
1109 do_double_format_conversion (ptr, len, fmt); 1116 do_double_format_conversion (ptr, len, fmt);
1110 for (octave_idx_type i = 0; i < len; i++) 1117 for (octave_idx_type i = 0; i < len; i++)
1111 data[i] = ptr[i]; 1118 data[i] = ptr[i];
1112 } 1119 }
1113 break; 1120 break;
1154 1161
1155 case LS_DOUBLE: // No conversion necessary. 1162 case LS_DOUBLE: // No conversion necessary.
1156 { 1163 {
1157 char tmp_type = static_cast<char> (type); 1164 char tmp_type = static_cast<char> (type);
1158 os.write (&tmp_type, 1); 1165 os.write (&tmp_type, 1);
1159 os.write (reinterpret_cast <const char *> (data), 8 * len); 1166 std::streamsize n_bytes = 8 * static_cast<std::streamsize> (len);
1167 os.write (reinterpret_cast <const char *> (data), n_bytes);
1160 } 1168 }
1161 break; 1169 break;
1162 1170
1163 default: 1171 default:
1164 (*current_liboctave_error_handler) 1172 (*current_liboctave_error_handler)
1199 1207
1200 case LS_FLOAT: // No conversion necessary. 1208 case LS_FLOAT: // No conversion necessary.
1201 { 1209 {
1202 char tmp_type = static_cast<char> (type); 1210 char tmp_type = static_cast<char> (type);
1203 os.write (&tmp_type, 1); 1211 os.write (&tmp_type, 1);
1204 os.write (reinterpret_cast <const char *> (data), 4 * len); 1212 std::streamsize n_bytes = 4 * len;
1213 os.write (reinterpret_cast <const char *> (data), n_bytes);
1205 } 1214 }
1206 break; 1215 break;
1207 1216
1208 case LS_DOUBLE: 1217 case LS_DOUBLE:
1209 LS_DO_WRITE (double, data, 8, len, os); 1218 LS_DO_WRITE (double, data, 8, len, os);