1 ! Copyright (C) 2004, 2007 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays generic io kernel math namespaces sequences
5 vectors combinators splitting ;
7 TUPLE: line-reader cr ;
9 : <line-reader> ( stream -- new-stream )
10 line-reader construct-delegate ;
12 : cr+ t swap set-line-reader-cr ; inline
14 : cr- f swap set-line-reader-cr ; inline
16 : line-ends/eof ( stream str -- str ) f like swap cr- ; inline
18 : line-ends\r ( stream str -- str ) swap cr+ ; inline
20 : line-ends\n ( stream str -- str )
21 over line-reader-cr over empty? and
22 [ drop dup cr- stream-readln ] [ swap cr- ] if ; inline
24 : handle-readln ( stream str ch -- str )
26 { f [ line-ends/eof ] }
27 { CHAR: \r [ line-ends\r ] }
28 { CHAR: \n [ line-ends\n ] }
31 M: line-reader stream-readln ( stream -- str )
32 "\r\n" over delegate stream-read-until handle-readln ;
34 : fix-read ( stream string -- string )
35 "\n" ?head [ swap stream-read1 [ add ] when* ] [ nip ] if ;
37 M: line-reader stream-read
38 tuck delegate stream-read
39 over line-reader-cr [ over cr- fix-read ] [ nip ] if ;
41 : fix-read1 ( stream char -- char )
42 dup CHAR: \n = [ drop stream-read1 ] [ nip ] if ;
44 M: line-reader stream-read1 ( stream -- char )
45 dup delegate stream-read1
46 over line-reader-cr [ over cr- fix-read1 ] [ nip ] if ;