]> gitweb.factorcode.org Git - factor.git/blob - core/io/streams/lines/lines.factor
Initial import
[factor.git] / core / io / streams / lines / lines.factor
1 ! Copyright (C) 2004, 2007 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: io.streams.lines
4 USING: arrays generic io kernel math namespaces sequences
5 vectors combinators splitting ;
6
7 TUPLE: line-reader cr ;
8
9 : <line-reader> ( stream -- new-stream )
10     line-reader construct-delegate ;
11
12 : cr+ t swap set-line-reader-cr ; inline
13
14 : cr- f swap set-line-reader-cr ; inline
15
16 : line-ends/eof ( stream str -- str ) f like swap cr- ; inline
17
18 : line-ends\r ( stream str -- str ) swap cr+ ; inline
19
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
23
24 : handle-readln ( stream str ch -- str )
25     {
26         { f [ line-ends/eof ] }
27         { CHAR: \r [ line-ends\r ] }
28         { CHAR: \n [ line-ends\n ] }
29     } case ;
30
31 M: line-reader stream-readln ( stream -- str )
32     "\r\n" over delegate stream-read-until handle-readln ;
33
34 : fix-read ( stream string -- string )
35     "\n" ?head [ swap stream-read1 [ add ] when* ] [ nip ] if ;
36
37 M: line-reader stream-read
38     tuck delegate stream-read
39     over line-reader-cr [ over cr- fix-read ] [ nip ] if ;
40
41 : fix-read1 ( stream char -- char )
42     dup CHAR: \n = [ drop stream-read1 ] [ nip ] if ;
43
44 M: line-reader stream-read1 ( stream -- char )
45     dup delegate stream-read1
46     over line-reader-cr [ over cr- fix-read1 ] [ nip ] if ;