source: to-imperative/trunk/runtime/rf_char.cc @ 781

Last change on this file since 781 was 781, checked in by pooh, 18 years ago
  • Added ability to create flat expressions. Fixed Char::create_expr().
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.1 KB
Line 
1#include "rf_expr.ih"
2#include "rf_types.ih"
3#include "rf_core.hh"
4
5namespace rftype
6{
7
8Expr Char::create_expr (const WString& _wstr)
9{
10  size_t len = _wstr.get_length();
11  const wchar_t* pstr = _wstr.get_data();
12
13  Expr  e = Term::create_flat_expr(len);
14  Term* p = e.get_first();
15
16  while (len--)
17    new(p++) Char(*pstr++);
18  return e;
19}
20
21Expr Char::create_expr (char const* _str, char const* _locale /* = null */)
22{
23  char const* saved_locale = null;
24  if (_locale != null) {
25    saved_locale = setlocale(LC_CTYPE, null);
26    setlocale(LC_CTYPE, _locale);
27  }
28  mbstate_t ps;
29  char const* s = _str;
30  size_t len = mbsrtowcs(null, &s, 0, &ps);
31  if (len == (size_t)(-1)) FATAL("Error while converting a string");
32  Expr e = Term::create_expr(len);
33  Term* p = e.get_first();
34  s = _str;
35  while (len-- > 0) {
36    wchar_t wc;
37    size_t l = mbrtowc(&wc, s, MB_CUR_MAX, &ps);
38    new(p) Char(wc);
39    p++; s += l;
40  }
41  if (_locale != null) setlocale(LC_CTYPE, saved_locale);
42  return e;
43}
44
45static Expr terms_to_chars (Term const* _p, Term const* _q)
46{
47  static const Expr lp = Char::create_expr("(");
48  static const Expr rp = Char::create_expr(")");
49
50  Expr e = empty;
51
52  for (; _p < _q; _p++)
53  {
54    if (_p->is_ref())
55      e = e + lp + terms_to_chars(_p->get_first(), _p->get_last()) + rp;
56    else
57      e = e + Char::create_expr(WString(*_p));
58  };
59
60  return e;
61}
62
63Expr Char::to_chars (const Expr& _expr)
64{
65  return terms_to_chars(_expr.get_first(), _expr.get_last());
66}
67
68Expr Char::to_lower (const Expr& _expr)
69{
70  Term* p = _expr.get_first();
71  Term* q = _expr.get_last();
72
73  Expr  e = Term::create_expr(_expr.get_len());
74  Term* r = e.get_first();
75 
76  for (; p < q; p++, r++)
77    new(r) Char(towlower(((Char*)p)->uint_data2));
78
79  return e;
80}
81
82Expr Char::to_upper (const Expr& _expr)
83{
84  Term* p = _expr.get_first();
85  Term* q = _expr.get_last();
86
87  Expr  e = Term::create_expr(_expr.get_len());
88  Term* r = e.get_first();
89 
90  for (; p < q; p++, r++)
91    new(r) Char(towupper(((Char*)p)->uint_data2));
92
93  return e;
94}
95
96Expr Char::bytes_to_chars (const Expr& _expr)
97{
98  Term* p = _expr.get_first();
99  Term* q = _expr.get_last();
100
101  Expr  e = Term::create_expr(_expr.get_len());
102  Term* r = e.get_first();
103 
104  uintptr_t temp;
105  for (; p < q; p++, r++) {
106    temp = uintptr_t(((ShortInt*)p)->to_int());
107    new(r) Char(temp);
108  };
109  return e;
110}
111
112Expr Char::chars_to_bytes (const Expr& _expr)
113{
114  Term* p = _expr.get_first();
115  Term* q = _expr.get_last();
116
117  Expr  e = Term::create_expr(_expr.get_len());
118  Term* r = e.get_first();
119  for (; p < q; p++, r++) {
120    new(r) ShortInt(((Char*)p)->uint_data2);
121  }
122  return e;
123}
124
125uintptr_t Char::ctor (uintptr_t _data)
126{
127  return _data;
128}
129
130void Char::dtor (uintptr_t)
131{}
132
133int Char::compare (uintptr_t _data1, uintptr_t _data2)
134{
135  if (_data1 == _data2) return 0;
136  else if (_data1 < _data2) return -1;
137  else return 1;
138}
139
140uint32_t Char::hash (uintptr_t _data)
141{
142  return _data;
143}
144
145pxx::WString Char::to_string (uintptr_t _data)
146{
147  wchar_t wc = _data;
148  return pxx::WString(&wc, 1);
149}
150
151short_type_funcs_t Char::funcs = {
152  Char::ctor,
153  Char::dtor,
154  null, // Char::eq,
155  Char::compare,
156  Char::hash,
157  Char::to_string
158};
159
160}
Note: See TracBrowser for help on using the repository browser.