1/*
2 * Copyright (c) 1999
3 * Silicon Graphics Computer Systems, Inc.
4 *
5 * Copyright (c) 1999
6 * Boris Fomitchev
7 *
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
10 *
11 * Permission to use or copy this software for any purpose is hereby granted
12 * without fee, provided the above notices are retained on all copies.
13 * Permission to modify the code and to distribute modified code is granted,
14 * provided the above notices are retained, and a notice that the code was
15 * modified is included with the above copyright notice.
16 *
17 */
18// WARNING: This is an internal header file, included by other C++
19// standard library headers.  You should not attempt to use this header
20// file directly.
21
22#ifndef _STLP_INTERNAL_CTYPE_H
23#define _STLP_INTERNAL_CTYPE_H
24
25#ifndef _STLP_C_LOCALE_H
26#  include <stl/c_locale.h>
27#endif
28
29#ifndef _STLP_INTERNAL_LOCALE_H
30#  include <stl/_locale.h>
31#endif
32
33#ifndef _STLP_INTERNAL_ALGOBASE_H
34#  include <stl/_algobase.h>
35#endif
36
37_STLP_BEGIN_NAMESPACE
38
39class _STLP_CLASS_DECLSPEC ctype_base {
40public:
41  enum mask {
42    space   = _Locale_SPACE,
43    print   = _Locale_PRINT,
44    cntrl   = _Locale_CNTRL,
45    upper   = _Locale_UPPER,
46    lower   = _Locale_LOWER,
47    alpha   = _Locale_ALPHA,
48    digit   = _Locale_DIGIT,
49    punct   = _Locale_PUNCT,
50    xdigit  = _Locale_XDIGIT,
51    alnum   = alpha | digit,
52    graph   = alnum | punct
53  };
54};
55
56// ctype<> template
57
58template <class charT> class ctype {};
59template <class charT> class ctype_byname {};
60
61//ctype specializations
62
63_STLP_TEMPLATE_NULL
64class _STLP_CLASS_DECLSPEC ctype<char> : public locale::facet, public ctype_base {
65#ifndef _STLP_NO_WCHAR_T
66#  ifdef _STLP_MSVC
67    typedef ctype<wchar_t> _Wctype;
68    friend _Wctype;
69#  else
70    friend class ctype<wchar_t>;
71#  endif
72#endif
73public:
74
75  typedef char char_type;
76
77  explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
78  bool is(mask __m, char __c) const
79  { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }
80
81  const char* is(const char* __low, const char* __high, mask* __vec) const {
82    for (const char* __p = __low;__p != __high; ++__p, ++__vec) {
83      *__vec = _M_ctype_table[(unsigned char)*__p];
84    }
85    return __high;
86  }
87
88  const char* scan_is(mask __m, const char* __low, const char* __high) const;
89  const char* scan_not(mask __m, const char* __low, const char* __high) const;
90
91  char        (toupper)(char __c) const { return do_toupper(__c); }
92  const char* (toupper)(char* __low, const char* __high) const {
93    return do_toupper(__low, __high);
94  }
95
96  char        (tolower)(char __c) const { return do_tolower(__c); }
97  const char* (tolower)(char* __low, const char* __high) const {
98    return do_tolower(__low, __high);
99  }
100
101  char        widen(char __c) const { return do_widen(__c); }
102  const char* widen(const char* __low, const char* __high, char* __to) const {
103    return do_widen(__low, __high, __to);
104  }
105
106  char        narrow(char __c, char __dfault) const {
107    return do_narrow(__c, __dfault);
108  }
109  const char* narrow(const char* __low, const char* __high,
110                     char __dfault, char* __to) const {
111    return do_narrow(__low, __high, __dfault, __to);
112  }
113
114  static _STLP_STATIC_DECLSPEC locale::id id;
115  _STLP_STATIC_CONSTANT(size_t, table_size = 256);
116
117protected:
118  const mask* table() const _STLP_NOTHROW { return _M_ctype_table; }
119  static const mask* _STLP_CALL classic_table() _STLP_NOTHROW;
120
121  ~ctype();
122
123  virtual char        do_toupper(char __c) const;
124  virtual char        do_tolower(char __c) const;
125  virtual const char* do_toupper(char* __low, const char* __high) const;
126  virtual const char* do_tolower(char* __low, const char* __high) const;
127  virtual char        do_widen(char __c) const;
128  virtual const char* do_widen(const char* __low, const char* __high,
129                               char* __to) const;
130  virtual char        do_narrow(char __c, char /* dfault */ ) const;
131  virtual const char* do_narrow(const char* __low, const char* __high,
132                                char /* dfault */, char* __to) const;
133private:
134  struct _Is_mask {
135    mask __m;
136    _Is_mask(mask __x): __m(__x) {}
137   bool operator()(char __c) {return (__m & (unsigned char) __c) != 0;}
138  };
139
140protected:
141  const mask* _M_ctype_table;
142private:
143  bool _M_delete;
144};
145
146_STLP_TEMPLATE_NULL
147class _STLP_CLASS_DECLSPEC ctype_byname<char>: public ctype<char> {
148  friend class _Locale_impl;
149public:
150  explicit ctype_byname(const char*, size_t = 0);
151  ~ctype_byname();
152
153  virtual char        do_toupper(char __c) const;
154  virtual char        do_tolower(char __c) const;
155
156  virtual const char* do_toupper(char*, const char*) const;
157  virtual const char* do_tolower(char*, const char*) const;
158
159private:
160  ctype_byname(_Locale_ctype* __ctype)
161    : _M_ctype(__ctype)
162  { _M_init(); }
163
164  void _M_init();
165
166  //explicitely defined as private to avoid warnings:
167  typedef ctype_byname<char> _Self;
168  ctype_byname(_Self const&);
169  _Self& operator = (_Self const&);
170
171  mask _M_byname_table[table_size];
172  _Locale_ctype* _M_ctype;
173};
174
175#  ifndef _STLP_NO_WCHAR_T
176_STLP_TEMPLATE_NULL
177class _STLP_CLASS_DECLSPEC ctype<wchar_t> : public locale::facet, public ctype_base {
178public:
179  typedef wchar_t char_type;
180
181  explicit ctype(size_t __refs = 0) : locale::facet(__refs) {}
182
183  bool is(mask __m, wchar_t __c) const
184    { return do_is(__m, __c); }
185
186  const wchar_t* is(const wchar_t* __low, const wchar_t* __high,
187                    mask* __vec) const
188    { return do_is(__low, __high, __vec); }
189
190  const wchar_t* scan_is(mask __m,
191                         const wchar_t* __low, const wchar_t* __high) const
192    { return do_scan_is(__m, __low, __high); }
193
194  const wchar_t* scan_not (mask __m,
195                           const wchar_t* __low, const wchar_t* __high) const
196    { return do_scan_not(__m, __low, __high); }
197
198  wchar_t (toupper)(wchar_t __c) const { return do_toupper(__c); }
199  const wchar_t* (toupper)(wchar_t* __low, const wchar_t* __high) const
200    { return do_toupper(__low, __high); }
201
202  wchar_t (tolower)(wchar_t __c) const { return do_tolower(__c); }
203  const wchar_t* (tolower)(wchar_t* __low, const wchar_t* __high) const
204    { return do_tolower(__low, __high); }
205
206  wchar_t widen(char __c) const { return do_widen(__c); }
207  const char* widen(const char* __low, const char* __high,
208                    wchar_t* __to) const
209    { return do_widen(__low, __high, __to); }
210
211  char narrow(wchar_t __c, char __dfault) const
212    { return do_narrow(__c, __dfault); }
213  const wchar_t* narrow(const wchar_t* __low, const wchar_t* __high,
214                        char __dfault, char* __to) const
215    { return do_narrow(__low, __high, __dfault, __to); }
216
217  static _STLP_STATIC_DECLSPEC locale::id id;
218
219protected:
220  ~ctype();
221
222  virtual bool           do_is(mask __m, wchar_t __c) const;
223  virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
224  virtual const wchar_t* do_scan_is(mask,
225                                    const wchar_t*, const wchar_t*) const;
226  virtual const wchar_t* do_scan_not(mask,
227                                     const wchar_t*, const wchar_t*) const;
228  virtual wchar_t do_toupper(wchar_t __c) const;
229  virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
230  virtual wchar_t do_tolower(wchar_t c) const;
231  virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
232  virtual wchar_t do_widen(char c) const;
233  virtual const char* do_widen(const char*, const char*, wchar_t*) const;
234  virtual char  do_narrow(wchar_t __c, char __dfault) const;
235  virtual const wchar_t* do_narrow(const wchar_t*, const wchar_t*,
236                                   char, char*) const;
237};
238
239_STLP_TEMPLATE_NULL
240class _STLP_CLASS_DECLSPEC ctype_byname<wchar_t>: public ctype<wchar_t> {
241  friend class _Locale_impl;
242public:
243  explicit ctype_byname(const char* __name, size_t __refs = 0);
244
245protected:
246  ~ctype_byname();
247
248  virtual bool           do_is(mask __m, wchar_t __c) const;
249  virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
250  virtual const wchar_t* do_scan_is(mask,
251                                    const wchar_t*, const wchar_t*) const;
252  virtual const wchar_t* do_scan_not(mask,
253                                     const wchar_t*, const wchar_t*) const;
254  virtual wchar_t do_toupper(wchar_t __c) const;
255  virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
256  virtual wchar_t do_tolower(wchar_t c) const;
257  virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
258
259private:
260  ctype_byname(_Locale_ctype* __ctype)
261    : _M_ctype(__ctype) {}
262
263  //explicitely defined as private to avoid warnings:
264  typedef ctype_byname<wchar_t> _Self;
265  ctype_byname(_Self const&);
266  _Self& operator = (_Self const&);
267
268  _Locale_ctype* _M_ctype;
269};
270
271#  endif /* WCHAR_T */
272
273_STLP_END_NAMESPACE
274
275#endif /* _STLP_INTERNAL_CTYPE_H */
276
277// Local Variables:
278// mode:C++
279// End:
280
281