Mercurial > hg > octave-nkf
diff src/oct-stream.cc @ 2317:8c09c04f7747
[project @ 1996-07-14 22:30:15 by jwe]
author | jwe |
---|---|
date | Sun, 14 Jul 1996 22:40:35 +0000 |
parents | 5a3f1d00a474 |
children | 6ee55c0f25a9 |
line wrap: on
line diff
--- a/src/oct-stream.cc +++ b/src/oct-stream.cc @@ -817,218 +817,38 @@ return do_gets (max_len, err, false, "fgets"); } -// XXX FIXME XXX -- need to handle architecture type conversions. - -#define do_read_elem(is, type, val) \ - do \ - { \ - type tmp_val; \ - is.read ((char *) &tmp_val, sizeof (type)); \ - val = tmp_val; \ - } \ - while (0) - octave_value -octave_base_stream::do_read (int nr, int nc, data_type dt, int skip, - arch_type at, int& count) +octave_base_stream::read (const Matrix& size, + oct_data_conv::data_type dt, int skip, + oct_mach_info::float_format flt_fmt, int& count) { + Matrix retval; + count = 0; - octave_value retval = Matrix (); - istream *isp = input_stream (); - Matrix mval; - double *data = 0; - int max_size = 0; - - int final_nr = 0; - int final_nc = 0; - - if (nr > 0) - { - if (nc > 0) - { - mval.resize (nr, nc, 0.0); - data = mval.fortran_vec (); - max_size = nr * nc; - } - else - { - mval.resize (nr, 32, 0.0); - data = mval.fortran_vec (); - max_size = nr * 32; - } - } - else - { - mval.resize (32, 1, 0.0); - data = mval.fortran_vec (); - max_size = 32; - } - if (isp) { istream& is = *isp; - for (;;) - { - // XXX FIXME XXX -- maybe there should be a special case for - // skip == 0. - - if (is) - { - if (nr > 0 && nc > 0 && count == max_size) - { - final_nr = nr; - final_nc = nc; - - break; - } - - if (skip != 0) - seek (skip, ios::cur); - - if (is) - { - double tmp = 0.0; - - switch (dt) - { - case dt_char: - do_read_elem (is, char, tmp); - break; - - case dt_schar: - do_read_elem (is, signed char, tmp); - break; - - case dt_uchar: - do_read_elem (is, unsigned char, tmp); - break; - - case dt_short: - do_read_elem (is, short, tmp); - break; - - case dt_ushort: - do_read_elem (is, unsigned short, tmp); - break; - - case dt_int: - do_read_elem (is, int, tmp); - break; - - case dt_uint: - do_read_elem (is, unsigned int, tmp); - break; - - case dt_long: - do_read_elem (is, long, tmp); - break; - - case dt_ulong: - do_read_elem (is, unsigned long, tmp); - break; - - case dt_float: - do_read_elem (is, float, tmp); - break; - - case dt_double: - do_read_elem (is, double, tmp); - break; - - default: - error ("fread: invalid type specification"); - } - - if (is && ok ()) - { - if (count == max_size) - { - max_size *= 2; - - if (nr > 0) - mval.resize (nr, max_size / 2, 0.0); - else - mval.resize (max_size, 1, 0.0); - - data = mval.fortran_vec (); - } - - data[count++] = tmp; - } - else - { - if (is.eof ()) - { - if (nr > 0) - { - if (count > nr) - { - final_nr = nr; - final_nc = (count - 1) / nr + 1; - } - else - { - final_nr = count; - final_nc = 1; - } - } - else - { - final_nr = count; - final_nc = 1; - } - } - - break; - } - } - else - { - error ("fread: read error"); - break; - } - } - else - { - error ("fread: read error"); - break; - } - } - } - - if (ok ()) - { - mval.resize (final_nr, final_nc, 0.0); - - retval = mval; - } - - return retval; -} - -octave_value -octave_base_stream::read (const Matrix& size, data_type dt, int skip, - arch_type at, int& count) -{ - octave_value retval; - - count = 0; - - istream *is = input_stream (); - - if (is) - { int nr = -1; int nc = -1; get_size (size, nr, nc, "fread"); if (! error_state) - retval = do_read (nr, nc, dt, skip, at, count); + { + if (flt_fmt == oct_mach_info::unknown) + flt_fmt = float_format (); + + int tmp = retval.read (is, nr, nc, dt, skip, flt_fmt); + + if (tmp < 0) + error ("fread: read error"); + else + count = tmp; + } } else invalid_operation ("fread", "reading"); @@ -1628,138 +1448,32 @@ return retval; } -// XXX FIXME XXX -- need to handle architecture type conversions. - -#define do_write_elem(os, type, val) \ - do \ - { \ - type tmp_val = (type) val; \ - os.write ((char *) &tmp_val, sizeof (type)); \ - } \ - while (0) - int -octave_base_stream::do_write (const double *data, int n, data_type dt, - int skip, arch_type at) +octave_base_stream::write (const octave_value& data, + oct_data_conv::data_type dt, int skip, + oct_mach_info::float_format flt_fmt) { int retval = -1; - int count = 0; - ostream *osp = output_stream (); if (osp) { ostream& os = *osp; - // XXX FIXME XXX -- maybe there should be a special case for - // skip == 0. - - for (int i = 0; i < n; i++) - { - if (os) - { - if (skip != 0) - seek (skip, ios::cur); - - if (os) - { - double tmp = data[i]; - - switch (dt) - { - case dt_char: - do_write_elem (os, char, tmp); - break; - - case dt_schar: - do_write_elem (os, signed char, tmp); - break; - - case dt_uchar: - do_write_elem (os, unsigned char, tmp); - break; - - case dt_short: - do_write_elem (os, short, tmp); - break; - - case dt_ushort: - do_write_elem (os, unsigned short, tmp); - break; - - case dt_int: - do_write_elem (os, int, tmp); - break; - - case dt_uint: - do_write_elem (os, unsigned int, tmp); - break; - - case dt_long: - do_write_elem (os, long, tmp); - break; - - case dt_ulong: - do_write_elem (os, unsigned long, tmp); - break; - - case dt_float: - do_write_elem (os, float, tmp); - break; - - case dt_double: - do_write_elem (os, double, tmp); - break; - - default: - error ("fwrite: invalid type specification"); - } - - if (os && ok ()) - count++; - else - break; - } - else - { - error ("fwrite: write error"); - break; - } - } - else - { - error ("fwrite: write error"); - break; - } - } - } - - if (ok ()) - retval = count; - - return retval; -} - -int -octave_base_stream::write (const octave_value& data, data_type dt, - int skip, arch_type at) -{ - int retval = -1; - - ostream *os = output_stream (); - - if (os) - { Matrix mval = data.matrix_value (); if (! error_state) { - int n = mval.length (); - - const double *d = mval.data (); - - retval = octave_base_stream::do_write (d, n, dt, skip, at); + if (flt_fmt == oct_mach_info::unknown) + flt_fmt = float_format (); + + int tmp = mval.write (os, dt, skip, flt_fmt); + + if (tmp < 0) + error ("fwrite: write error"); + else + retval = tmp; } } else @@ -2368,26 +2082,26 @@ octave_value octave_stream::read (const Matrix& size, - octave_base_stream::data_type dt, int skip, - octave_base_stream::arch_type at, int& count) + oct_data_conv::data_type dt, int skip, + oct_mach_info::float_format flt_fmt, int& count) { octave_value retval; if (stream_ok ("fread")) - retval = rep->read (size, dt, skip, at, count); + retval = rep->read (size, dt, skip, flt_fmt, count); return retval; } int octave_stream::write (const octave_value& data, - octave_base_stream::data_type dt, int skip, - octave_base_stream::arch_type at) + oct_data_conv::data_type dt, int skip, + oct_mach_info::float_format flt_fmt) { int retval = -1; if (stream_ok ("fwrite")) - retval = rep->write (data, dt, skip, at); + retval = rep->write (data, dt, skip, flt_fmt); return retval; } @@ -2498,13 +2212,13 @@ return retval; } -octave_base_stream::arch_type -octave_stream::architecture (void) +oct_mach_info::float_format +octave_stream::float_format (void) { - octave_base_stream::arch_type retval = octave_base_stream::at_unknown; - - if (stream_ok ("architecture")) - retval = rep->architecture (); + oct_mach_info::float_format retval = oct_mach_info::unknown; + + if (stream_ok ("float_format")) + retval = rep->float_format (); return retval; } @@ -2573,80 +2287,6 @@ return retval; } -string -octave_stream::arch_as_string (octave_base_stream::arch_type at) -{ - string retval = "unknown"; - - switch (at) - { - case octave_base_stream::at_native: - retval = "native"; - break; - - default: - break; - } - - return retval; -} - -octave_base_stream::data_type -octave_stream::string_to_data_type (const string& s) -{ - octave_base_stream::data_type retval = octave_base_stream::dt_unknown; - - // XXX FINISHME XXX - - /* - int16 - integer*2 - int32 - integer*4 */ - - // XXX FIXME XXX -- before checking s, need to strip spaces and downcase. - - if (s == "char" || s == "char*1" || s == "integer*1" || s == "int8") - retval = octave_base_stream::dt_char; - else if (s == "schar" || s == "signedchar") - retval = octave_base_stream::dt_schar; - else if (s == "uchar" || s == "unsignedchar") - retval = octave_base_stream::dt_uchar; - else if (s == "short") - retval = octave_base_stream::dt_short; - else if (s == "ushort" || s == "unsignedshort") - retval = octave_base_stream::dt_ushort; - else if (s == "int") - retval = octave_base_stream::dt_int; - else if (s == "uint" || s == "unsignedint") - retval = octave_base_stream::dt_uint; - else if (s == "long") - retval = octave_base_stream::dt_long; - else if (s == "ulong" || s == "unsignedlong") - retval = octave_base_stream::dt_ulong; - else if (s == "float" || s == "float32" || s == "real*4") - retval = octave_base_stream::dt_float; - else if (s == "double" || s == "float64" || s == "real**") - retval = octave_base_stream::dt_double; - else - ::error ("invalid data type specified"); - - return retval; -} - -octave_base_stream::arch_type -octave_stream::string_to_arch_type (const string& s) -{ - octave_base_stream::arch_type retval = octave_base_stream::at_unknown; - - if (s == "native") - retval = octave_base_stream::at_native; - else - ::error ("invalid architecture type specified"); - - return retval; -} - void octave_stream::invalid_stream_error (const char *op) const { @@ -2856,7 +2496,7 @@ retval(0) = os->name (); retval(1) = octave_stream::mode_as_string (os->mode ()); - retval(2) = octave_stream::arch_as_string (os->architecture ()); + retval(2) = oct_mach_info::float_format_as_string (os->float_format ()); } else ::error ("invalid file id"); @@ -2923,7 +2563,10 @@ if (os) { string mode = octave_stream::mode_as_string (os->mode ()); - string arch = octave_stream::arch_as_string (os->architecture ()); + + string arch = + oct_mach_info::float_format_as_string (os->float_format ()); + string name = os->name (); buf.form (" %4d %-3s %-9s %s\n",