From 01d67104f6036c4901ae19d930fa3bbc7947814b Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 7 Jul 2010 17:32:30 -0400 Subject: [PATCH] io.ports: fix stream-seek with seek-relative seek type (reported by Joe Groff) --- basis/io/ports/ports.factor | 12 +++++++++++- core/io/files/files-tests.factor | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/basis/io/ports/ports.factor b/basis/io/ports/ports.factor index 3864b37e48..8517910b0f 100644 --- a/basis/io/ports/ports.factor +++ b/basis/io/ports/ports.factor @@ -4,7 +4,8 @@ USING: math kernel io sequences io.buffers io.timeouts generic byte-vectors system io.encodings math.order io.backend continuations classes byte-arrays namespaces splitting grouping dlists alien alien.c-types assocs io.encodings.binary summary -accessors destructors combinators fry specialized-arrays ; +accessors destructors combinators fry specialized-arrays +locals ; SPECIALIZED-ARRAY: uchar IN: io.ports @@ -148,12 +149,21 @@ M: output-port stream-tell ( stream -- n ) [ check-disposed ] [ [ handle>> tell-handle ] [ buffer>> buffer-length ] bi + ] bi ; +:: do-seek-relative ( n seek-type stream -- n seek-type stream ) + ! seek-relative needs special handling here, because of the + ! buffer. + seek-type seek-relative eq? + [ n stream stream-tell + seek-absolute ] [ n seek-type ] if + stream ; + M: input-port stream-seek ( n seek-type stream -- ) + do-seek-relative [ check-disposed ] [ buffer>> 0 swap buffer-reset ] [ handle>> seek-handle ] tri ; M: output-port stream-seek ( n seek-type stream -- ) + do-seek-relative [ check-disposed ] [ stream-flush ] [ handle>> seek-handle ] tri ; diff --git a/core/io/files/files-tests.factor b/core/io/files/files-tests.factor index 4986fedd79..8b578750bc 100644 --- a/core/io/files/files-tests.factor +++ b/core/io/files/files-tests.factor @@ -245,6 +245,15 @@ CONSTANT: pt-array-1 ] with-file-reader ] must-fail +[ ] [ + "resource:misc/icons/Factor_48x48.png" binary [ + 44 read drop + tell-input 44 assert= + -44 seek-relative seek-input + tell-input 0 assert= + ] with-file-reader +] unit-test + [ "non-string-error" unique-file ascii [ { } write