# HG changeset patch # User Jaroslav Hajek # Date 1213815606 -7200 # Node ID eb9ccb44ea41b08fc08987b10b76c7bd05c94680 # Parent 7ca2735d74c2c23ff8851e2f2327d23480d5fcba make regexp(...,'once') matlab compatible diff -r 7ca2735d74c2 -r eb9ccb44ea41 src/ChangeLog --- a/src/ChangeLog Mon May 26 14:01:55 2008 +0200 +++ b/src/ChangeLog Wed Jun 18 21:00:06 2008 +0200 @@ -1,5 +1,9 @@ 2008-06-20 Jaroslav Hajek + * DLD-FUNCTIONS/regexp.cc (octregexp_list): Make "once" an output + argument. + (octregexp): Do not use cell arrays when "once" is requested. + * ov.cc (make_vector_dims): New function. (vector_value, complex_vector_value, float_vector_value, float_complex_vector_value): Query N-d array values and simplify, diff -r 7ca2735d74c2 -r eb9ccb44ea41 src/DLD-FUNCTIONS/regexp.cc --- a/src/DLD-FUNCTIONS/regexp.cc Mon May 26 14:01:55 2008 +0200 +++ b/src/DLD-FUNCTIONS/regexp.cc Wed Jun 18 21:00:06 2008 +0200 @@ -83,17 +83,17 @@ static int octregexp_list (const octave_value_list &args, const std::string &nm, bool case_insensitive, std::list &lst, - string_vector &named, int &nopts) + string_vector &named, int &nopts, bool &once) { int sz = 0; #if defined (HAVE_REGEX) || defined (HAVE_PCRE) int nargin = args.length(); - bool once = false; bool lineanchors = false; bool dotexceptnewline = false; bool freespacing = false; nopts = nargin - 2; + once = false; std::string buffer = args(0).string_value (); if (error_state) @@ -451,7 +451,8 @@ std::list lst; string_vector named; int nopts; - int sz = octregexp_list (args, nm, case_insensitive, lst, named, nopts); + bool once; + int sz = octregexp_list (args, nm, case_insensitive, lst, named, nopts, once); if (! error_state) { @@ -482,36 +483,70 @@ retval(5) = Octave_map(); #endif - Cell t (dim_vector(1, sz)); - i = 0; - for (const_iterator p = lst.begin(); p != lst.end(); p++) - t(i++) = p->t; - retval(4) = t; + if (once) + retval(4) = sz ? lst.front ().t : Cell(); + else + { + Cell t (dim_vector(1, sz)); + i = 0; + for (const_iterator p = lst.begin(); p != lst.end(); p++) + t(i++) = p->t; + retval(4) = t; + } - Cell m (dim_vector(1, sz)); - i = 0; - for (const_iterator p = lst.begin(); p != lst.end(); p++) - m(i++) = p->m; - retval(3) = m; - + if (once) + retval(3) = sz ? lst.front ().m : std::string(); + else + { + Cell m (dim_vector(1, sz)); + i = 0; + for (const_iterator p = lst.begin(); p != lst.end(); p++) + m(i++) = p->m; + retval(3) = m; + } - Cell te (dim_vector(1, sz)); - i = 0; - for (const_iterator p = lst.begin(); p != lst.end(); p++) - te(i++) = p->te; - retval(2) = te; + if (once) + retval(2) = sz ? lst.front ().te : Matrix(); + else + { + Cell te (dim_vector(1, sz)); + i = 0; + for (const_iterator p = lst.begin(); p != lst.end(); p++) + te(i++) = p->te; + retval(2) = te; + } - NDArray e (dim_vector(1, sz)); - i = 0; - for (const_iterator p = lst.begin(); p != lst.end(); p++) - e(i++) = p->e; - retval(1) = e; + if (once) + { + if (sz) + retval(1) = lst.front ().e; + else + retval(1) = Matrix(); + } + else + { + NDArray e (dim_vector(1, sz)); + i = 0; + for (const_iterator p = lst.begin(); p != lst.end(); p++) + e(i++) = p->e; + retval(1) = e; + } + if (once) + { + if (sz) + retval(0) = lst.front ().s; + else + retval(0) = Matrix(); + } + else + { NDArray s (dim_vector(1, sz)); i = 0; for (const_iterator p = lst.begin(); p != lst.end(); p++) s(i++) = p->s; retval(0) = s; + } // Alter the order of the output arguments if (nopts > 0) @@ -911,21 +946,17 @@ %! [s, e, te, m, t] = regexp('short test string','\w*r\w*','once'); %! assert (s,1) %! assert (e,5) -%! assert (size(te), [1,1]) -%! assert (isempty(te{1})) -%! assert (m{1},'short') -%! ## Matlab gives [1,0] here but that seems wrong. -%! assert (size(t), [1,1]) +%! assert (isempty(te)) +%! assert (m,'short') +%! assert (isempty(t)) %!test %! [m, te, e, s, t] = regexp('short test string','\w*r\w*','once', 'match', 'tokenExtents', 'end', 'start', 'tokens'); %! assert (s,1) %! assert (e,5) -%! assert (size(te), [1,1]) -%! assert (isempty(te{1})) -%! assert (m{1},'short') -%! ## Matlab gives [1,0] here but that seems wrong. -%! assert (size(t), [1,1]) +%! assert (isempty(te)) +%! assert (m,'short') +%! assert (isempty(t)) %!testif HAVE_PCRE %! ## This test is expected to fail if PCRE is not installed @@ -1087,21 +1118,17 @@ %! [s, e, te, m, t] = regexpi('ShoRt Test String','\w*r\w*','once'); %! assert (s,1) %! assert (e,5) -%! assert (size(te), [1,1]) -%! assert (isempty(te{1})) -%! assert (m{1},'ShoRt') -%! ## Matlab gives [1,0] here but that seems wrong. -%! assert (size(t), [1,1]) +%! assert (isempty(te)) +%! assert (m,'ShoRt') +%! assert (isempty(t)) %!test %! [m, te, e, s, t] = regexpi('ShoRt Test String','\w*r\w*','once', 'match', 'tokenExtents', 'end', 'start', 'tokens'); %! assert (s,1) %! assert (e,5) -%! assert (size(te), [1,1]) -%! assert (isempty(te{1})) -%! assert (m{1},'ShoRt') -%! ## Matlab gives [1,0] here but that seems wrong. -%! assert (size(t), [1,1]) +%! assert (isempty(te)) +%! assert (m,'ShoRt') +%! assert (isempty(t)) %!testif HAVE_PCRE %! ## This test is expected to fail if PCRE is not installed @@ -1237,7 +1264,8 @@ std::list lst; string_vector named; int nopts; - int sz = octregexp_list (regexpargs, nm , false, lst, named, nopts); + bool once; + int sz = octregexp_list (regexpargs, nm , false, lst, named, nopts, once); if (error_state) return retval; @@ -1323,7 +1351,8 @@ std::list lst; string_vector named; int nopts; - int sz = octregexp_list (regexpargs, nm, false, lst, named,nopts); + bool once; + int sz = octregexp_list (regexpargs, nm, false, lst, named, nopts, once); if (error_state) return retval;