# HG changeset patch # User jwe # Date 1045365866 0 # Node ID c29c382a5b4b2493835a3e459ef43dbc2fd1d4c7 # Parent 1cae4472c6249a5560e3e483e3349237ad06dadb [project @ 2003-02-16 03:24:26 by jwe] diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2003-02-15 John W. Eaton + * oct-stdstrm.h, oct-stdstrm.cc (octave_base_stdiostream, + octave_iostdiostream, octave_istdiostram, octave_ostdiostream): + Combine all functionality into one class, octave_stdiostream. + Change all uses. + * file-io.cc (Ftmpfile, Fmkstemp): New functions. * oct-stdstrm.h (octave_iostdiostream): New class. (octave_istdiostream::octave_istdiostream, @@ -9,7 +14,7 @@ octave_iostdiostream::create): Make close function the last arg. Change all uses. - * c-file-ptr-stream.h (iostream): New class. + * c-file-ptr-stream.h (io_c_file_ptr_stream): New class. 2003-02-14 John W. Eaton diff --git a/src/file-io.cc b/src/file-io.cc --- a/src/file-io.cc +++ b/src/file-io.cc @@ -1550,12 +1550,12 @@ std::ios::openmode md = fopen_mode_to_ios_mode ("w+b"); - octave_stream s = octave_iostdiostream::create (nm, fid, md); + octave_stream s = octave_stdiostream::create (nm, fid, md); if (s) retval(0) = octave_stream_list::insert (s); else - error ("tmpfile: failed to create octave_iostdiostream object"); + error ("tmpfile: failed to create octave_stdiostream object"); } else @@ -1635,7 +1635,7 @@ std::ios::openmode md = fopen_mode_to_ios_mode (fopen_mode); - octave_stream s = octave_iostdiostream::create (nm, fid, md); + octave_stream s = octave_stdiostream::create (nm, fid, md); if (s) { @@ -1646,7 +1646,7 @@ mark_for_deletion (nm); } else - error ("mkstemp: failed to create octave_iostdiostream object"); + error ("mkstemp: failed to create octave_stdiostream object"); } else { diff --git a/src/oct-prcstrm.cc b/src/oct-prcstrm.cc --- a/src/oct-prcstrm.cc +++ b/src/oct-prcstrm.cc @@ -44,8 +44,8 @@ octave_iprocstream::octave_iprocstream (const std::string& n, std::ios::openmode arg_md, oct_mach_info::float_format flt_fmt) - : octave_istdiostream (n, ::popen (n.c_str (), "r"), - arg_md, flt_fmt, cxx_pclose) + : octave_stdiostream (n, ::popen (n.c_str (), "r"), + arg_md, flt_fmt, cxx_pclose) { } @@ -64,8 +64,8 @@ octave_oprocstream::octave_oprocstream (const std::string& n, std::ios::openmode arg_md, oct_mach_info::float_format flt_fmt) - : octave_ostdiostream (n, ::popen (n.c_str (), "w"), - arg_md, flt_fmt, cxx_pclose) + : octave_stdiostream (n, ::popen (n.c_str (), "w"), + arg_md, flt_fmt, cxx_pclose) { } diff --git a/src/oct-prcstrm.h b/src/oct-prcstrm.h --- a/src/oct-prcstrm.h +++ b/src/oct-prcstrm.h @@ -29,7 +29,7 @@ // oprocstream, which in turn use the octave_procbuf class? class -octave_iprocstream : public octave_istdiostream +octave_iprocstream : public octave_stdiostream { public: @@ -56,7 +56,7 @@ }; class -octave_oprocstream : public octave_ostdiostream +octave_oprocstream : public octave_stdiostream { public: diff --git a/src/oct-stdstrm.cc b/src/oct-stdstrm.cc --- a/src/oct-stdstrm.cc +++ b/src/oct-stdstrm.cc @@ -31,7 +31,7 @@ // Position a stream at OFFSET relative to ORIGIN. int -octave_base_stdiostream::seek (std::streamoff offset, std::ios::seekdir origin) +octave_stdiostream::seek (std::streamoff offset, std::ios::seekdir origin) { int retval = -1; @@ -54,7 +54,7 @@ // Return current stream position. long -octave_base_stdiostream::tell (void) const +octave_stdiostream::tell (void) const { long retval = -1; @@ -74,99 +74,6 @@ return retval; } -octave_stream -octave_istdiostream::create (const std::string& n, FILE *f, - std::ios::openmode arg_md, - oct_mach_info::float_format flt_fmt, - c_file_ptr_buf::close_fcn cf) -{ - return octave_stream (new octave_istdiostream (n, f, arg_md, flt_fmt, cf)); -} - -octave_istdiostream::octave_istdiostream (const std::string& n, FILE *f, - std::ios::openmode arg_md, - oct_mach_info::float_format flt_fmt, - c_file_ptr_buf::close_fcn cf) - : octave_base_stdiostream (n, arg_md, flt_fmt), is (0) -{ - if (f) - is = new i_c_file_ptr_stream (f, cf); -} - -octave_istdiostream::~octave_istdiostream (void) -{ - delete is; -} - -void -octave_istdiostream::do_close (void) -{ - if (is) - is->close (); -} - -octave_stream -octave_ostdiostream::create (const std::string& n, FILE *f, - std::ios::openmode arg_md, - oct_mach_info::float_format flt_fmt, - c_file_ptr_buf::close_fcn cf) -{ - return octave_stream (new octave_ostdiostream (n, f, arg_md, flt_fmt, cf)); -} - -octave_ostdiostream::octave_ostdiostream (const std::string& n, FILE *f, - std::ios::openmode arg_md, - oct_mach_info::float_format flt_fmt, - c_file_ptr_buf::close_fcn cf) - : octave_base_stdiostream (n, arg_md, flt_fmt), os (0) -{ - if (f) - os = new o_c_file_ptr_stream (f, cf); -} - -octave_ostdiostream::~octave_ostdiostream (void) -{ - delete os; -} - -void -octave_ostdiostream::do_close (void) -{ - if (os) - os->close (); -} - -octave_stream -octave_iostdiostream::create (const std::string& n, FILE *f, - std::ios::openmode arg_md, - oct_mach_info::float_format flt_fmt, - c_file_ptr_buf::close_fcn cf) -{ - return octave_stream (new octave_iostdiostream (n, f, arg_md, flt_fmt, cf)); -} - -octave_iostdiostream::octave_iostdiostream (const std::string& n, FILE *f, - std::ios::openmode arg_md, - oct_mach_info::float_format flt_fmt, - c_file_ptr_buf::close_fcn cf) - : octave_base_stdiostream (n, arg_md, flt_fmt), s (0) -{ - if (f) - s = new io_c_file_ptr_stream (f, cf); -} - -octave_iostdiostream::~octave_iostdiostream (void) -{ - delete s; -} - -void -octave_iostdiostream::do_close (void) -{ - if (s) - s->close (); -} - /* ;;; Local Variables: *** ;;; mode: C++ *** diff --git a/src/oct-stdstrm.h b/src/oct-stdstrm.h --- a/src/oct-stdstrm.h +++ b/src/oct-stdstrm.h @@ -27,15 +27,28 @@ #include "c-file-ptr-stream.h" class -octave_base_stdiostream : public octave_base_stream +octave_stdiostream : public octave_base_stream { public: - octave_base_stdiostream - (const std::string& n, - std::ios::openmode arg_md = std::ios::in|std::ios::out, - oct_mach_info::float_format flt_fmt = oct_mach_info::native) - : octave_base_stream (arg_md, flt_fmt), nm (n) { } + octave_stdiostream (const std::string& n, FILE *f = 0, + std::ios::openmode arg_md = std::ios::in|std::ios::out, + oct_mach_info::float_format flt_fmt = oct_mach_info::native, + c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose) + : octave_base_stream (arg_md, flt_fmt), nm (n), md (arg_md), s(0) + { + if (f) + s = new io_c_file_ptr_stream (f, cf); + } + + static octave_stream + create (const std::string& n, FILE *f = 0, + std::ios::openmode arg_md = std::ios::in|std::ios::out, + oct_mach_info::float_format flt_fmt = oct_mach_info::native, + c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose) + { + return octave_stream (new octave_stdiostream (n, f, arg_md, flt_fmt, cf)); + } // Position a stream at OFFSET relative to ORIGIN. @@ -45,158 +58,17 @@ long tell (void) const; + // Return non-zero if EOF has been reached on this stream. + + bool eof (void) const { return s ? s->eof () : true; } + // The name of the file. std::string name (void) const { return nm; } - virtual c_file_ptr_buf *rdbuf (void) const = 0; - - virtual bool bad (void) const = 0; - - virtual void clear (void) = 0; - -protected: - - std::string nm; - - ~octave_base_stdiostream (void) { } - - // No copying! - - octave_base_stdiostream (const octave_base_stdiostream&); - - octave_base_stdiostream& operator = (const octave_base_stdiostream&); -}; - -class -octave_istdiostream : public octave_base_stdiostream -{ -public: - - octave_istdiostream (const std::string& n, FILE *f = 0, - std::ios::openmode arg_md = std::ios::in, - oct_mach_info::float_format flt_fmt = oct_mach_info::native, - c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose); - - static octave_stream - create (const std::string& n, FILE *f = 0, - std::ios::openmode arg_md = std::ios::in, - oct_mach_info::float_format flt_fmt = oct_mach_info::native, - c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose); - - // Return non-zero if EOF has been reached on this stream. - - bool eof (void) const { return is ? is->eof () : true; } - - std::istream *input_stream (void) { return is; } - - std::ostream *output_stream (void) { return 0; } - - // XXX FIXME XXX -- should not have to cast away const here. - c_file_ptr_buf *rdbuf (void) const - { return is ? (const_cast (is))->rdbuf () : 0; } - - bool bad (void) const { return is ? is->bad () : true; } - - void clear (void) - { - if (is) - is->clear (); - } - - void do_close (void); - -protected: - - i_c_file_ptr_stream *is; - - ~octave_istdiostream (void); - -private: - - // No copying! - - octave_istdiostream (const octave_istdiostream&); - - octave_istdiostream& operator = (const octave_istdiostream&); -}; + std::istream *input_stream (void) { return (md & std::ios::in) ? s : 0; } -class -octave_ostdiostream : public octave_base_stdiostream -{ -public: - - octave_ostdiostream (const std::string& n, FILE *f = 0, - std::ios::openmode arg_md = std::ios::out, - oct_mach_info::float_format flt_fmt = oct_mach_info::native, - c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose); - - static octave_stream - create (const std::string& n, FILE *f = 0, - std::ios::openmode arg_md = std::ios::out, - oct_mach_info::float_format flt_fmt = oct_mach_info::native, - c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose); - - // Return non-zero if EOF has been reached on this stream. - - bool eof (void) const { return os ? os->eof () : true; } - - std::istream *input_stream (void) { return 0; } - - std::ostream *output_stream (void) { return os; } - - // XXX FIXME XXX -- should not have to cast away const here. - c_file_ptr_buf *rdbuf (void) const - { return os ? (const_cast (os))->rdbuf () : 0; } - - bool bad (void) const { return os ? os->bad () : true; } - - void clear (void) - { - if (os) - os->clear (); - } - - void do_close (void); - -protected: - - o_c_file_ptr_stream *os; - - ~octave_ostdiostream (void); - -private: - - // No copying! - - octave_ostdiostream (const octave_ostdiostream&); - - octave_ostdiostream& operator = (const octave_ostdiostream&); -}; - -class -octave_iostdiostream : public octave_base_stdiostream -{ -public: - - octave_iostdiostream (const std::string& n, FILE *f = 0, - std::ios::openmode arg_md = std::ios::in, - oct_mach_info::float_format flt_fmt = oct_mach_info::native, - c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose); - - static octave_stream - create (const std::string& n, FILE *f = 0, - std::ios::openmode arg_md = std::ios::in|std::ios::out, - oct_mach_info::float_format flt_fmt = oct_mach_info::native, - c_file_ptr_buf::close_fcn cf = c_file_ptr_buf::fclose); - - // Return non-zero if EOF has been reached on this stream. - - bool eof (void) const { return s ? s->eof () : true; } - - std::istream *input_stream (void) { return s; } - - std::ostream *output_stream (void) { return s; } + std::ostream *output_stream (void) { return (md & std::ios::in) ? s : 0; } // XXX FIXME XXX -- should not have to cast away const here. c_file_ptr_buf *rdbuf (void) const @@ -204,27 +76,27 @@ bool bad (void) const { return s ? s->bad () : true; } - void clear (void) - { - if (s) - s->clear (); - } + void clear (void) { if (s) s->clear (); } - void do_close (void); + void do_close (void) { if (s) s->close (); } protected: + std::string nm; + + std::ios::openmode md; + io_c_file_ptr_stream *s; - ~octave_iostdiostream (void); + ~octave_stdiostream (void) { delete s; } private: // No copying! - octave_iostdiostream (const octave_iostdiostream&); + octave_stdiostream (const octave_stdiostream&); - octave_iostdiostream& operator = (const octave_iostdiostream&); + octave_stdiostream& operator = (const octave_stdiostream&); }; #endif diff --git a/src/syscalls.cc b/src/syscalls.cc --- a/src/syscalls.cc +++ b/src/syscalls.cc @@ -671,8 +671,13 @@ FILE *ifile = fdopen (fid[0], "r"); FILE *ofile = fdopen (fid[1], "w"); - octave_stream is = octave_istdiostream::create (std::string (), ifile); - octave_stream os = octave_ostdiostream::create (std::string (), ofile); + std::string nm; + + octave_stream is = octave_stdiostream::create (nm, ifile, + std::ios::in); + + octave_stream os = octave_stdiostream::create (nm, ofile, + std::ios::out); octave_value_list file_ids;