# HG changeset patch # User jwe # Date 947218746 0 # Node ID ee5f222025c38c85e7b3017411c699ff039cc00f # Parent 010909651e8458df74fa4f8220371166b732b1fe [project @ 2000-01-07 04:19:05 by jwe] diff -r 010909651e84 -r ee5f222025c3 src/ChangeLog --- a/src/ChangeLog Thu Jan 06 20:00:20 2000 +0000 +++ b/src/ChangeLog Fri Jan 07 04:19:06 2000 +0000 @@ -1,5 +1,8 @@ 2000-01-06 John W. Eaton + * oct-stream.cc (do_scanf): Do the right thing again for character + conversions. + * help.cc (display_help_text): Also strip out leading spaces before Texinfo @-commands before sending doc string to makeinfo. (display_help_text): Improve format of `See also' string. diff -r 010909651e84 -r ee5f222025c3 src/oct-stream.cc --- a/src/oct-stream.cc Thu Jan 06 20:00:20 2000 +0000 +++ b/src/oct-stream.cc Fri Jan 07 04:19:06 2000 +0000 @@ -956,6 +956,46 @@ do_scanf_conv (istream&, const char*, double*, Matrix&, double*, int&, int&, int, int, bool); +#define FINISH_CHARACTER_CONVERSION() \ + do \ + { \ + width = strlen (tmp); \ + \ + if (is) \ + { \ + int i = 0; \ + \ + if (! discard) \ + { \ + conversion_count++; \ + \ + while (i < width && tmp[i] != '\0') \ + { \ + if (data_index == max_size) \ + { \ + max_size *= 2; \ + \ + if (nr > 0) \ + mval.resize (nr, max_size / nr, 0.0); \ + else \ + { \ + if (all_char_conv && one_elt_size_spec) \ + mval.resize (1, max_size, 0.0); \ + else \ + mval.resize (max_size, 1, 0.0); \ + } \ + \ + data = mval.fortran_vec (); \ + } \ + \ + data[data_index++] = tmp[i++]; \ + } \ + } \ + } \ + \ + delete [] tmp; \ + } \ + while (0) octave_value octave_base_stream::do_scanf (scanf_format_list& fmt_list, @@ -992,20 +1032,18 @@ { if (one_elt_size_spec) { - mval.resize (1, 512, 0.0); + max_size = 512; + mval.resize (1, max_size, 0.0); data = mval.fortran_vec (); - max_size = 512; - + if (nr > 0) max_conv = nr; } else if (nr > 0 && nc > 0) { - mval.resize (nr, 32, 0.0); + mval.resize (nr, nc, 0.0); data = mval.fortran_vec (); - max_size = nr * 32; - - max_conv = nr * nc; + max_size = max_conv = nr * nc; } } else if (nr > 0) @@ -1061,18 +1099,19 @@ } else if (data_index == max_size) { + max_size *= 2; + if (nr > 0) - { - max_size *= 2; - mval.resize (nr, max_size / nr, 0.0); - data = mval.fortran_vec (); - } + mval.resize (nr, max_size / nr, 0.0); else { - max_size *= 2; - mval.resize (max_size, 1, 0.0); - data = mval.fortran_vec (); + if (all_char_conv && one_elt_size_spec) + mval.resize (1, max_size, 0.0); + else + mval.resize (max_size, 1, 0.0); } + + data = mval.fortran_vec (); } const char *fmt = elt->text; @@ -1134,16 +1173,32 @@ break; case 'c': - is.unsetf (ios::skipws); - // Fall through... + { + is.unsetf (ios::skipws); + + int width = elt->width; + + if (width == 0) + width = 1; + + char *tmp = new char[width+1]; + + int c = EOF; + int n = 0; + + while (is && n < width && (c = is.get ()) != EOF) + tmp[n++] = (char) c; + + tmp[n] = '\0'; + + FINISH_CHARACTER_CONVERSION (); + } + break; case 's': { int width = elt->width; - if (elt->type == 'c' && width == 0) - width = 1; - char *tmp = 0; if (width) @@ -1178,36 +1233,7 @@ tmp = buf.str (); } - width = strlen (tmp); - - if (is) - { - int i = 0; - - if (! discard) - { - conversion_count++; - - while (i < width && tmp[i] != '\0') - { - if (data_index == max_size) - { - max_size *= 2; - - if (nr > 0) - mval.resize (nr, max_size / nr, 0.0); - else - mval.resize (max_size, 1, 0.0); - - data = mval.fortran_vec (); - } - - data[data_index++] = tmp[i++]; - } - } - } - - delete [] tmp; + FINISH_CHARACTER_CONVERSION (); is.setf (flags); }