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

Last change on this file since 835 was 835, checked in by pooh, 18 years ago
  • A notion of term class is completely removed. All term methods now depend

only on a term type.

  • 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    saved_locale = setlocale(LC_CTYPE, null);
27    setlocale(LC_CTYPE, _locale);
28  }
29  mbstate_t ps;
30  char const* s = _str;
31  size_t len = mbsrtowcs(null, &s, 0, &ps);
32  if (len == (size_t)(-1)) FATAL("Error while converting a string");
33  Expr e = Term::create_flat_expr(len);
34  Term* p = e.get_first();
35  s = _str;
36  while (len-- > 0) {
37    wchar_t wc;
38    size_t l = mbrtowc(&wc, s, MB_CUR_MAX, &ps);
39    new(p) Char(wc);
40    p++; s += l;
41  }
42  if (_locale != null) setlocale(LC_CTYPE, saved_locale);
43  return e;
44}
45
46static Expr terms_to_chars (Term const* _p, Term const* _q)
47{
48  static const Expr lp = Char::create_expr("(");
49  static const Expr rp = Char::create_expr(")");
50
51  Expr e = empty;
52
53  for (; _p < _q; _p++)
54  {
55    if (_p->is_ref())
56      e = e + lp + terms_to_chars(_p->get_first(), _p->get_last()) + rp;
57    else
58      e = e + Char::create_expr(WString(*_p));
59  };
60
61  return e;
62}
63
64Expr Char::to_chars (const Expr& _expr)
65{
66  return terms_to_chars(_expr.get_first(), _expr.get_last());
67}
68
69Expr Char::to_lower (const Expr& _expr)
70{
71  Term* p = _expr.get_first();
72  Term* q = _expr.get_last();
73
74  Expr  e = Term::create_expr(_expr.get_len());
75  Term* r = e.get_first();
76 
77  for (; p < q; p++, r++)
78    new(r) Char(towlower(((Char*)p)->uint_data2));
79
80  return e;
81}
82
83Expr Char::to_upper (const Expr& _expr)
84{
85  Term* p = _expr.get_first();
86  Term* q = _expr.get_last();
87
88  Expr  e = Term::create_expr(_expr.get_len());
89  Term* r = e.get_first();
90 
91  for (; p < q; p++, r++)
92    new(r) Char(towupper(((Char*)p)->uint_data2));
93
94  return e;
95}
96
97Expr Char::bytes_to_chars (const Expr& _expr)
98{
99  Term* p = _expr.get_first();
100  Term* q = _expr.get_last();
101
102  Expr  e = Term::create_expr(_expr.get_len());
103  Term* r = e.get_first();
104 
105  uintptr_t temp;
106  for (; p < q; p++, r++) {
107    temp = uintptr_t(((ShortInt*)p)->to_int());
108    new(r) Char(temp);
109  };
110  return e;
111}
112
113Expr Char::chars_to_bytes (const Expr& _expr)
114{
115  Term* p = _expr.get_first();
116  Term* q = _expr.get_last();
117
118  Expr  e = Term::create_expr(_expr.get_len());
119  Term* r = e.get_first();
120  for (; p < q; p++, r++) {
121    new(r) ShortInt(((Char*)p)->uint_data2);
122  }
123  return e;
124}
125
126int Char::compare (Char const* _char1, Char const* _char2)
127{
128  if (_char1->uint_data2 == _char2->uint_data2) return 0;
129  else if (_char1->uint_data2 < _char2->uint_data2) return -1;
130  else return 1;
131}
132
133uint32_t Char::hash (Char const* _char)
134{
135  return _char->uint_data2;
136}
137
138pxx::WString Char::to_string (Char const* _char)
139{
140  wchar_t wc = _char->uint_data2;
141  return pxx::WString(&wc, 1);
142}
143
144short_type_funcs_t Char::funcs = {
145  null, // Char::ctor,
146  null, // Char::dtor,
147  null, // Char::eq,
148  (int (*)(Term const*, Term const*))(Char::compare),
149  (uint32_t (*)(Term const*))(Char::hash),
150  (pxx::WString (*)(Term const*))(Char::to_string)
151};
152
153}
Note: See TracBrowser for help on using the repository browser.