source: to-imperative/trunk/library/Convert/to_int.cc @ 723

Last change on this file since 723 was 723, checked in by orlov, 18 years ago
  • Reworked Char::to_chars() method.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 1.5 KB
Line 
1// $Source$
2// $Revision: 723 $
3// $Date: 2003-05-05 12:04:11 +0000 (Mon, 05 May 2003) $
4// $Author: orlov $
5
6#include <rf_core.hh>
7#include <rf_short_int.hh>
8
9namespace refal
10{
11
12using namespace rfrt;
13using namespace rftype;
14
15namespace Convert
16{
17
18RF_FUNC (To_m_Int, (RF_ARG e_Exp), (RF_RES s_Int))
19  uintptr_t len = 0;
20  int flag = 0;
21
22  Term* t = e_Exp.get_first();
23
24  if (t->get_type() == type_char) {
25    if (((Char*)t)->to_wchar_t() == '-')
26      flag = -1;
27
28    if (((Char*)t)->to_wchar_t() == '+')
29      flag = 1;
30  };
31
32  //добавить для Word проверку первого символа
33
34  if (flag || t->get_type() == type_short_int)
35    t++;
36
37  for (; t < e_Exp.get_last(); t++) {
38    if (t->get_type() == type_char && ((Char*)t)->is_digit()) 
39      if (len > UINTPTR_MAX - 1)
40        RF_LIB_ERROR("Argument too large for conversion");
41      else
42        len += 1;
43    else
44      if (t->get_type() == type_short_int) {
45        if (((ShortInt*)t)->to_int() < 0)
46          retfail;
47        else {
48          size_t num_len = ((ShortInt*)t)->get_char_len();
49          if (len > UINTPTR_MAX - num_len)
50            RF_LIB_ERROR("Argument too large for conversion");
51          else
52            len += num_len; 
53        }
54      }
55#if 0
56    else
57    if (t->get_type() == type_word && ((Word*)t)->is_number())
58      if (len > UINTPTR_MAX - длина слова ))
59        RF_LIB_ERROR("Argument too large for conversion");
60      else
61        len += ((Word*)t)->get_len();
62#endif
63    else
64      retfail;
65  };
66
67  if (len >= ShortInt::max_len)
68    RF_LIB_ERROR("Argument too large for conversion");
69
70  s_Int = ShortInt::create_expr(e_Exp, flag);
71
72RF_END
73}
74}
75 
Note: See TracBrowser for help on using the repository browser.