Mercurial > hg > octave-nkf
diff src/oct-stream.cc @ 5065:1312d3af9eb0
[project @ 2004-11-04 20:12:00 by jwe]
author | jwe |
---|---|
date | Thu, 04 Nov 2004 20:12:11 +0000 |
parents | 160365410ad4 |
children | 10172b519695 |
line wrap: on
line diff
--- a/src/oct-stream.cc +++ b/src/oct-stream.cc @@ -2663,16 +2663,48 @@ int octave_stream::seek (long offset, int origin) { - int retval = -1; + int status = -1; if (stream_ok ("fseek")) { clearerr (); - retval = rep->seek (offset, origin); + long orig_pos = rep->tell (); + + status = rep->seek (offset, origin); + + if (status == 0) + { + long save_pos = rep->tell (); + + rep->seek (0, SEEK_END); + + long pos_eof = rep->tell (); + + // I don't think save_pos can be less than zero, but we'll + // check anyway... + + if (save_pos > pos_eof || save_pos < 0) + { + // Seek outside bounds of file. Failure should leave + // position unchanged. + + rep->seek (orig_pos, SEEK_SET); + + status = -1; + } + else + { + // Is it possible for this to fail? We are just + // returning to a position after the first successful + // seek. + + rep->seek (save_pos, SEEK_SET); + } + } } - return retval; + return status; } int @@ -2720,7 +2752,12 @@ } if (! conv_err) - retval = seek (xoffset, origin); + { + retval = seek (xoffset, origin); + + if (retval != 0) + error ("fseek: failed to seek to requested position"); + } else error ("fseek: invalid value for origin"); }