comparison libinterp/corefcn/load-save.h @ 31608:23664317f0d3

maint: merge stable to default
author Rik <rik@octave.org>
date Thu, 01 Dec 2022 20:05:44 -0800
parents dfa5d9c3ae72 aac27ad79be6
children 5f11de0e7440
comparison
equal deleted inserted replaced
31606:dfa5d9c3ae72 31608:23664317f0d3
35 35
36 #include "ovl.h" 36 #include "ovl.h"
37 37
38 OCTAVE_BEGIN_NAMESPACE(octave) 38 OCTAVE_BEGIN_NAMESPACE(octave)
39 39
40 class interpreter; 40 class interpreter;
41 class load_save_format; 41 class load_save_format;
42 class symbol_info; 42 class symbol_info;
43 43
44 class load_save_system 44 class load_save_system
45 { 45 {
46 public: 46 public:
47 47
48 // FIXME: maybe MAT5 and MAT7 should be options to MAT_BINARY. 48 // FIXME: maybe MAT5 and MAT7 should be options to MAT_BINARY.
49 // Similarly, save_as_floats may be an option for LS_BINARY, 49 // Similarly, save_as_floats may be an option for LS_BINARY,
50 // LS_HDF5 etc. 50 // LS_HDF5 etc.
51 51
52 enum format_type 52 enum format_type
53 { 53 {
54 TEXT, 54 TEXT,
55 BINARY, 55 BINARY,
56 MAT_ASCII, 56 MAT_ASCII,
57 MAT_BINARY, 57 MAT_BINARY,
58 MAT5_BINARY, 58 MAT5_BINARY,
59 MAT7_BINARY, 59 MAT7_BINARY,
60 HDF5, 60 HDF5,
61 UNKNOWN 61 UNKNOWN
62 }; 62 };
63 63
64 enum format_options 64 enum format_options
65 { 65 {
66 // MAT_ASCII options (not exclusive) 66 // MAT_ASCII options (not exclusive)
67 MAT_ASCII_LONG = 1, 67 MAT_ASCII_LONG = 1,
68 MAT_ASCII_TABS = 2, 68 MAT_ASCII_TABS = 2,
69 // MAT_BINARY options 69 // MAT_BINARY options
70 MAT_BINARY_V5 = 1, 70 MAT_BINARY_V5 = 1,
71 MAT_BINARY_V7, 71 MAT_BINARY_V7,
72 // zero means no option. 72 // zero means no option.
73 NO_OPTION = 0 73 NO_OPTION = 0
74 }; 74 };
75 75
76 OCTINTERP_API load_save_system (interpreter& interp); 76 OCTINTERP_API load_save_system (interpreter& interp);
77 77
78 OCTINTERP_API ~load_save_system (void); 78 OCTINTERP_API ~load_save_system (void);
79 79
80 load_save_system (const load_save_system&) = delete; 80 load_save_system (const load_save_system&) = delete;
81 81
82 load_save_system& operator = (const load_save_system&) = delete; 82 load_save_system& operator = (const load_save_system&) = delete;
83 83
84 OCTINTERP_API octave_value 84 OCTINTERP_API octave_value
85 crash_dumps_octave_core (const octave_value_list& args, int nargout); 85 crash_dumps_octave_core (const octave_value_list& args, int nargout);
86 86
87 bool crash_dumps_octave_core (void) const 87 bool crash_dumps_octave_core (void) const
88 { 88 {
89 return m_crash_dumps_octave_core; 89 return m_crash_dumps_octave_core;
90 } 90 }
91 91
92 bool crash_dumps_octave_core (bool flag) 92 bool crash_dumps_octave_core (bool flag)
93 { 93 {
94 return set (m_crash_dumps_octave_core, flag); 94 return set (m_crash_dumps_octave_core, flag);
95 } 95 }
96 96
97 octave_value octave_core_file_limit (const octave_value_list& args, 97 octave_value octave_core_file_limit (const octave_value_list& args,
98 int nargout); 98 int nargout);
99 99
100 double octave_core_file_limit (void) const 100 double octave_core_file_limit (void) const
101 { 101 {
102 return m_octave_core_file_limit; 102 return m_octave_core_file_limit;
103 } 103 }
104 104
105 double octave_core_file_limit (double limit) 105 double octave_core_file_limit (double limit)
106 { 106 {
107 return set (m_octave_core_file_limit, limit); 107 return set (m_octave_core_file_limit, limit);
108 } 108 }
109 109
110 OCTINTERP_API octave_value 110 OCTINTERP_API octave_value
111 octave_core_file_name (const octave_value_list& args, int nargout); 111 octave_core_file_name (const octave_value_list& args, int nargout);
112 112
113 std::string octave_core_file_name (void) const 113 std::string octave_core_file_name (void) const
114 { 114 {
115 return m_octave_core_file_name; 115 return m_octave_core_file_name;
116 } 116 }
117 117
118 std::string octave_core_file_name (const std::string& file) 118 std::string octave_core_file_name (const std::string& file)
119 { 119 {
120 return set (m_octave_core_file_name, file); 120 return set (m_octave_core_file_name, file);
121 } 121 }
122 122
123 OCTINTERP_API octave_value 123 OCTINTERP_API octave_value
124 save_default_options (const octave_value_list& args, int nargout); 124 save_default_options (const octave_value_list& args, int nargout);
125 125
126 std::string save_default_options (void) const 126 std::string save_default_options (void) const
127 { 127 {
128 return m_save_default_options; 128 return m_save_default_options;
129 } 129 }
130 130
131 std::string save_default_options (const std::string& options) 131 std::string save_default_options (const std::string& options)
132 { 132 {
133 return set (m_save_default_options, options); 133 return set (m_save_default_options, options);
134 } 134 }
135 135
136 OCTINTERP_API octave_value 136 OCTINTERP_API octave_value
137 octave_core_file_options (const octave_value_list& args, int nargout); 137 octave_core_file_options (const octave_value_list& args, int nargout);
138 138
139 std::string octave_core_file_options (void) const 139 std::string octave_core_file_options (void) const
140 { 140 {
141 return m_octave_core_file_options; 141 return m_octave_core_file_options;
142 } 142 }
143 143
144 std::string octave_core_file_options (const std::string& options) 144 std::string octave_core_file_options (const std::string& options)
145 { 145 {
146 return set (m_octave_core_file_options, options); 146 return set (m_octave_core_file_options, options);
147 } 147 }
148 148
149 OCTINTERP_API octave_value 149 OCTINTERP_API octave_value
150 save_header_format_string (const octave_value_list& args, int nargout); 150 save_header_format_string (const octave_value_list& args, int nargout);
151 151
152 std::string save_header_format_string (void) const 152 std::string save_header_format_string (void) const
153 { 153 {
154 return m_save_header_format_string; 154 return m_save_header_format_string;
155 } 155 }
156 156
157 std::string save_header_format_string (const std::string& format) 157 std::string save_header_format_string (const std::string& format)
158 { 158 {
159 return set (m_save_header_format_string, format); 159 return set (m_save_header_format_string, format);
160 } 160 }
161 161
162 static OCTINTERP_API load_save_format 162 static OCTINTERP_API load_save_format
163 get_file_format (const std::string& fname, const std::string& orig_fname, 163 get_file_format (const std::string& fname, const std::string& orig_fname,
164 bool& use_zlib, bool quiet = false); 164 bool& use_zlib, bool quiet = false);
165 165
166 // FIXME: this is probably not the best public interface for 166 // FIXME: this is probably not the best public interface for
167 // loading and saving variables, but it is what is currently 167 // loading and saving variables, but it is what is currently
168 // needed for the Fload and Fsave functions. 168 // needed for the Fload and Fsave functions.
169 169
170 OCTINTERP_API octave_value 170 OCTINTERP_API octave_value
171 load_vars (std::istream& stream, const std::string& orig_fname, 171 load_vars (std::istream& stream, const std::string& orig_fname,
172 const load_save_format& fmt, mach_info::float_format flt_fmt, 172 const load_save_format& fmt, mach_info::float_format flt_fmt,
173 bool list_only, bool swap, bool verbose, 173 bool list_only, bool swap, bool verbose,
174 const string_vector& argv, int argv_idx, int argc, int nargout); 174 const string_vector& argv, int argv_idx, int argc, int nargout);
175 175
176 static OCTINTERP_API string_vector 176 static OCTINTERP_API string_vector
177 parse_save_options (const string_vector& argv, load_save_format& fmt, 177 parse_save_options (const string_vector& argv, load_save_format& fmt,
178 bool& append, bool& save_as_floats, bool& use_zlib); 178 bool& append, bool& save_as_floats, bool& use_zlib);
179 179
180 static OCTINTERP_API string_vector 180 static OCTINTERP_API string_vector
181 parse_save_options (const std::string& arg, load_save_format& fmt, 181 parse_save_options (const std::string& arg, load_save_format& fmt,
182 bool& append, bool& save_as_floats, bool& use_zlib); 182 bool& append, bool& save_as_floats, bool& use_zlib);
183 183
184 OCTINTERP_API void 184 OCTINTERP_API void
185 save_vars (const string_vector& argv, int argv_idx, int argc, 185 save_vars (const string_vector& argv, int argv_idx, int argc,
186 std::ostream& os, const load_save_format& fmt, 186 std::ostream& os, const load_save_format& fmt,
187 bool save_as_floats, bool write_header_info); 187 bool save_as_floats, bool write_header_info);
188 188
189 OCTINTERP_API void dump_octave_core (void); 189 OCTINTERP_API void dump_octave_core (void);
190 190
191 OCTINTERP_API octave_value_list 191 OCTINTERP_API octave_value_list
192 load (const octave_value_list& args = octave_value_list (), 192 load (const octave_value_list& args = octave_value_list (),
193 int nargout = 0); 193 int nargout = 0);
194 194
195 OCTINTERP_API octave_value_list 195 OCTINTERP_API octave_value_list
196 save (const octave_value_list& args = octave_value_list (), 196 save (const octave_value_list& args = octave_value_list (),
197 int nargout = 0); 197 int nargout = 0);
198 198
199 private: 199 private:
200 200
201 interpreter& m_interpreter; 201 interpreter& m_interpreter;
202 202
203 // Write octave-workspace file if Octave crashes or is killed by a 203 // Write octave-workspace file if Octave crashes or is killed by a
204 // signal. 204 // signal.
205 bool m_crash_dumps_octave_core; 205 bool m_crash_dumps_octave_core;
206 206
207 // The maximum amount of memory (in kilobytes) that we will 207 // The maximum amount of memory (in kilobytes) that we will
208 // attempt to write to the Octave core file. 208 // attempt to write to the Octave core file.
209 double m_octave_core_file_limit; 209 double m_octave_core_file_limit;
210 210
211 // The name of the Octave core file. 211 // The name of the Octave core file.
212 std::string m_octave_core_file_name; 212 std::string m_octave_core_file_name;
213 213
214 // The default output format. May be one of "binary", "text", 214 // The default output format. May be one of "binary", "text",
215 // "mat-binary", or "hdf5". 215 // "mat-binary", or "hdf5".
216 std::string m_save_default_options; 216 std::string m_save_default_options;
217 217
218 // The output format for Octave core files. 218 // The output format for Octave core files.
219 std::string m_octave_core_file_options; 219 std::string m_octave_core_file_options;
220 220
221 // The format string for the comment line at the top of 221 // The format string for the comment line at the top of
222 // text-format save files. Passed to strftime. Should begin with 222 // text-format save files. Passed to strftime. Should begin with
223 // '#' and contain no newline characters. 223 // '#' and contain no newline characters.
224 std::string m_save_header_format_string; 224 std::string m_save_header_format_string;
225 225
226 OCTINTERP_API void 226 OCTINTERP_API void
227 write_header (std::ostream& os, const load_save_format& fmt); 227 write_header (std::ostream& os, const load_save_format& fmt);
228 228
229 OCTINTERP_API std::size_t 229 OCTINTERP_API std::size_t
230 save_vars (std::ostream& os, const std::string& pattern, 230 save_vars (std::ostream& os, const std::string& pattern,
231 const load_save_format& fmt, bool save_as_floats);
232
233 OCTINTERP_API void
234 do_save (std::ostream& os, const octave_value& tc, const std::string& name,
235 const std::string& help, bool global, const load_save_format& fmt,
236 bool save_as_floats);
237
238 OCTINTERP_API void
239 do_save (std::ostream& os, const symbol_info& syminfo,
240 const load_save_format& fmt, bool save_as_floats); 231 const load_save_format& fmt, bool save_as_floats);
241 232
242 OCTINTERP_API std::size_t 233 OCTINTERP_API void
243 save_fields (std::ostream& os, const octave_scalar_map& m, 234 do_save (std::ostream& os, const octave_value& tc, const std::string& name,
244 const std::string& pattern, const load_save_format& fmt, 235 const std::string& help, bool global, const load_save_format& fmt,
245 bool save_as_floats); 236 bool save_as_floats);
246 237
247 OCTINTERP_API void 238 OCTINTERP_API void
248 dump_octave_core (std::ostream& os, const char *fname, 239 do_save (std::ostream& os, const symbol_info& syminfo,
249 const load_save_format& fmt, bool save_as_floats); 240 const load_save_format& fmt, bool save_as_floats);
250 241
251 OCTINTERP_API void 242 OCTINTERP_API std::size_t
252 install_loaded_variable (const std::string& name, const octave_value& val, 243 save_fields (std::ostream& os, const octave_scalar_map& m,
253 bool global, const std::string& /*doc*/); 244 const std::string& pattern, const load_save_format& fmt,
254 245 bool save_as_floats);
255 static OCTINTERP_API std::string init_save_header_format (void); 246
256 247 OCTINTERP_API void
257 static OCTINTERP_API load_save_format 248 dump_octave_core (std::ostream& os, const char *fname,
258 get_file_format (std::istream& file, const std::string& filename); 249 const load_save_format& fmt, bool save_as_floats);
259 250
260 template <typename T> 251 OCTINTERP_API void
261 T set (T& var, const T& new_val) 252 install_loaded_variable (const std::string& name, const octave_value& val,
262 { 253 bool global, const std::string& /*doc*/);
263 T old_val = var; 254
264 var = new_val; 255 static OCTINTERP_API std::string init_save_header_format (void);
265 return old_val; 256
266 } 257 static OCTINTERP_API load_save_format
267 }; 258 get_file_format (std::istream& file, const std::string& filename);
268 259
269 class load_save_format 260 template <typename T>
270 { 261 T set (T& var, const T& new_val)
271 public: 262 {
272 263 T old_val = var;
273 load_save_format (load_save_system::format_type type, 264 var = new_val;
274 load_save_system::format_options options = load_save_system::NO_OPTION) 265 return old_val;
275 : m_type (type), m_options (options) 266 }
276 { } 267 };
277 268
278 void set_type (load_save_system::format_type type) { m_type = type; } 269 class load_save_format
279 270 {
280 load_save_system::format_type type (void) const { return m_type; } 271 public:
281 272
282 void set_option (load_save_system::format_options option) 273 load_save_format (load_save_system::format_type type,
283 { 274 load_save_system::format_options options = load_save_system::NO_OPTION)
284 m_options |= option; 275 : m_type (type), m_options (options)
285 } 276 { }
286 277
287 int options (void) const { return m_options; } 278 void set_type (load_save_system::format_type type) { m_type = type; }
288 279
289 private: 280 load_save_system::format_type type (void) const { return m_type; }
290 281
291 load_save_system::format_type m_type; 282 void set_option (load_save_system::format_options option)
292 int m_options; 283 {
293 }; 284 m_options |= option;
285 }
286
287 int options (void) const { return m_options; }
288
289 private:
290
291 load_save_system::format_type m_type;
292 int m_options;
293 };
294 294
295 OCTAVE_END_NAMESPACE(octave) 295 OCTAVE_END_NAMESPACE(octave)
296 296
297 #endif 297 #endif