source: to-imperative/trunk/library/StdIO/StdIO.cc @ 1897

Last change on this file since 1897 was 1897, checked in by orlov, 15 years ago
  • Standard library functions always create Integer and never Int32.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.1 KB
Line 
1#include <rf_core.hh>
2#include <refal/Arithm.hh>
3#include "StdIO.hh"
4#include <refal/Class.hh>
5#include <refal/Convert.hh>
6#include <refal/Compare.hh>
7#include <refal/Table.hh>
8#include "../Stream/StreamErr.hh"
9#include "../Stream/Stream.hh"
10#include "../Lexer/Lexer.hh"
11#include <refal/Error.hh>
12#include <refal/Box.hh>
13
14namespace refal
15{
16
17using namespace rfrt;
18
19namespace StdIO
20{
21
22//Expr StdIn;
23//
24//Expr StdOut;
25//
26//Expr StdErr;
27
28Expr Read_m_Chunk_m_Size;
29
30static Expr Buffers;
31
32RF_DECL (Read_m_Main);
33
34RF_DECL (Print);
35
36RF_DECL (Write);
37
38RF_DECL (Print_e_);
39
40RF_DECL (Write_e_);
41
42RF_DECL (PrintLN);
43
44RF_DECL (PrintLN_e_);
45
46RF_DECL (WriteLN);
47
48RF_DECL (Prim_m_Read);
49
50RF_DECL (WriteLN_e_);
51
52RF_DECL (Prim_m_Open_m_File);
53
54RF_DECL (Prim_m_Close_m_Channel);
55
56RF_DECL (Parse_m_File_m_Name);
57
58RF_DECL (Erase_m_File);
59
60RF_DECL (Channel);
61
62//RF_DECL (Prim_m_Read__0);
63
64static Expr _c_0;
65
66static Expr _c_1;
67
68static Expr _c_2;
69
70static Expr _c_3;
71
72static Expr _c_4;
73
74static Expr _c_5;
75
76static Expr _c_6;
77
78static Expr _c_7;
79
80static Expr _c_8;
81
82static Expr _c_9;
83
84static Expr _c_10;
85
86static Expr _c_11;
87
88static Expr _c_12;
89
90static Expr _c_13;
91
92RF_FUNC (Open_m_File, (RF_ARG _vs_channel, _ve_file, _vs_mode;;), RF_VOID)
93  {
94    {
95      {
96        if (!RF_CALL (Class::Channel_q_, _vs_channel, /*void*/))
97        {
98          goto _negation1;
99        }
100        goto _block1__branch1;
101      }
102    _negation1: {}
103      RF_TAILCALL (Error::Lib_m_Error, (_c_0, _c_1), /*void*/);
104      goto _block1;
105    }
106  _block1__branch1: {}
107    {
108      {
109        if (!RF_CALL (Class::Word_q_, _vs_mode, /*void*/))
110        {
111          goto _negation2;
112        }
113        goto _block1__branch2;
114      }
115    _negation2: {}
116      RF_TAILCALL (Error::Lib_m_Error, (_c_0, _c_2), /*void*/);
117      goto _block1;
118    }
119  _block1__branch2: {}
120    if (!RF_CALL (Prim_m_Open_m_File, (_vs_channel, _ve_file, _vs_mode), /*void*/))
121    {
122      RF_RETFAIL;
123    }
124    Expr _v_Stream1;
125    RF_CALL (Stream::Stream, (_c_3, (_vs_channel + Read_m_Chunk_m_Size)), _v_Stream1);
126    RF_TAILCALL (Table::Bind, (Buffers, _vs_channel, _v_Stream1), /*void*/);
127  }
128_block1: {}
129RF_END
130
131RF_FUNC (Close_m_Channel, (RF_ARG _vs_channel;;), RF_VOID)
132  {
133    {
134      {
135        if (!RF_CALL (Class::Channel_q_, _vs_channel, /*void*/))
136        {
137          goto _negation1;
138        }
139        goto _block1__branch1;
140      }
141    _negation1: {}
142      RF_TAILCALL (Error::Lib_m_Error, (_c_4, _c_1), /*void*/);
143      goto _block1;
144    }
145  _block1__branch1: {}
146    RF_CALL (Prim_m_Close_m_Channel, _vs_channel, /*void*/);
147    RF_TAILCALL (Table::Unbind, (Buffers, _vs_channel), /*void*/);
148  }
149_block1: {}
150RF_END
151
152RF_FUNC (EOF_q_, (RF_ARG _vs_channel;;), RF_VOID)
153  {
154    {
155      Expr _v_Lookup1;
156      if (!RF_CALL (Table::Lookup, (Buffers, _vs_channel), _v_Lookup1))
157      {
158        goto _block1__branch1;
159      }
160      if ((_v_Lookup1.get_len () != 1))
161      {
162        goto _block1__branch1;
163      }
164      if (!_v_Lookup1.symbol_at (0))
165      {
166        goto _block1__branch1;
167      }
168      Expr _vs_tream (_v_Lookup1, 0, 1);
169      RF_TAILCALL (Stream::End_m_of_m_Stream_q_, _vs_tream, /*void*/);
170      goto _block1;
171    }
172  _block1__branch1: {}
173    RF_TAILCALL (Error::Lib_m_Error, (_c_5, _c_6), /*void*/);
174  }
175_block1: {}
176RF_END
177
178RF_FUNC (Read_m_Char_e_, (RF_ARG _vs_channel;;), (RF_RES _v_res1;;))
179  {
180    {
181      Expr _v_Lookup1;
182      if (!RF_CALL (Table::Lookup, (Buffers, _vs_channel), _v_Lookup1))
183      {
184        goto _block1__branch1;
185      }
186      if ((_v_Lookup1.get_len () != 1))
187      {
188        goto _block1__branch1;
189      }
190      if (!_v_Lookup1.symbol_at (0))
191      {
192        goto _block1__branch1;
193      }
194      Expr _vs_tream (_v_Lookup1, 0, 1);
195      Expr _v_Getc1;
196      if (!RF_CALL (Stream::Getc, _vs_tream, _v_Getc1))
197      {
198        RF_RETFAIL;
199      }
200      if (!_v_Getc1.symbol_at (0))
201      {
202        RF_RETFAIL;
203      }
204      Expr _vs_char (_v_Getc1, 0, 1);
205      _v_res1 = _vs_char;
206      goto _block1;
207    }
208  _block1__branch1: {}
209    RF_CALL (Error::Lib_m_Error, (_c_7, _c_6), /*void*/);
210    RF_RETFAIL;
211  }
212_block1: {}
213RF_END
214
215RF_FUNC (Read_m_Char, RF_VOID, (RF_RES _v_res1;;))
216  RF_TAILCALL (Read_m_Char_e_, StdIn, _v_res1);
217RF_END
218
219RF_FUNC (Read_m_Line_e_, (RF_ARG _vs_channel;;), (RF_RES _v_res1;;))
220  {
221    {
222      Expr _v_Lookup1;
223      if (!RF_CALL (Table::Lookup, (Buffers, _vs_channel), _v_Lookup1))
224      {
225        goto _block1__branch1;
226      }
227      if ((_v_Lookup1.get_len () != 1))
228      {
229        goto _block1__branch1;
230      }
231      if (!_v_Lookup1.symbol_at (0))
232      {
233        goto _block1__branch1;
234      }
235      Expr _vs_tream (_v_Lookup1, 0, 1);
236      Expr _v_Get_m_Line1;
237      RF_CALL (Stream::Get_m_Line, _vs_tream, _v_Get_m_Line1);
238      {
239        {
240          uintptr_t _v_len1 = _v_Get_m_Line1.get_len ();
241          uintptr_t _v_len2 = 1;
242          if ((_v_len1 < _v_len2))
243          {
244            goto _block2__branch1;
245          }
246          uintptr_t _v_len__line = (_v_len1 - _v_len2);
247          if (!_c_8.term_eq (_v_Get_m_Line1, _v_len__line))
248          {
249            goto _block2__branch1;
250          }
251          Expr _ve_line (_v_Get_m_Line1, 0, _v_len__line);
252          _v_res1 = _ve_line;
253          goto _block2;
254        }
255      _block2__branch1: {}
256        uintptr_t _v_len3 = _v_Get_m_Line1.get_len ();
257        uintptr_t _v_len4 = 0;
258        if ((_v_len3 < (_v_len4 + 1)))
259        {
260          RF_RETFAIL;
261        }
262        uintptr_t _v_len__line2 = (_v_len3 - _v_len4);
263        Expr _vv_line (_v_Get_m_Line1, 0, _v_len__line2);
264        _v_res1 = _vv_line;
265      }
266    _block2: {}
267      goto _block1;
268    }
269  _block1__branch1: {}
270    RF_CALL (Error::Lib_m_Error, (_c_9, _c_6), /*void*/);
271    RF_RETFAIL;
272  }
273_block1: {}
274RF_END
275
276RF_FUNC (Read_m_Line, RF_VOID, (RF_RES _v_res1;;))
277  RF_TAILCALL (Read_m_Line_e_, StdIn, _v_res1);
278RF_END
279
280RF_FUNC (Read_e_, (RF_ARG _vs_channel;;), (RF_RES _v_res1;;))
281  RF_TAILCALL (Read_m_Main, (_c_10, _vs_channel), _v_res1);
282RF_END
283
284RF_FUNC (Read, RF_VOID, (RF_RES _v_res1;;))
285  RF_TAILCALL (Read_m_Main, (_c_11, StdIn), _v_res1);
286RF_END
287
288RF_FUNC (Read_m_Main, (RF_ARG _vs_fname, _vs_channel;;), (RF_RES _v_res1;;))
289  {
290    {
291      Expr _v_Lookup1;
292      if (!RF_CALL (Table::Lookup, (Buffers, _vs_channel), _v_Lookup1))
293      {
294        goto _block1__branch1;
295      }
296      if ((_v_Lookup1.get_len () != 1))
297      {
298        goto _block1__branch1;
299      }
300      if (!_v_Lookup1.symbol_at (0))
301      {
302        goto _block1__branch1;
303      }
304      Expr _vs_tream (_v_Lookup1, 0, 1);
305      Expr _ve_result;
306      {
307        {
308          if (!RF_CALL (Lexer::Read_m_Term_q_, _vs_tream, _ve_result))
309          {
310            goto _block2__branch1;
311          }
312          goto _block2;
313        }
314      _block2__branch1: {}
315        _ve_result = empty;
316      }
317    _block2: {}
318      {
319        {
320          Expr _v_Errors1;
321          RF_CALL (StreamErr::Errors, /*void*/, _v_Errors1);
322          uintptr_t _v_len1 = _v_Errors1.get_len ();
323          uintptr_t _v_len2 = 1;
324          if ((_v_len1 < _v_len2))
325          {
326            goto _block3__branch1;
327          }
328          uintptr_t _v_len___e__e_tmp_m_StdIOrf_m_84_m_46 = (_v_len1 - _v_len2);
329          if (_v_Errors1.symbol_at (0))
330          {
331            goto _block3__branch1;
332          }
333          Expr _v_deref__Errors1 (_v_Errors1, 0);
334          if ((_v_deref__Errors1.get_len () != 3))
335          {
336            goto _block3__branch1;
337          }
338          if (_v_deref__Errors1.symbol_at (2))
339          {
340            goto _block3__branch1;
341          }
342          Expr _v_deref__deref__Errors1 (_v_deref__Errors1, 2);
343          uintptr_t _v_len3 = _v_deref__deref__Errors1.get_len ();
344          uintptr_t _v_len4 = 0;
345          if ((_v_len3 < _v_len4))
346          {
347            goto _block3__branch1;
348          }
349          uintptr_t _v_len__message = (_v_len3 - _v_len4);
350          Expr _ve__e__e_tmp_m_StdIOrf_m_84_m_46 (_v_Errors1, 1, _v_len___e__e_tmp_m_StdIOrf_m_84_m_46);
351          Expr _vt_name (_v_deref__Errors1, 0, 1);
352          Expr _vt_pos (_v_deref__Errors1, 1, 1);
353          Expr _ve_message (_v_deref__deref__Errors1, 0, _v_len__message);
354          RF_CALL (Error::Lib_m_Error, ((_c_12 + _vs_fname), _ve_message), /*void*/);
355          RF_RETFAIL;
356          goto _block3;
357        }
358      _block3__branch1: {}
359      }
360    _block3: {}
361      if ((_ve_result.get_len () != 1))
362      {
363        RF_RETFAIL;
364      }
365      Expr _vt_erm (_ve_result, 0, 1);
366      _v_res1 = _vt_erm;
367      goto _block1;
368    }
369  _block1__branch1: {}
370    RF_CALL (Error::Lib_m_Error, ((_c_12 + _vs_fname), _c_6), /*void*/);
371    RF_RETFAIL;
372  }
373_block1: {}
374RF_END
375
376RF_FUNC (Prim_m_Read__0, (RF_ARG _v_arg1;;), (RF_RES _v_res1;;))
377  if ((_v_arg1.get_len () != 2))
378  {
379    RF_ERROR (_c_13);
380  }
381  if (!_v_arg1.symbol_at (0))
382  {
383    RF_ERROR (_c_13);
384  }
385  if (!_v_arg1.symbol_at (1))
386  {
387    RF_ERROR (_c_13);
388  }
389  Expr _v_stub1 (_v_arg1, 0, 1);
390  Expr _v_stub2 (_v_arg1, 1, 1);
391  RF_TAILCALL (Prim_m_Read, (_v_stub1, _v_stub2), _v_res1);
392RF_END
393
394}
395
396namespace StdIO
397{
398
399static void init_ ()
400{
401//  StdIn = new rftype::Channel ();
402//  StdOut = new rftype::Channel ();
403//  StdErr = new rftype::Channel ();
404  Read_m_Chunk_m_Size = Integer::create_expr ("64");
405  Buffers = new rftype::Table ();
406  _c_0 = Word::create_expr ("StdIO") + Word::create_expr ("Open-File");
407  _c_1 = Word::create_expr ("Arg 1 is not a Channel");
408  _c_2 = Word::create_expr ("Arg 3 is not a Word");
409  _c_3 = Expr::create_sym<Func> (Prim_m_Read__0);
410  _c_4 = Word::create_expr ("StdIO") + Word::create_expr ("Close-Channel");
411  _c_5 = Word::create_expr ("StdIO") + Word::create_expr ("EOF?");
412  _c_6 = Word::create_expr ("Channel is not open");
413  _c_7 = Word::create_expr ("StdIO") + Word::create_expr ("Read-Char!");
414  _c_8 = Char::create_expr ("\n");
415  _c_9 = Word::create_expr ("StdIO") + Word::create_expr ("Read-Line!");
416  _c_10 = Word::create_expr ("Read!");
417  _c_11 = Word::create_expr ("Read");
418  _c_12 = Expr (_c_5, 0, 1);
419  _c_13 = Word::create_expr ("Apply") + Word::create_expr ("Apply") + Word::create_expr ("Unexpected fail");
420}
421
422static AtStart init_registrator_ (&init_);
423
424static void init_StdIn_ ()
425{
426  Expr _v_Stream1;
427  RF_CALL (Stream::Stream, (_c_3, (StdIn + Expr::create<Integer>(1))), _v_Stream1);
428  RF_CALL (Table::Bind, (Buffers, StdIn, _v_Stream1), /*void*/);
429}
430
431static rfrt::InitStdIn init_StdIn_registrator_ (init_StdIn_);
432
433}
434
435}
Note: See TracBrowser for help on using the repository browser.