source: to-imperative/trunk/java/refal/refal/plus/Stream.rf @ 3614

Last change on this file since 3614 was 3614, checked in by yura, 13 years ago
  • Refal Library on Refal+ is coped to java - folder java contais both java and refal.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.6 KB
Line 
1// $Id: Stream.rf 3614 2008-03-29 22:03:50Z yura $
2
3//$module Stream : IStream;
4
5$use Access Apply Box Class Compare Error StdIO;
6
7//** $func Stream s.func e.args = stream;
8
9Stream s.func e.args, {
10  # <IsFunc s.func> =
11    <Lib_Error (Stream Stream) "Arg 1 is not a Function">, $fail;
12  <Box () (s.func e.args)>;
13};
14
15
16$func? Read_Expr s.box = v.expr;
17
18Read_Expr s.box =
19  <Get s.box> : v.expr,
20  <Store s.box /*empty*/>,
21  v.expr;
22
23//** $func Expr-Open expr = stream;
24
25Expr_Open expr =
26  <Box expr> :: s.box,
27  <Stream &Read_Expr s.box>;
28
29
30//** $func File-Open  e.filename = stream;
31//** $func File-Close stream     = ;
32
33File_Open e.filename =
34  <Channel> :: s.channel,
35  <PrimOpenFile s.channel e.filename R>,
36  <Stream &PrimRead s.channel &ReadChunkSize>;
37
38File_Close stream, {
39  <Get stream> : (e.buf) (s.func e.args), {
40    e.args : s.ch e.rest, <IsChannel s.ch> =
41      <PrimCloseChannel s.ch>;
42    <Lib_Error (Stream "File_Close") "Arg 1 is not a Streamed File"> = $fail;
43  };
44  <Lib_Error (Stream "File_Close") "Arg 1 is not a Stream"> = $fail;
45};
46
47
48//** $func StdIStream = stream;
49
50$box StdIStream_Box;
51
52StdIStream, {
53  <Get &StdIStream_Box> : stream = stream;
54  <Stream &PrimRead &StdIn 1> :: stream,
55    <Store &StdIStream_Box stream>,
56    stream;
57};
58
59
60//** $func? Getc   stream      = term;
61
62Getc stream = <Gets stream 1> : term, term;
63
64
65//** $func? Gets   stream s.n  = expr;
66
67Gets stream s.n, {
68  <Get stream> : (e.buf) (s.func e.args) =
69    e.buf $iter {
70      e.buf <Apply s.func e.args>;
71      <Store stream (e.buf) (s.func e.args)> = $fail;
72    } :: e.buf,
73    <Ge (<Length e.buf>) (s.n)> =
74    <Store stream (<Middle s.n 0 e.buf>) (s.func e.args)>,
75    <Left 0 s.n e.buf>;
76  <Lib_Error (Stream Gets) "Arg 1 is not a Stream"> = $fail;
77};
78
79
80//** $func  Ungets stream expr = ;
81
82Ungets stream expr, {
83  <Get stream> : (e.buf) (s.func e.args) =
84    <Store stream (expr e.buf) (s.func e.args)>;
85  <Lib_Error (Stream Ungets) "Arg 1 is not a Stream"> = $fail;
86};
87
88
89//** $func  Scanc  stream t1   = empty-or-t1;
90
91Scanc stream t1, {
92  <Getc stream> : {
93    t1 = t1;
94    t2 = <Ungets stream t2>;
95  };
96  /*empty*/;
97};
98
99
100//** $func Get-Delim stream t.delim = expr;
101
102Get_Delim stream t.delim, {
103  <Get stream> : (e.buf) (s.func e.args) =
104    (/*e.str*/) (e.buf) $iter {
105      e.buf : e1 t.delim e2 =
106        (e.str e1 t.delim) (e2) Stop;
107      (e.str e.buf) (<Apply s.func e.args>);
108      (e.str e.buf) () Stop;
109    } :: (e.str) (e.buf) e.Isstop,
110    e.Isstop : Stop =
111    <Store stream (e.buf) (s.func e.args)>,
112    e.str;
113  <Lib_Error (Stream "Get_Delim") "Arg 1 is not a Stream"> = $fail;
114};
115
116
117//** $func Get-Line stream = expr;
118
119//Get-Line stream = <Get-Delim stream '\n'>;
120
121$func? Not_EOL t1 = ;
122Not_EOL t1 = # t1 : \{ '\n'; '\r'; };
123
124Get_Line stream =
125  <Get_While stream &Not_EOL> <Scanc stream '\r'> <Scanc stream '\n'>;
126
127
128//** $func Get-While stream s.pred = expr;
129
130Get_While stream s.pred, {
131  <Get stream> : (e.buf) (s.func e.args) =
132    (/*e.str*/) (e.buf) $iter {
133      e.buf : t1 e2, {
134        <Apply s.pred t1> : e = (e.str t1) (e2);
135        (e.str) (e.buf) Stop;
136      };
137      (e.str) (<Apply s.func e.args>);
138      (e.str) (e.buf) Stop;
139    } :: (e.str) (e.buf) e.Isstop,
140    e.Isstop : Stop =
141    <Store stream (e.buf) (s.func e.args)>,
142    e.str;
143  <Lib_Error (Stream "Get_While") "Arg 1 is not a Stream"> = $fail;
144};
145
146
147//** $func? End-of-Stream? stream = ;
148
149IsEnd_of_Stream stream, {
150  <Get stream> : (e.buf) (s.func e.args) =
151    {
152      e.buf $iter
153        <Apply s.func e.args>
154      :: e.buf,
155        e.buf : v =
156        <Store stream (e.buf) (s.func e.args)>,
157        $fail;
158      /*We are at the end of the stream*/;
159    };
160  <Lib_Error (Stream "IsEnd_of_Stream") "Arg 1 is not a Stream"> = $fail;
161};
162
Note: See TracBrowser for help on using the repository browser.