[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 3.0.4 RC3 (mingw 3.4.5)-2
From: |
Tatsuro MATSUOKA |
Subject: |
Re: 3.0.4 RC3 (mingw 3.4.5)-2 |
Date: |
Mon, 9 Mar 2009 13:48:45 +0900 (JST) |
Hello Benjamin
I have built octave-3.0.4RC5 with your patch being allied and performed the
'make check'
test_string.m .......................................... PASS 130/131 FAIL 1
Summary:
PASS 4125
FAIL 1
test of
ov-fcn-handle.cc was successful.
test_string.m .......................................... PASS 130/131 FAIL 1
is already discussed but not has not be correcet
http://www.nabble.com/3.0.4-RC3-td21723094.html#a21742494
It is a trivial problem that can be ignored.
However if it is fixed it will be grateful.
Here I used modified test_io.m but have no relies to now.
http://www.nabble.com/Quesion-about-test_io.m-td22074114.html#a22074114
I will vote it again to discuss it.
Regards
Tatsuro
--- Benjamin Lindner wrote:
> >>
> >>> Hello Benjamin
> >>>
> >>> 3.0.4 RC3 is no longer available.
> >>>
> >>> Can you remake the patch for 3.0.4 RC5?
> >>>
> >>> Regards
> >>>
> >>> Tatsuro
> >>>
>
> Sorry if I was not specific. The path I posted was against current
> development sources, e.g. 3.1.x.
>
> I have backported it for the 3.0.x branch and attached it
>
> benjamin
> > fix CRLF issues with text-mode reading in windows when loading ascii data
>
> diff -r f4de8305599c src/ChangeLog
> --- a/src/ChangeLog Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ChangeLog Thu Mar 05 15:38:37 2009 +0100
> @@ -1,3 +1,15 @@
> +2009-03-03 Benjamin Lindner <address@hidden>
> +
> + * ls-ascii-helper.h ls-ascii-helper.cc: New files, provide helper
> + functions skip_until_newline(), skip_preceeding_newline() and
> + read_until_newline() that take care of CR/LF handling.
> + * Makefile.in: add new files
> + * load-save.cc: Open files always in binary mode in Fload
> + * ls-mat-ascii.cc (get_mat_data_input_line), ls-oct-ascii.cc
> + (extract_keyword, read_ascii_data), ls-oct-ascii.h (extract_keyword),
> + ov-fcn-handle.cc, ov-fcn-inline.cc, ov-range.cc, ov-str-mat.cc
> + (load_ascii): Use helper functions
> +
> 2009-02-25 Marco Caliari <address@hidden>
>
> * graphics.cc (base_properties::remove_child): Fix order of dims.
> diff -r f4de8305599c src/Makefile.in
> --- a/src/Makefile.in Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/Makefile.in Thu Mar 05 15:38:37 2009 +0100
> @@ -116,7 +116,7 @@
> comment-list.h debug.h defun-dld.h defun-int.h defun.h \
> dirfns.h dynamic-ld.h error.h file-io.h gripes.h help.h \
> input.h lex.h load-path.h load-save.h ls-hdf5.h \
> - ls-mat-ascii.h ls-mat4.h ls-mat5.h ls-oct-ascii.h \
> + ls-mat-ascii.h ls-mat4.h ls-mat5.h ls-oct-ascii.h ls-ascii-helper.h \
> ls-oct-binary.h ls-utils.h mex.h mexproto.h oct-errno.h \
> oct-fstrm.h oct-hist.h oct-iostrm.h oct-map.h oct-obj.h \
> oct-prcstrm.h oct-procbuf.h oct-stdstrm.h oct-stream.h \
> @@ -186,7 +186,7 @@
> cutils.c data.cc debug.cc defaults.cc defun.cc dirfns.cc \
> dynamic-ld.cc error.cc file-io.cc graphics.cc gripes.cc \
> help.cc input.cc lex.l load-path.cc load-save.cc ls-hdf5.cc \
> - ls-mat-ascii.cc ls-mat4.cc ls-mat5.cc ls-oct-ascii.cc \
> + ls-mat-ascii.cc ls-mat4.cc ls-mat5.cc ls-oct-ascii.cc
> ls-ascii-helper.cc \
> ls-oct-binary.cc ls-utils.cc main.c mappers.cc matherr.c \
> mex.cc oct-fstrm.cc oct-hist.cc oct-iostrm.cc oct-map.cc \
> oct-obj.cc oct-prcstrm.cc oct-procbuf.cc oct-stream.cc \
> diff -r f4de8305599c src/load-save.cc
> --- a/src/load-save.cc Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/load-save.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -906,15 +906,12 @@
>
> std::ios::openmode mode = std::ios::in;
>
> - if (format == LS_BINARY
> -#ifdef HAVE_HDF5
> - || format == LS_HDF5
> -#endif
> - || format == LS_MAT_BINARY
> - || format == LS_MAT5_BINARY
> - || format == LS_MAT7_BINARY)
> - mode |= std::ios::binary;
> -
> + // Open in binary mode in any case, to fix annoying bug that
> + // text-mode opened streams cannot be seekg'ed/tellg'ed with
> + // mingw32 (See http://oldwiki.mingw.org/index.php/Known%20Problems )
> + // The CR/LF issues are handled in ls-ascii-helper.cc
> + mode |= std::ios::binary;
> +
> #ifdef HAVE_ZLIB
> if (use_zlib)
> {
> diff -r f4de8305599c src/ls-ascii-helper.cc
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/src/ls-ascii-helper.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -0,0 +1,160 @@
> +/*
> +
> +Copyright (C) 2003, 2005, 2006, 2007 John W. Eaton
> +
> +This file is part of Octave.
> +
> +Octave is free software; you can redistribute it and/or modify it
> +under the terms of the GNU General Public License as published by the
> +Free Software Foundation; either version 3 of the License, or (at your
> +option) any later version.
> +
> +Octave is distributed in the hope that it will be useful, but WITHOUT
> +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
> +for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with Octave; see the file COPYING. If not, see
> +<http://www.gnu.org/licenses/>.
> +
> +*/
> +
> +
> +#include "ls-ascii-helper.h"
> +
> +#include <iostream>
> +#include <sstream>
> +
> +// Helper functions when reading from ascii files.
> +// These function take care of CR/LF issues when files are opened in
> text-mode for reading
> +
> +// Skip characters from stream IS until a newline is reached.
> +// Depending on KEEP_NEWLINE, either eat newline from stream or
> +// keep it unread
> +
> +void
> +skip_until_newline( std::istream& is, bool keep_newline )
> +{
> + if (!is)
> + return;
> +
> + char c,d;
> +
> + while (is)
> + {
> + c = is.peek();
> + if (c == '\n' || c == '\r')
> + {
> + // reached newline
> + if (keep_newline == false)
> + {
> + // eat the CR or LF character
> + is.get(d);
> +
> + // make sure that for binary-mode opened ascii files containing
> CRLF line endings
> + // we skip the LF after CR...
> + if (c == '\r' && is.peek()=='\n')
> + {
> + // yes, LF following CR, eat it...
> + is.get(d);
> + }
> + }
> +
> + // Newline was found, and read from stream if keep_newline==true, so
> exit loop
> + break;
> + }
> + else
> + // no newline charater peeked, so read it and proceed to next
> character
> + is.get(d);
> + }
> +
> + return;
> +}
> +
> +
> +// If stream IS currently points to a newline (a leftover from a previous
> read)
> +// then eat newline(s) until a non-newline character is found
> +
> +void
> +skip_preceeding_newline( std::istream& is )
> +{
> + if (!is)
> + return;
> +
> + char c,d;
> +
> + // Check if IS currently points to newline character
> + c = is.peek();
> + if (c == '\n' || c == '\r')
> + {
> + // Yes, at newline
> + do {
> + // eat the CR or LF character
> + is.get(d);
> +
> + // make sure that for binary-mode opened ascii files containing CRLF
> line endings
> + // we skip the LF after CR...
> + if (c == '\r' && is.peek() == '\n')
> + {
> + // yes, LF following CR, eat it...
> + is.get(d);
> + }
> +
> + // Peek into next character
> + c = is.peek();
> + // Loop while still a newline ahead
> + } while( c == '\n' || c == '\r' );
> + }
> +
> + return;
> +}
> +
> +
> +// Read charaters from stream IS until a newline is reached.
> +// Depending on KEEP_NEWLINE, either eat newline from stream or
> +// keep it unread
> +// Characters read are stored and returned as std::string
> +
> +std::string
> +read_until_newline( std::istream& is, bool keep_newline )
> +{
> + if (!is)
> + return std::string();
> +
> + char c,d;
> + std::ostringstream buf;
> +
> + while (is)
> + {
> + c = is.peek();
> + if (c == '\n' || c == '\r')
> + {
> + // reached newline
> + if (keep_newline == false)
> + {
> + // eat the CR or LF character
> + is.get(d);
> +
> + // make sure that for binary-mode opened ascii files containing
> CRLF line endings
> + // we skip the LF after CR...
> + if (c == '\r' && is.peek() == '\n')
> + {
> + // yes, LF following CR, eat it...
> + is.get(d);
> + }
> + }
> +
> + // Newline was found, and read from stream if keep_newline==true, so
> exit loop
> + break;
> + }
> + else
> + {
> + // no newline charater peeked, so read it, store it, and proceed to
> next
> + is.get(d);
> + buf << d;
> + }
> + }
> +
> + return buf.str();
> +}
> diff -r f4de8305599c src/ls-ascii-helper.h
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/src/ls-ascii-helper.h Thu Mar 05 15:38:37 2009 +0100
> @@ -0,0 +1,40 @@
> +/*
> +
> +Copyright (C) 2003, 2005, 2006, 2007 John W. Eaton
> +
> +This file is part of Octave.
> +
> +Octave is free software; you can redistribute it and/or modify it
> +under the terms of the GNU General Public License as published by the
> +Free Software Foundation; either version 3 of the License, or (at your
> +option) any later version.
> +
> +Octave is distributed in the hope that it will be useful, but WITHOUT
> +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
> +for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with Octave; see the file COPYING. If not, see
> +<http://www.gnu.org/licenses/>.
> +
> +*/
> +
> +#if !defined (octave_ls_ascii_helper_h)
> +#define octave_ls_ascii_helper_h 1
> +
> +#include <iosfwd>
> +#include <string>
> +
> +#include "oct-dlldefs.h"
> +
> +extern OCTINTERP_API void
> +skip_until_newline( std::istream& is, bool keep_newline = false );
> +
> +extern OCTINTERP_API void
> +skip_preceeding_newline( std::istream& is );
> +
> +extern OCTINTERP_API std::string
> +read_until_newline( std::istream& is, bool keep_newline = false );
> +
> +#endif // !defined (octave_ls_ascii_helper_h)
> diff -r f4de8305599c src/ls-mat-ascii.cc
> --- a/src/ls-mat-ascii.cc Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ls-mat-ascii.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -65,6 +65,7 @@
> #include "dMatrix.h"
>
> #include "ls-mat-ascii.h"
> +#include "ls-ascii-helper.h"
>
> static std::string
> get_mat_data_input_line (std::istream& is)
> @@ -81,14 +82,16 @@
> while (is.get (c))
> {
> if (c == '\n' || c == '\r')
> - break;
> + {
> + // Let skip_until_newline handle CR/LF issues...
> + skip_until_newline (is, false);
> + break;
> + }
>
> if (c == '%' || c == '#')
> {
> // skip to end of line
> - while (is.get (c))
> - if (c == '\n' || c == '\r')
> - break;
> + skip_until_newline (is, false);
>
> break;
> }
> diff -r f4de8305599c src/ls-oct-ascii.cc
> --- a/src/ls-oct-ascii.cc Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ls-oct-ascii.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -65,6 +65,7 @@
> #include "dMatrix.h"
>
> #include "ls-oct-ascii.h"
> +#include "ls-ascii-helper.h"
>
> // The number of decimal digits to use when writing ascii data.
> static int Vsave_precision = 16;
> @@ -116,14 +117,15 @@
> }
>
> retval = value.str ();
> + skip_until_newline (is, false);
> break;
> }
> else if (next_only)
> break;
> else
> {
> - while (is.get (c) && c != '\n' && c != '\r')
> - ; // Skip to end of line.
> + // Skip to end of line
> + skip_until_newline (is, false);
> }
> }
> }
> diff -r f4de8305599c src/ls-oct-ascii.h
> --- a/src/ls-oct-ascii.h Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ls-oct-ascii.h Thu Mar 05 15:38:37 2009 +0100
> @@ -29,6 +29,7 @@
> #include <string>
>
> #include "str-vec.h"
> +#include "ls-ascii-helper.h"
>
> // Flag for cell elements
> #define CELL_ELT_TAG "<cell-element>"
> @@ -103,8 +104,8 @@
> is >> value;
> if (is)
> status = true;
> - while (is.get (c) && c != '\n' && c != '\r')
> - ; // Skip to beginning of next line;
> + // Skip to beginning of next line;
> + skip_until_newline (is, false);
> break;
> }
> else if (next_only)
> @@ -165,8 +166,8 @@
> is >> value;
> if (is)
> status = true;
> - while (is.get (c) && c != '\n' && c != '\r')
> - ; // Skip to beginning of next line;
> + // Skip to beginning of next line;
> + skip_until_newline (is, false);
> return status;
> }
> }
> diff -r f4de8305599c src/ov-fcn-handle.cc
> --- a/src/ov-fcn-handle.cc Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ov-fcn-handle.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -56,6 +56,7 @@
> #include "ls-oct-binary.h"
> #include "ls-hdf5.h"
> #include "ls-utils.h"
> +#include "ls-ascii-helper.h"
>
> DEFINE_OCTAVE_ALLOCATOR (octave_fcn_handle);
>
> @@ -330,26 +331,18 @@
> {
> octave_idx_type len = 0;
> char c;
> - std::ostringstream buf;
> + std::string buf;
>
> // Skip preceeding newline(s).
> - while (is.get (c) && c == '\n')
> - /* do nothing */;
> + skip_preceeding_newline (is);
>
> if (is)
> {
> - buf << c;
>
> // Get a line of text whitespace characters included, leaving
> // newline in the stream.
> + buf = read_until_newline (is, true);
>
> - while (is.peek () != '\n')
> - {
> - is.get (c);
> - if (! is)
> - break;
> - buf << c;
> - }
> }
>
> pos = is.tellg ();
> @@ -408,7 +401,7 @@
>
> int parse_status;
> octave_value anon_fcn_handle =
> - eval_string (buf.str (), true, parse_status);
> + eval_string (buf, true, parse_status);
>
> if (parse_status == 0)
> {
> diff -r f4de8305599c src/ov-fcn-inline.cc
> --- a/src/ov-fcn-inline.cc Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ov-fcn-inline.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -47,6 +47,7 @@
> #include "ls-oct-ascii.h"
> #include "ls-hdf5.h"
> #include "ls-utils.h"
> +#include "ls-ascii-helper.h"
>
> DEFINE_OCTAVE_ALLOCATOR (octave_fcn_inline);
>
> @@ -139,27 +140,20 @@
> nm = "";
>
> char c;
> - std::ostringstream buf;
> + std::string buf;
>
> // Skip preceeding newline(s)
> - while (is.get (c) && c == '\n');
> + skip_preceeding_newline (is);
>
> if (is)
> {
> - buf << c;
>
> // Get a line of text whitespace characters included, leaving
> // newline in the stream
> - while (is.peek () != '\n')
> - {
> - is.get (c);
> - if (! is)
> - break;
> - buf << c;
> - }
> + buf = read_until_newline (is, true);
> }
>
> - iftext = buf.str ();
> + iftext = buf;
>
> octave_fcn_inline tmp (iftext, ifargs, nm);
> fcn = tmp.fcn;
> diff -r f4de8305599c src/ov-range.cc
> --- a/src/ov-range.cc Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ov-range.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -41,6 +41,7 @@
> #include "byte-swap.h"
> #include "ls-hdf5.h"
> #include "ls-utils.h"
> +#include "ls-ascii-helper.h"
>
> DEFINE_OCTAVE_ALLOCATOR (octave_range);
>
> @@ -274,14 +275,9 @@
> break;
> }
>
> - for (;;)
> - {
> - if (is && (c == '%' || c == '#'))
> - while (is.get (c) && c != '\n')
> - ; // Skip to beginning of next line, ignoring everything.
> - else
> - break;
> - }
> + // Skip to beginning of next line, ignoring everything.
> + skip_until_newline (is, false);
> +
> }
>
> bool
> diff -r f4de8305599c src/ov-str-mat.cc
> --- a/src/ov-str-mat.cc Thu Mar 05 15:22:25 2009 +0100
> +++ b/src/ov-str-mat.cc Thu Mar 05 15:38:37 2009 +0100
> @@ -48,6 +48,7 @@
> #include "pr-output.h"
> #include "pt-mat.h"
> #include "utils.h"
> +#include "ls-ascii-helper.h"
>
> DEFINE_OCTAVE_ALLOCATOR (octave_char_matrix_str);
> DEFINE_OCTAVE_ALLOCATOR (octave_char_matrix_sq_str);
> @@ -344,8 +345,7 @@
> char *ftmp = tmp.fortran_vec ();
>
> // Skip the return line
> - if (! is.read (ftmp, 1))
> - return false;
> + skip_preceeding_newline (is);
>
> if (! is.read (ftmp, dv.numel ()) || !is)
> {
>
--------------------------------------
Power up the Internet with Yahoo! Toolbar.
http://pr.mail.yahoo.co.jp/toolbar/
Re: 3.0.4 RC3 (mingw 3.4.5)-2, John W. Eaton, 2009/03/10