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

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