source: to-imperative/trunk/runtime/rf_short_int.cc @ 740

Last change on this file since 740 was 740, checked in by luba, 18 years ago
  • create_expr(Expr&, int) method is modified to process terms of type word
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.8 KB
Line 
1// $Source$
2// $Revision: 740 $
3// $Date: 2003-05-21 08:42:22 +0000 (Wed, 21 May 2003) $
4// $Author: luba $
5
6#include "rf_short_int.ih"
7#include "rf_types.ih"
8#include "rf_expr.ih"
9#include "rf_char.ih"
10#include "rf_word.ih"
11
12namespace rftype
13{
14
15unsigned ShortInt::compute_max_len ()
16{
17  intptr_t i   = INTPTR_MAX / 10000;
18  unsigned len = 4;
19  for ( ; i; i /= 10) len++;
20  return len;
21}
22
23const unsigned ShortInt::max_len = compute_max_len();
24
25Expr ShortInt::create_expr (intptr_t _n)
26{
27  Expr e = Term::create_expr(1);
28  new(e.get_first()) ShortInt(_n);
29  return e;
30}
31
32
33Expr ShortInt::create_expr (Expr& _expr, int _flag)
34{
35  Term* p = _expr.get_first();
36  Term* q = _expr.get_last();
37  int d = 0;
38  intptr_t n = 0;
39
40  if (p->get_type() == type_short_int) {
41    n = ((ShortInt*)p)->to_int();
42    if (n < 0) {
43      n = -n;
44      d = -1;
45      _flag = -1;
46    }
47    else {
48      _flag = 1;
49      d = 1;
50    }
51  }
52  if (p->get_type() == type_word) {
53    d = 0;
54  }
55  if (p->get_type() == type_char) {
56    d = _flag;
57  }
58
59  for (p += _flag * d; p < q; p++) {
60    if (p->get_type() == type_short_int) {
61      intptr_t n_temp = ((ShortInt*)p)->to_int() / 10;
62      intptr_t k      = 10;
63     
64      while (n_temp) {
65        n_temp /= 10;
66        k *= 10;
67      }
68
69      n = n * k + ((ShortInt*)p)->to_int();
70    }
71    if (p->get_type() == type_char) {
72      n = n * 10 + (((Char*)p)->to_wchar_t() - 48);
73    }
74    if (p->get_type() == type_word) {
75      size_t len = ((Word*)p)->get_len();
76      size_t n_word = 0;
77      int k_word = 1;
78      int deg = 0;
79      if (_flag ) deg = len - 2;
80      else deg = len - 1;
81     
82      for (int i = 0; i < deg; i++) 
83        k_word *= 10;           
84
85      Word::NumIterator i = *((Word*)p);
86
87      for (; i.in_bounds(); i++){       
88        //        n_word += ((*i)-48) * k_word;
89        n_word += (*i) * k_word;
90        k_word /= 10;
91      } 
92      n += n_word;                 
93    }
94  }
95  if (-1 == _flag) n = -n;
96
97  Expr e = Term::create_expr(1);
98  new(e.get_first()) ShortInt(n);
99  return e;
100}
101
102uintptr_t ShortInt::ctor (uintptr_t _data)
103{
104  return _data;
105}
106
107void ShortInt::dtor (uintptr_t)
108{ }
109
110int ShortInt::compare (uintptr_t _data1, uintptr_t _data2)
111{
112  if (_data1 == _data2) return 0;
113  else if (_data1 < _data2) return -1;
114  else return 1;
115}
116
117uint32_t ShortInt::hash (uintptr_t _data)
118{
119  return _data; 
120}
121
122pxx::WString ShortInt::to_string (uintptr_t _data) {
123  intptr_t n = _data;
124  int flag = 0;
125   
126  if (n < 0) {
127    n = -n;
128    flag = -1;
129  }
130
131  wchar_t str[max_len + 1];
132  int i = max_len;
133
134  if (!n) {
135    str[i] = 48;
136  }
137  else {
138    while (n) {
139      str[i] = n % 10 + 48;
140      n /= 10;
141      i--; 
142    };
143
144    if (flag) {
145      str[i] = '-'; 
146    }
147    else i++;
148  }
149  return pxx::WString(&str[i], max_len + 1 - i);
150 
151}
152
153short_type_funcs_t ShortInt::funcs = {
154  ShortInt::ctor,
155  ShortInt::dtor,
156  null, // ShortInt::eq,
157  ShortInt::compare,
158  ShortInt::hash,
159  ShortInt::to_string
160};
161
162}
163
Note: See TracBrowser for help on using the repository browser.