source: to-imperative/trunk/library/Arithm/mult.cc @ 591

Last change on this file since 591 was 591, checked in by luba, 18 years ago
  • Arithm functions were rewritten
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 1.3 KB
Line 
1// $Source$
2// $Revision: 591 $
3// $Date: 2003-03-12 12:16:23 +0000 (Wed, 12 Mar 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 Arithm
16{
17
18RF_FUNC (_a_, (RF_ARG s_Int1, s_Int2), (RF_RES s_Int))
19
20  Term* p_Int1 = s_Int1.get_first(); 
21  Term* p_Int2 = s_Int2.get_first(); 
22 
23  intptr_t int1 = 0;
24  intptr_t int2 = 0;
25
26   if (p_Int1->get_type() == type_short_int)
27  {
28    int1 = ((ShortInt*)p_Int1)->to_int();
29  }
30  else
31  if (p_Int1->get_type() == type_int)
32  {
33    RF_LIB_ERROR("Invalid argument");
34  }
35  else
36  {
37    RF_LIB_ERROR("Invalid argument");
38  }
39
40  if (p_Int2->get_type() == type_short_int)
41  {
42    int2 = ((ShortInt*)p_Int2)->to_int();
43  }
44  else
45  if (p_Int2->get_type() == type_int)
46  {
47    RF_LIB_ERROR("Invalid argument");
48  }
49  else
50  {
51    RF_LIB_ERROR("Invalid argument");
52  }
53 
54 
55  if (int1 > 0) 
56  {
57    if (int2 > 0)
58    {
59      if (int1 > INTPTR_MAX / int2)
60        RF_LIB_ERROR("Size limit exceeded");
61    }
62    else
63    if (int2 < INTPTR_MIN / int1)
64      RF_LIB_ERROR("Size limit exceeded");
65  }
66  else
67  {
68  if (int2 > 0)
69  {
70    if (int1 < INTPTR_MIN / int2)
71      RF_LIB_ERROR("Size limit exceeded");
72  }
73  else
74  if (int2 && int1 < INTPTR_MAX /int2)
75    RF_LIB_ERROR("Size limit exceeded");
76  }
77
78  s_Int = ShortInt::create_expr(int1 * int2);
79
80RF_END
81}
82} 
Note: See TracBrowser for help on using the repository browser.