# HG changeset patch # User Jaroslav Hajek # Date 1259044547 -3600 # Node ID 43a7adf62534bad7f3f84fdf671871f17230e747 # Parent 870a69bac55cbaece2c57c285b63796b346cef45 save dims for empty structs (binary fmt) diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2009-11-24 Jaroslav Hajek + + * ov-struct.cc (octave_struct::save_binary): Save dimensions for + structs. + (octave_struct::load_binary): Load dimensions if present, + use 1x1 otherwise. + 2009-11-23 Jaroslav Hajek * data.cc (Fmerge): Add missing parentheses. diff --git a/src/ov-struct.cc b/src/ov-struct.cc --- a/src/ov-struct.cc +++ b/src/ov-struct.cc @@ -1365,6 +1365,19 @@ octave_idx_type nf = m.nfields (); + dim_vector d = dims (); + if (d.length () < 1) + return false; + + // Use negative value for ndims + int32_t di = - d.length(); + os.write (reinterpret_cast (&di), 4); + for (int i = 0; i < d.length (); i++) + { + di = d(i); + os.write (reinterpret_cast (&di), 4); + } + int32_t len = nf; os.write (reinterpret_cast (&len), 4); @@ -1398,9 +1411,34 @@ if (swap) swap_bytes<4> (&len); + dim_vector dv (1, 1); + + if (len < 0) + { + // We have explicit dimensions. + int mdims = -len; + + int32_t di; + dv.resize (mdims); + + for (int i = 0; i < mdims; i++) + { + if (! is.read (reinterpret_cast (&di), 4)) + return false; + if (swap) + swap_bytes<4> (&di); + dv(i) = di; + } + + if (! is.read (reinterpret_cast (&len), 4)) + return false; + if (swap) + swap_bytes<4> (&len); + } + if (len > 0) { - Octave_map m (map); + Octave_map m (dv); for (octave_idx_type j = 0; j < len; j++) { @@ -1434,10 +1472,10 @@ success = false; } } - else if (len == 0 ) - map = Octave_map (dim_vector (1, 1)); + else if (len == 0) + map = Octave_map (dv); else - panic_impossible (); + success = false; return success; }