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 
39 class _STLP_CLASS_DECLSPEC ctype_base {
40 public:
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 
58 template <class charT> class ctype {};
59 template <class charT> class ctype_byname {};
60 
61 //ctype specializations
62 
63 _STLP_TEMPLATE_NULL
64 class _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
73 public:
74 
75   typedef char char_type;
76 
77   explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
is(mask __m,char __c)78   bool is(mask __m, char __c) const
79   { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }
80 
is(const char * __low,const char * __high,mask * __vec)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 
widen(char __c)101   char        widen(char __c) const { return do_widen(__c); }
widen(const char * __low,const char * __high,char * __to)102   const char* widen(const char* __low, const char* __high, char* __to) const {
103     return do_widen(__low, __high, __to);
104   }
105 
narrow(char __c,char __dfault)106   char        narrow(char __c, char __dfault) const {
107     return do_narrow(__c, __dfault);
108   }
narrow(const char * __low,const char * __high,char __dfault,char * __to)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 
117 protected:
table()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;
133 private:
134   struct _Is_mask {
135     mask __m;
_Is_mask_Is_mask136     _Is_mask(mask __x): __m(__x) {}
operator_Is_mask137    bool operator()(char __c) {return (__m & (unsigned char) __c) != 0;}
138   };
139 
140 protected:
141   const mask* _M_ctype_table;
142 private:
143   bool _M_delete;
144 };
145 
146 _STLP_TEMPLATE_NULL
147 class _STLP_CLASS_DECLSPEC ctype_byname<char>: public ctype<char> {
148   friend class _Locale_impl;
149 public:
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 
159 private:
ctype_byname(_Locale_ctype * __ctype)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
177 class _STLP_CLASS_DECLSPEC ctype<wchar_t> : public locale::facet, public ctype_base {
178 public:
179   typedef wchar_t char_type;
180 
facet(__refs)181   explicit ctype(size_t __refs = 0) : locale::facet(__refs) {}
182 
is(mask __m,wchar_t __c)183   bool is(mask __m, wchar_t __c) const
184     { return do_is(__m, __c); }
185 
is(const wchar_t * __low,const wchar_t * __high,mask * __vec)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 
scan_is(mask __m,const wchar_t * __low,const wchar_t * __high)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 
scan_not(mask __m,const wchar_t * __low,const wchar_t * __high)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 
wchar_t(toupper)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 
wchar_t(tolower)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 
widen(char __c)206   wchar_t widen(char __c) const { return do_widen(__c); }
widen(const char * __low,const char * __high,wchar_t * __to)207   const char* widen(const char* __low, const char* __high,
208                     wchar_t* __to) const
209     { return do_widen(__low, __high, __to); }
210 
narrow(wchar_t __c,char __dfault)211   char narrow(wchar_t __c, char __dfault) const
212     { return do_narrow(__c, __dfault); }
narrow(const wchar_t * __low,const wchar_t * __high,char __dfault,char * __to)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 
219 protected:
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
240 class _STLP_CLASS_DECLSPEC ctype_byname<wchar_t>: public ctype<wchar_t> {
241   friend class _Locale_impl;
242 public:
243   explicit ctype_byname(const char* __name, size_t __refs = 0);
244 
245 protected:
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 
259 private:
ctype_byname(_Locale_ctype * __ctype)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