*** src/DLD-FUNCTIONS/sort.cc.orig 2004-04-28 10:52:08.000000000 +0200 --- src/DLD-FUNCTIONS/sort.cc 2004-09-14 09:54:31.000000000 +0200 *************** *** 492,497 **** --- 492,632 ---- return retval; } + struct char_vec_index + { + char vec; + int indx; + }; + + bool + char_compare (char_vec_index *a, char_vec_index *b) + { + return (a->vec < b->vec); + } + + template class octave_sort; + template class octave_sort; + + static octave_value_list + mx_sort (charNDArray &m, bool return_idx, int dim) + { + octave_value_list retval; + + if (m.length () < 1) + return retval; + + dim_vector dv = m.dims (); + unsigned int ns = dv (dim); + unsigned int iter = dv.numel () / ns; + unsigned int stride = 1; + for (unsigned int i = 0; i < (unsigned int)dim; i++) + stride *= dv(i); + + if (return_idx) + { + char *v = m.fortran_vec (); + octave_sort indexed_char_sort (char_compare); + + OCTAVE_LOCAL_BUFFER (char_vec_index *, vi, ns); + OCTAVE_LOCAL_BUFFER (char_vec_index, vix, ns); + + for (unsigned int i = 0; i < ns; i++) + vi[i] = &vix[i]; + + NDArray idx (dv); + + if (stride == 1) + { + for (unsigned int j = 0; j < iter; j++) + { + unsigned int offset = j * ns; + + for (unsigned int i = 0; i < ns; i++) + { + vi[i]->vec = v[i]; + vi[i]->indx = i + 1; + } + + indexed_char_sort.sort (vi, ns); + + for (unsigned int i = 0; i < ns; i++) + { + v[i] = vi[i]->vec; + idx(i + offset) = vi[i]->indx; + } + v += ns; + } + } + else + { + for (unsigned int j = 0; j < iter; j++) + { + unsigned int offset = j; + unsigned int offset2 = 0; + while (offset >= stride) + { + offset -= stride; + offset2++; + } + offset += offset2 * stride * ns; + + for (unsigned int i = 0; i < ns; i++) + { + vi[i]->vec = v[i*stride + offset]; + vi[i]->indx = i + 1; + } + + indexed_char_sort.sort (vi, ns); + + for (unsigned int i = 0; i < ns; i++) + { + v[i*stride+offset] = vi[i]->vec; + idx(i*stride+offset) = vi[i]->indx; + } + } + } + retval (1) = idx; + } + else + { + char *v = m.fortran_vec (); + octave_sort char_sort; + + if (stride == 1) + for (unsigned int j = 0; j < iter; j++) + { + char_sort.sort (v, ns); + v += ns; + } + else + { + OCTAVE_LOCAL_BUFFER (char, vi, ns); + for (unsigned int j = 0; j < iter; j++) + { + unsigned int offset = j; + unsigned int offset2 = 0; + while (offset >= stride) + { + offset -= stride; + offset2++; + } + offset += offset2 * stride * ns; + + for (unsigned int i = 0; i < ns; i++) + vi[i] = v[i*stride + offset]; + + char_sort.sort (vi, ns); + + for (unsigned int i = 0; i < ns; i++) + v[i*stride + offset] = vi[i]; + } + } + } + + retval(0) = octave_value (m, true); + return retval; + } + DEFUN_DLD (sort, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} address@hidden, @var{i}] =} sort (@var{x})\n\ *************** *** 594,599 **** --- 729,741 ---- if (! error_state) retval = mx_sort (cm, return_idx, dim); } + else if (arg.is_string ()) + { + charNDArray chm = arg.char_array_value (); + + if (! error_state) + retval = mx_sort (chm, return_idx, dim); + } else gripe_wrong_type_arg ("sort", arg);