]> gitweb.factorcode.org Git - factor.git/blob - basis/io/streams/string/string.factor
First attempt at ui.text.pango
[factor.git] / basis / io / streams / string / string.factor
1 ! Copyright (C) 2003, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors io kernel math namespaces sequences sbufs
4 strings generic splitting continuations destructors
5 io.streams.plain io.encodings math.order growable ;
6 IN: io.streams.string
7
8 <PRIVATE
9
10 : harden-as ( seq growble-exemplar -- newseq )
11     underlying>> like ;
12
13 : growable-read-until ( growable n -- str )
14     >fixnum dupd tail-slice swap harden-as dup reverse-here ;
15
16 SINGLETON: null-encoding
17
18 M: null-encoding decode-char drop stream-read1 ;
19
20 PRIVATE>
21
22 M: growable dispose drop ;
23
24 M: growable stream-write1 push ;
25 M: growable stream-write push-all ;
26 M: growable stream-flush drop ;
27
28 : <string-writer> ( -- stream )
29     512 <sbuf> ;
30
31 : with-string-writer ( quot -- str )
32     <string-writer> swap [ output-stream get ] compose with-output-stream*
33     >string ; inline
34
35 M: growable stream-read1 [ f ] [ pop ] if-empty ;
36
37 : find-last-sep ( seq seps -- n )
38     swap [ memq? ] curry find-last drop ;
39
40 M: growable stream-read-until
41     [ find-last-sep ] keep over [
42         [ swap 1+ growable-read-until ] 2keep [ nth ] 2keep
43         set-length
44     ] [
45         [ swap drop 0 growable-read-until f like f ] keep
46         delete-all
47     ] if ;
48
49 M: growable stream-read
50     [
51         drop f
52     ] [
53         [ length swap - 0 max ] keep
54         [ swap growable-read-until ] 2keep
55         set-length
56     ] if-empty ;
57
58 M: growable stream-read-partial
59     stream-read ;
60
61 : <string-reader> ( str -- stream )
62     >sbuf dup reverse-here null-encoding <decoder> ;
63
64 : with-string-reader ( str quot -- )
65     [ <string-reader> ] dip with-input-stream ; inline
66
67 INSTANCE: growable plain-writer