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

Last change on this file since 701 was 701, checked in by luba, 18 years ago
  • length of the number is compared with maximum length of UINTPTR_MAX now
  • 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: 701 $
3// $Date: 2003-04-30 09:52:42 +0000 (Wed, 30 Apr 2003) $
4// $Author: luba $
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  uint MAX_LEN = 10;
20  uintptr_t len = 0;
21  int flag = 0;
22
23  Term* t = e_Exp.get_first();
24
25  if (t->get_type() == type_char) {
26    if (((Char*)t)->to_wchar_t() == '-')
27      flag = -1;
28
29    if (((Char*)t)->to_wchar_t() == '+')
30      flag = 1;
31  };
32
33  //добавить для Word проверку первого символа
34
35  if (flag || t->get_type() == type_short_int)
36    t++;
37
38  for (; t < e_Exp.get_last(); t++) {
39    if (t->get_type() == type_char && ((Char*)t)->is_digit()) 
40      if (len >= MAX_LEN - 1)
41        RF_LIB_ERROR("Argument too large for conversion");
42      else
43        len += 1;
44    else
45      if (t->get_type() == type_short_int) {
46        if (((ShortInt*)t)->to_int() < 0)
47          retfail;
48        else
49          if (len >= MAX_LEN - ShortInt::get_char_len(((ShortInt*)t)->to_int()))
50            RF_LIB_ERROR("Argument too large for conversion");
51          else
52            len += ShortInt::get_char_len(((ShortInt*)t)->to_int()); 
53      }
54#if 0
55    else
56    if (t->get_type() == type_word && ((Word*)t)->is_number())
57      if (len >= MAX_LEN - длина слова ))
58        RF_LIB_ERROR("Argument too large for conversion");
59      else
60        len += ((Word*)t)->get_len();
61#endif
62    else
63      retfail;
64  };
65  s_Int = ShortInt::create_expr(e_Exp, flag);
66
67RF_END
68}
69}
70 
Note: See TracBrowser for help on using the repository browser.