]> gitweb.factorcode.org Git - factor.git/blob - library/stream.factor
55456934bc17164238e890d0bd18746297e53c91
[factor.git] / library / stream.factor
1 !:folding=indent:collapseFolds=1:
2
3 ! $Id$
4 !
5 ! Copyright (C) 2003, 2004 Slava Pestov.
6
7 ! Redistribution and use in source and binary forms, with or without
8 ! modification, are permitted provided that the following conditions are met:
9
10 ! 1. Redistributions of source code must retain the above copyright notice,
11 !    this list of conditions and the following disclaimer.
12
13 ! 2. Redistributions in binary form must reproduce the above copyright notice,
14 !    this list of conditions and the following disclaimer in the documentation
15 !    and/or other materials provided with the distribution.
16
17 ! THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 ! INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19 ! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 ! DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 ! OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 ! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 ! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 IN: streams
29 USE: errors
30 USE: kernel
31 USE: namespaces
32
33 ! Generic functions, of sorts...
34
35 : fflush ( stream -- )
36     [ "fflush" get call ] bind ;
37
38 : freadln ( stream -- string )
39     [ "freadln" get call ] bind ;
40
41 : fread# ( count stream -- string )
42     [ "fread#" get call ] bind ;
43
44 : fprint ( string stream -- )
45     [ "fprint" get call ] bind ;
46
47 : fwrite ( string stream -- )
48     [ "fwrite" get call ] bind ;
49
50 : fwrite-attr ( string stream -- )
51     #! Write an attributed string to the given stream.
52     #! The attributes are taken from the current namespace;
53     #! supported keys depend on the type of stream.
54     [ "fwrite-attr" get call ] bind ;
55
56 : fedit ( string stream -- )
57     [ "fedit" get call ] bind ;
58
59 : fclose ( stream -- )
60     [ "fclose" get call ] bind ;
61
62 : <stream> ( -- stream )
63     #! Create a stream object.
64     <namespace> [
65         ( -- string )
66         [ "freadln not implemented." throw ] "freadln" set
67         ( count -- string )
68         [ "fread# not implemented."  throw ] "fread#" set
69         ( string -- )
70         [ "fwrite not implemented."  throw ] "fwrite" set
71         ( string attrs -- )
72         [ namespace fwrite ] "fwrite-attr" set
73         ( string -- )
74         [ "fedit not implemented."   throw ] "fedit" set
75         ( -- )
76         [ ] "fflush" set
77         ( -- )
78         [ ] "fclose" set
79         ( string -- )
80         [ namespace fwrite "\n" namespace fwrite ] "fprint" set
81     ] extend ;
82
83 : <extend-stream> ( stream -- stream )
84     #! Create a stream that wraps another stream. Override some
85     #! or all of the stream words.
86     <stream> [
87         "stream" set
88         ( -- string )
89         [ "stream" get freadln ] "freadln" set
90         ( count -- string )
91         [ "stream" get fread# ] "fread#" set
92         ( string -- )
93         [ "stream" get fwrite ] "fwrite" set
94         ( string attrs -- )
95         [ "stream" get fwrite-attr ] "fwrite-attr" set
96         ( string -- )
97         [ "stream" get fedit ] "fedit" set
98         ( -- )
99         [ "stream" get fflush ] "fflush" set
100         ( -- )
101         [ "stream" get fclose ] "fclose" set
102         ( string -- )
103         [ "stream" get fprint ] "fprint" set
104     ] extend ;