Mercurial > hg > octave-lyh
diff src/pt-arg-list.cc @ 7751:7c020c067a60
F__end__: correctly handle fewer indices than dimensions
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 03 May 2008 22:48:24 -0400 |
parents | 745a8299c2b5 |
children | 71f068b22fcc |
line wrap: on
line diff
--- a/src/pt-arg-list.cc +++ b/src/pt-arg-list.cc @@ -94,6 +94,7 @@ static const octave_value *indexed_object = 0; static int index_position = 0; +static int num_indices = 0; DEFCONSTFUN (__end__, , , "internal function") @@ -103,34 +104,30 @@ if (indexed_object) { dim_vector dv = indexed_object->dims (); + int ndims = dv.length (); - switch (index_position) + if (num_indices < ndims) { - case -1: - { - octave_idx_type numel = dv.numel (); + for (int i = num_indices; i < ndims; i++) + dv(num_indices-1) *= dv(i); - if (numel < 0) - { - std::string dv_str = dv.str (); - ::error ("invalid use of end: (index 1, dims %s)", - dv_str.c_str ()); - } - else - retval = numel; - } - break; + if (num_indices == 1) + { + ndims = 2; + dv.resize (ndims); + dv(1) = 1; + } + else + { + ndims = num_indices; + dv.resize (ndims); + } + } - default: - { - - if (index_position < dv.length ()) - retval = dv(index_position); - else - retval = 1; - } - break; - } + if (index_position < ndims) + retval = dv(index_position); + else + retval = 1; } else ::error ("invalid use of end"); @@ -171,8 +168,10 @@ if (stash_object) { unwind_protect_int (index_position); + unwind_protect_int (num_indices); - index_position = (len == 1) ? -1 : k; + index_position = k; + num_indices = len; } tree_expression *elt = *p++;