Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / spirit / home / support / char_encoding / iso8859_1.hpp
1 /*=============================================================================
2     Copyright (c) 2001-2011 Hartmut Kaiser
3     Copyright (c) 2001-2011 Joel de Guzman
4
5     Distributed under the Boost Software License, Version 1.0. (See accompanying
6     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #if !defined(BOOST_SPIRIT_ISO8859_1_APRIL_26_2006_1106PM)
9 #define BOOST_SPIRIT_ISO8859_1_APRIL_26_2006_1106PM
10
11 #if defined(_MSC_VER)
12 #pragma once
13 #endif
14
15 #include <climits>
16 #include <boost/assert.hpp>
17 #include <boost/cstdint.hpp>
18
19 ///////////////////////////////////////////////////////////////////////////////
20 // constants used to classify the single characters
21 ///////////////////////////////////////////////////////////////////////////////
22 #define BOOST_CC_DIGIT    0x0001
23 #define BOOST_CC_XDIGIT   0x0002
24 #define BOOST_CC_ALPHA    0x0004
25 #define BOOST_CC_CTRL     0x0008
26 #define BOOST_CC_LOWER    0x0010
27 #define BOOST_CC_UPPER    0x0020
28 #define BOOST_CC_SPACE    0x0040
29 #define BOOST_CC_PUNCT    0x0080
30
31 namespace boost { namespace spirit { namespace char_encoding
32 {
33     // The detection of isgraph(), isprint() and isblank() is done programmatically
34     // to keep the character type table small. Additionally, these functions are
35     // rather seldom used and the programmatic detection is very simple.
36
37     ///////////////////////////////////////////////////////////////////////////
38     // ISO 8859-1 character classification table
39     //
40     // the comments intentionally contain non-ascii characters
41     // boostinspect:noascii
42     ///////////////////////////////////////////////////////////////////////////
43     const unsigned char iso8859_1_char_types[] =
44     {
45         /* NUL   0   0 */   BOOST_CC_CTRL,
46         /* SOH   1   1 */   BOOST_CC_CTRL,
47         /* STX   2   2 */   BOOST_CC_CTRL,
48         /* ETX   3   3 */   BOOST_CC_CTRL,
49         /* EOT   4   4 */   BOOST_CC_CTRL,
50         /* ENQ   5   5 */   BOOST_CC_CTRL,
51         /* ACK   6   6 */   BOOST_CC_CTRL,
52         /* BEL   7   7 */   BOOST_CC_CTRL,
53         /* BS    8   8 */   BOOST_CC_CTRL,
54         /* HT    9   9 */   BOOST_CC_CTRL|BOOST_CC_SPACE,
55         /* NL   10   a */   BOOST_CC_CTRL|BOOST_CC_SPACE,
56         /* VT   11   b */   BOOST_CC_CTRL|BOOST_CC_SPACE,
57         /* NP   12   c */   BOOST_CC_CTRL|BOOST_CC_SPACE,
58         /* CR   13   d */   BOOST_CC_CTRL|BOOST_CC_SPACE,
59         /* SO   14   e */   BOOST_CC_CTRL,
60         /* SI   15   f */   BOOST_CC_CTRL,
61         /* DLE  16  10 */   BOOST_CC_CTRL,
62         /* DC1  17  11 */   BOOST_CC_CTRL,
63         /* DC2  18  12 */   BOOST_CC_CTRL,
64         /* DC3  19  13 */   BOOST_CC_CTRL,
65         /* DC4  20  14 */   BOOST_CC_CTRL,
66         /* NAK  21  15 */   BOOST_CC_CTRL,
67         /* SYN  22  16 */   BOOST_CC_CTRL,
68         /* ETB  23  17 */   BOOST_CC_CTRL,
69         /* CAN  24  18 */   BOOST_CC_CTRL,
70         /* EM   25  19 */   BOOST_CC_CTRL,
71         /* SUB  26  1a */   BOOST_CC_CTRL,
72         /* ESC  27  1b */   BOOST_CC_CTRL,
73         /* FS   28  1c */   BOOST_CC_CTRL,
74         /* GS   29  1d */   BOOST_CC_CTRL,
75         /* RS   30  1e */   BOOST_CC_CTRL,
76         /* US   31  1f */   BOOST_CC_CTRL,
77         /* SP   32  20 */   BOOST_CC_SPACE,
78         /*  !   33  21 */   BOOST_CC_PUNCT,
79         /*  "   34  22 */   BOOST_CC_PUNCT,
80         /*  #   35  23 */   BOOST_CC_PUNCT,
81         /*  $   36  24 */   BOOST_CC_PUNCT,
82         /*  %   37  25 */   BOOST_CC_PUNCT,
83         /*  &   38  26 */   BOOST_CC_PUNCT,
84         /*  '   39  27 */   BOOST_CC_PUNCT,
85         /*  (   40  28 */   BOOST_CC_PUNCT,
86         /*  )   41  29 */   BOOST_CC_PUNCT,
87         /*  *   42  2a */   BOOST_CC_PUNCT,
88         /*  +   43  2b */   BOOST_CC_PUNCT,
89         /*  ,   44  2c */   BOOST_CC_PUNCT,
90         /*  -   45  2d */   BOOST_CC_PUNCT,
91         /*  .   46  2e */   BOOST_CC_PUNCT,
92         /*  /   47  2f */   BOOST_CC_PUNCT,
93         /*  0   48  30 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
94         /*  1   49  31 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
95         /*  2   50  32 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
96         /*  3   51  33 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
97         /*  4   52  34 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
98         /*  5   53  35 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
99         /*  6   54  36 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
100         /*  7   55  37 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
101         /*  8   56  38 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
102         /*  9   57  39 */   BOOST_CC_DIGIT|BOOST_CC_XDIGIT,
103         /*  :   58  3a */   BOOST_CC_PUNCT,
104         /*  ;   59  3b */   BOOST_CC_PUNCT,
105         /*  <   60  3c */   BOOST_CC_PUNCT,
106         /*  =   61  3d */   BOOST_CC_PUNCT,
107         /*  >   62  3e */   BOOST_CC_PUNCT,
108         /*  ?   63  3f */   BOOST_CC_PUNCT,
109         /*  @   64  40 */   BOOST_CC_PUNCT,
110         /*  A   65  41 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
111         /*  B   66  42 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
112         /*  C   67  43 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
113         /*  D   68  44 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
114         /*  E   69  45 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
115         /*  F   70  46 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_UPPER,
116         /*  G   71  47 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
117         /*  H   72  48 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
118         /*  I   73  49 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
119         /*  J   74  4a */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
120         /*  K   75  4b */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
121         /*  L   76  4c */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
122         /*  M   77  4d */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
123         /*  N   78  4e */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
124         /*  O   79  4f */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
125         /*  P   80  50 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
126         /*  Q   81  51 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
127         /*  R   82  52 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
128         /*  S   83  53 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
129         /*  T   84  54 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
130         /*  U   85  55 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
131         /*  V   86  56 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
132         /*  W   87  57 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
133         /*  X   88  58 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
134         /*  Y   89  59 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
135         /*  Z   90  5a */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
136         /*  [   91  5b */   BOOST_CC_PUNCT,
137         /*  \   92  5c */   BOOST_CC_PUNCT,
138         /*  ]   93  5d */   BOOST_CC_PUNCT,
139         /*  ^   94  5e */   BOOST_CC_PUNCT,
140         /*  _   95  5f */   BOOST_CC_PUNCT,
141         /*  `   96  60 */   BOOST_CC_PUNCT,
142         /*  a   97  61 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
143         /*  b   98  62 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
144         /*  c   99  63 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
145         /*  d  100  64 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
146         /*  e  101  65 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
147         /*  f  102  66 */   BOOST_CC_ALPHA|BOOST_CC_XDIGIT|BOOST_CC_LOWER,
148         /*  g  103  67 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
149         /*  h  104  68 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
150         /*  i  105  69 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
151         /*  j  106  6a */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
152         /*  k  107  6b */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
153         /*  l  108  6c */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
154         /*  m  109  6d */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
155         /*  n  110  6e */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
156         /*  o  111  6f */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
157         /*  p  112  70 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
158         /*  q  113  71 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
159         /*  r  114  72 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
160         /*  s  115  73 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
161         /*  t  116  74 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
162         /*  u  117  75 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
163         /*  v  118  76 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
164         /*  w  119  77 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
165         /*  x  120  78 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
166         /*  y  121  79 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
167         /*  z  122  7a */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
168         /*  {  123  7b */   BOOST_CC_PUNCT,
169         /*  |  124  7c */   BOOST_CC_PUNCT,
170         /*  }  125  7d */   BOOST_CC_PUNCT,
171         /*  ~  126  7e */   BOOST_CC_PUNCT,
172         /* DEL 127  7f */   BOOST_CC_CTRL,
173         /* --  128  80 */   BOOST_CC_CTRL,
174         /* --  129  81 */   BOOST_CC_CTRL,
175         /* --  130  82 */   BOOST_CC_CTRL,
176         /* --  131  83 */   BOOST_CC_CTRL,
177         /* --  132  84 */   BOOST_CC_CTRL,
178         /* --  133  85 */   BOOST_CC_CTRL,
179         /* --  134  86 */   BOOST_CC_CTRL,
180         /* --  135  87 */   BOOST_CC_CTRL,
181         /* --  136  88 */   BOOST_CC_CTRL,
182         /* --  137  89 */   BOOST_CC_CTRL,
183         /* --  138  8a */   BOOST_CC_CTRL,
184         /* --  139  8b */   BOOST_CC_CTRL,
185         /* --  140  8c */   BOOST_CC_CTRL,
186         /* --  141  8d */   BOOST_CC_CTRL,
187         /* --  142  8e */   BOOST_CC_CTRL,
188         /* --  143  8f */   BOOST_CC_CTRL,
189         /* --  144  90 */   BOOST_CC_CTRL,
190         /* --  145  91 */   BOOST_CC_CTRL,
191         /* --  146  92 */   BOOST_CC_CTRL,
192         /* --  147  93 */   BOOST_CC_CTRL,
193         /* --  148  94 */   BOOST_CC_CTRL,
194         /* --  149  95 */   BOOST_CC_CTRL,
195         /* --  150  96 */   BOOST_CC_CTRL,
196         /* --  151  97 */   BOOST_CC_CTRL,
197         /* --  152  98 */   BOOST_CC_CTRL,
198         /* --  153  99 */   BOOST_CC_CTRL,
199         /* --  154  9a */   BOOST_CC_CTRL,
200         /* --  155  9b */   BOOST_CC_CTRL,
201         /* --  156  9c */   BOOST_CC_CTRL,
202         /* --  157  9d */   BOOST_CC_CTRL,
203         /* --  158  9e */   BOOST_CC_CTRL,
204         /* --  159  9f */   BOOST_CC_CTRL,
205         /*     160  a0 */   BOOST_CC_SPACE,
206         /*  �  161  a1 */   BOOST_CC_PUNCT,
207         /*  �  162  a2 */   BOOST_CC_PUNCT,
208         /*  �  163  a3 */   BOOST_CC_PUNCT,
209         /*  �  164  a4 */   BOOST_CC_PUNCT,
210         /*  �  165  a5 */   BOOST_CC_PUNCT,
211         /*  �  166  a6 */   BOOST_CC_PUNCT,
212         /*  �  167  a7 */   BOOST_CC_PUNCT,
213         /*  �  168  a8 */   BOOST_CC_PUNCT,
214         /*  �  169  a9 */   BOOST_CC_PUNCT,
215         /*  �  170  aa */   BOOST_CC_PUNCT,
216         /*  �  171  ab */   BOOST_CC_PUNCT,
217         /*  �  172  ac */   BOOST_CC_PUNCT,
218         /*  �  173  ad */   BOOST_CC_PUNCT,
219         /*  �  174  ae */   BOOST_CC_PUNCT,
220         /*  �  175  af */   BOOST_CC_PUNCT,
221         /*  �  176  b0 */   BOOST_CC_PUNCT,
222         /*  �  177  b1 */   BOOST_CC_PUNCT,
223         /*  �  178  b2 */   BOOST_CC_DIGIT|BOOST_CC_PUNCT,
224         /*  �  179  b3 */   BOOST_CC_DIGIT|BOOST_CC_PUNCT,
225         /*  �  180  b4 */   BOOST_CC_PUNCT,
226         /*  �  181  b5 */   BOOST_CC_PUNCT,
227         /*  �  182  b6 */   BOOST_CC_PUNCT,
228         /*  �  183  b7 */   BOOST_CC_PUNCT,
229         /*  �  184  b8 */   BOOST_CC_PUNCT,
230         /*  �  185  b9 */   BOOST_CC_DIGIT|BOOST_CC_PUNCT,
231         /*  �  186  ba */   BOOST_CC_PUNCT,
232         /*  �  187  bb */   BOOST_CC_PUNCT,
233         /*  �  188  bc */   BOOST_CC_PUNCT,
234         /*  �  189  bd */   BOOST_CC_PUNCT,
235         /*  �  190  be */   BOOST_CC_PUNCT,
236         /*  �  191  bf */   BOOST_CC_PUNCT,
237         /*  �  192  c0 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
238         /*  �  193  c1 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
239         /*  �  194  c2 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
240         /*  �  195  c3 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
241         /*  �  196  c4 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
242         /*  �  197  c5 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
243         /*  �  198  c6 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
244         /*  �  199  c7 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
245         /*  �  200  c8 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
246         /*  �  201  c9 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
247         /*  �  202  ca */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
248         /*  �  203  cb */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
249         /*  �  204  cc */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
250         /*  �  205  cd */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
251         /*  �  206  ce */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
252         /*  �  207  cf */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
253         /*  �  208  d0 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
254         /*  �  209  d1 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
255         /*  �  210  d2 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
256         /*  �  211  d3 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
257         /*  �  212  d4 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
258         /*  �  213  d5 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
259         /*  �  214  d6 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
260         /*  �  215  d7 */   BOOST_CC_PUNCT,
261         /*  �  216  d8 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
262         /*  �  217  d9 */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
263         /*  �  218  da */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
264         /*  �  219  db */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
265         /*  �  220  dc */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
266         /*  �  221  dd */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
267         /*  �  222  de */   BOOST_CC_ALPHA|BOOST_CC_UPPER,
268         /*  �  223  df */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
269         /*  �  224  e0 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
270         /*  �  225  e1 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
271         /*  �  226  e2 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
272         /*  �  227  e3 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
273         /*  �  228  e4 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
274         /*  �  229  e5 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
275         /*  �  230  e6 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
276         /*  �  231  e7 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
277         /*  �  232  e8 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
278         /*  �  233  e9 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
279         /*  �  234  ea */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
280         /*  �  235  eb */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
281         /*  �  236  ec */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
282         /*  �  237  ed */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
283         /*  �  238  ee */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
284         /*  �  239  ef */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
285         /*  �  240  f0 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
286         /*  �  241  f1 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
287         /*  �  242  f2 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
288         /*  �  243  f3 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
289         /*  �  244  f4 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
290         /*  �  245  f5 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
291         /*  �  246  f6 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
292         /*  �  247  f7 */   BOOST_CC_PUNCT,
293         /*  �  248  f8 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
294         /*  �  249  f9 */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
295         /*  �  250  fa */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
296         /*  �  251  fb */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
297         /*  �  252  fc */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
298         /*  �  253  fd */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
299         /*  �  254  fe */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
300         /*  �  255  ff */   BOOST_CC_ALPHA|BOOST_CC_LOWER,
301     };
302
303     ///////////////////////////////////////////////////////////////////////////
304     // ISO 8859-1 character conversion table
305     ///////////////////////////////////////////////////////////////////////////
306     const unsigned char iso8859_1_char_conversion[] =
307     {
308         /* NUL   0   0 */   '\0',
309         /* SOH   1   1 */   '\0',
310         /* STX   2   2 */   '\0',
311         /* ETX   3   3 */   '\0',
312         /* EOT   4   4 */   '\0',
313         /* ENQ   5   5 */   '\0',
314         /* ACK   6   6 */   '\0',
315         /* BEL   7   7 */   '\0',
316         /* BS    8   8 */   '\0',
317         /* HT    9   9 */   '\0',
318         /* NL   10   a */   '\0',
319         /* VT   11   b */   '\0',
320         /* NP   12   c */   '\0',
321         /* CR   13   d */   '\0',
322         /* SO   14   e */   '\0',
323         /* SI   15   f */   '\0',
324         /* DLE  16  10 */   '\0',
325         /* DC1  17  11 */   '\0',
326         /* DC2  18  12 */   '\0',
327         /* DC3  19  13 */   '\0',
328         /* DC4  20  14 */   '\0',
329         /* NAK  21  15 */   '\0',
330         /* SYN  22  16 */   '\0',
331         /* ETB  23  17 */   '\0',
332         /* CAN  24  18 */   '\0',
333         /* EM   25  19 */   '\0',
334         /* SUB  26  1a */   '\0',
335         /* ESC  27  1b */   '\0',
336         /* FS   28  1c */   '\0',
337         /* GS   29  1d */   '\0',
338         /* RS   30  1e */   '\0',
339         /* US   31  1f */   '\0',
340         /* SP   32  20 */   '\0',
341         /*  !   33  21 */   '\0',
342         /*  "   34  22 */   '\0',
343         /*  #   35  23 */   '\0',
344         /*  $   36  24 */   '\0',
345         /*  %   37  25 */   '\0',
346         /*  &   38  26 */   '\0',
347         /*  '   39  27 */   '\0',
348         /*  (   40  28 */   '\0',
349         /*  )   41  29 */   '\0',
350         /*  *   42  2a */   '\0',
351         /*  +   43  2b */   '\0',
352         /*  ,   44  2c */   '\0',
353         /*  -   45  2d */   '\0',
354         /*  .   46  2e */   '\0',
355         /*  /   47  2f */   '\0',
356         /*  0   48  30 */   '\0',
357         /*  1   49  31 */   '\0',
358         /*  2   50  32 */   '\0',
359         /*  3   51  33 */   '\0',
360         /*  4   52  34 */   '\0',
361         /*  5   53  35 */   '\0',
362         /*  6   54  36 */   '\0',
363         /*  7   55  37 */   '\0',
364         /*  8   56  38 */   '\0',
365         /*  9   57  39 */   '\0',
366         /*  :   58  3a */   '\0',
367         /*  ;   59  3b */   '\0',
368         /*  <   60  3c */   '\0',
369         /*  =   61  3d */   '\0',
370         /*  >   62  3e */   '\0',
371         /*  ?   63  3f */   '\0',
372         /*  @   64  40 */   '\0',
373         /*  A   65  41 */   'a',
374         /*  B   66  42 */   'b',
375         /*  C   67  43 */   'c',
376         /*  D   68  44 */   'd',
377         /*  E   69  45 */   'e',
378         /*  F   70  46 */   'f',
379         /*  G   71  47 */   'g',
380         /*  H   72  48 */   'h',
381         /*  I   73  49 */   'i',
382         /*  J   74  4a */   'j',
383         /*  K   75  4b */   'k',
384         /*  L   76  4c */   'l',
385         /*  M   77  4d */   'm',
386         /*  N   78  4e */   'n',
387         /*  O   79  4f */   'o',
388         /*  P   80  50 */   'p',
389         /*  Q   81  51 */   'q',
390         /*  R   82  52 */   'r',
391         /*  S   83  53 */   's',
392         /*  T   84  54 */   't',
393         /*  U   85  55 */   'u',
394         /*  V   86  56 */   'v',
395         /*  W   87  57 */   'w',
396         /*  X   88  58 */   'x',
397         /*  Y   89  59 */   'y',
398         /*  Z   90  5a */   'z',
399         /*  [   91  5b */   '\0',
400         /*  \   92  5c */   '\0',
401         /*  ]   93  5d */   '\0',
402         /*  ^   94  5e */   '\0',
403         /*  _   95  5f */   '\0',
404         /*  `   96  60 */   '\0',
405         /*  a   97  61 */   'A',
406         /*  b   98  62 */   'B',
407         /*  c   99  63 */   'C',
408         /*  d  100  64 */   'D',
409         /*  e  101  65 */   'E',
410         /*  f  102  66 */   'F',
411         /*  g  103  67 */   'G',
412         /*  h  104  68 */   'H',
413         /*  i  105  69 */   'I',
414         /*  j  106  6a */   'J',
415         /*  k  107  6b */   'K',
416         /*  l  108  6c */   'L',
417         /*  m  109  6d */   'M',
418         /*  n  110  6e */   'N',
419         /*  o  111  6f */   'O',
420         /*  p  112  70 */   'P',
421         /*  q  113  71 */   'Q',
422         /*  r  114  72 */   'R',
423         /*  s  115  73 */   'S',
424         /*  t  116  74 */   'T',
425         /*  u  117  75 */   'U',
426         /*  v  118  76 */   'V',
427         /*  w  119  77 */   'W',
428         /*  x  120  78 */   'X',
429         /*  y  121  79 */   'Y',
430         /*  z  122  7a */   'Z',
431         /*  {  123  7b */   '\0',
432         /*  |  124  7c */   '\0',
433         /*  }  125  7d */   '\0',
434         /*  ~  126  7e */   '\0',
435         /* DEL 127  7f */   '\0',
436         /* --  128  80 */   '\0',
437         /* --  129  81 */   '\0',
438         /* --  130  82 */   '\0',
439         /* --  131  83 */   '\0',
440         /* --  132  84 */   '\0',
441         /* --  133  85 */   '\0',
442         /* --  134  86 */   '\0',
443         /* --  135  87 */   '\0',
444         /* --  136  88 */   '\0',
445         /* --  137  89 */   '\0',
446         /* --  138  8a */   '\0',
447         /* --  139  8b */   '\0',
448         /* --  140  8c */   '\0',
449         /* --  141  8d */   '\0',
450         /* --  142  8e */   '\0',
451         /* --  143  8f */   '\0',
452         /* --  144  90 */   '\0',
453         /* --  145  91 */   '\0',
454         /* --  146  92 */   '\0',
455         /* --  147  93 */   '\0',
456         /* --  148  94 */   '\0',
457         /* --  149  95 */   '\0',
458         /* --  150  96 */   '\0',
459         /* --  151  97 */   '\0',
460         /* --  152  98 */   '\0',
461         /* --  153  99 */   '\0',
462         /* --  154  9a */   '\0',
463         /* --  155  9b */   '\0',
464         /* --  156  9c */   '\0',
465         /* --  157  9d */   '\0',
466         /* --  158  9e */   '\0',
467         /* --  159  9f */   '\0',
468         /*     160  a0 */   '\0',
469         /*  �  161  a1 */   '\0',
470         /*  �  162  a2 */   '\0',
471         /*  �  163  a3 */   '\0',
472         /*  �  164  a4 */   '\0',
473         /*  �  165  a5 */   '\0',
474         /*  �  166  a6 */   '\0',
475         /*  �  167  a7 */   '\0',
476         /*  �  168  a8 */   '\0',
477         /*  �  169  a9 */   '\0',
478         /*  �  170  aa */   '\0',
479         /*  �  171  ab */   '\0',
480         /*  �  172  ac */   '\0',
481         /*  �  173  ad */   '\0',
482         /*  �  174  ae */   '\0',
483         /*  �  175  af */   '\0',
484         /*  �  176  b0 */   '\0',
485         /*  �  177  b1 */   '\0',
486         /*  �  178  b2 */   '\0',
487         /*  �  179  b3 */   '\0',
488         /*  �  180  b4 */   '\0',
489         /*  �  181  b5 */   '\0',
490         /*  �  182  b6 */   '\0',
491         /*  �  183  b7 */   '\0',
492         /*  �  184  b8 */   '\0',
493         /*  �  185  b9 */   '\0',
494         /*  �  186  ba */   '\0',
495         /*  �  187  bb */   '\0',
496         /*  �  188  bc */   '\0',
497         /*  �  189  bd */   '\0',
498         /*  �  190  be */   '\0',
499         /*  �  191  bf */   '\0',
500         /*  �  192  c0 */   0xe0,
501         /*  �  193  c1 */   0xe1,
502         /*  �  194  c2 */   0xe2,
503         /*  �  195  c3 */   0xe3,
504         /*  �  196  c4 */   0xe4,
505         /*  �  197  c5 */   0xe5,
506         /*  �  198  c6 */   0xe6,
507         /*  �  199  c7 */   0xe7,
508         /*  �  200  c8 */   0xe8,
509         /*  �  201  c9 */   0xe9,
510         /*  �  202  ca */   0xea,
511         /*  �  203  cb */   0xeb,
512         /*  �  204  cc */   0xec,
513         /*  �  205  cd */   0xed,
514         /*  �  206  ce */   0xee,
515         /*  �  207  cf */   0xef,
516         /*  �  208  d0 */   0xf0,
517         /*  �  209  d1 */   0xf1,
518         /*  �  210  d2 */   0xf2,
519         /*  �  211  d3 */   0xf3,
520         /*  �  212  d4 */   0xf4,
521         /*  �  213  d5 */   0xf5,
522         /*  �  214  d6 */   0xf6,
523         /*  �  215  d7 */   '\0',
524         /*  �  216  d8 */   0xf8,
525         /*  �  217  d9 */   0xf9,
526         /*  �  218  da */   0xfa,
527         /*  �  219  db */   0xfb,
528         /*  �  220  dc */   0xfc,
529         /*  �  221  dd */   0xfd,
530         /*  �  222  de */   0xfe,
531         /*  �  223  df */   '\0',
532         /*  �  224  e0 */   0xc0,
533         /*  �  225  e1 */   0xc1,
534         /*  �  226  e2 */   0xc2,
535         /*  �  227  e3 */   0xc3,
536         /*  �  228  e4 */   0xc4,
537         /*  �  229  e5 */   0xc5,
538         /*  �  230  e6 */   0xc6,
539         /*  �  231  e7 */   0xc7,
540         /*  �  232  e8 */   0xc8,
541         /*  �  233  e9 */   0xc9,
542         /*  �  234  ea */   0xca,
543         /*  �  235  eb */   0xcb,
544         /*  �  236  ec */   0xcc,
545         /*  �  237  ed */   0xcd,
546         /*  �  238  ee */   0xce,
547         /*  �  239  ef */   0xcf,
548         /*  �  240  f0 */   0xd0,
549         /*  �  241  f1 */   0xd1,
550         /*  �  242  f2 */   0xd2,
551         /*  �  243  f3 */   0xd3,
552         /*  �  244  f4 */   0xd4,
553         /*  �  245  f5 */   0xd5,
554         /*  �  246  f6 */   0xd6,
555         /*  �  247  f7 */   '\0',
556         /*  �  248  f8 */   0xd8,
557         /*  �  249  f9 */   0xd9,
558         /*  �  250  fa */   0xda,
559         /*  �  251  fb */   0xdb,
560         /*  �  252  fc */   0xdc,
561         /*  �  253  fd */   0xdd,
562         /*  �  254  fe */   0xde,
563         /*  �  255  ff */   '\0',
564     };
565
566     ///////////////////////////////////////////////////////////////////////////
567     //  Test characters for specified conditions (using iso8859-1)
568     ///////////////////////////////////////////////////////////////////////////
569     struct iso8859_1
570     {
571         typedef unsigned char char_type;
572         typedef unsigned char classify_type;
573
574         static bool
575         isascii_(int ch)
576         {
577             return 0 == (ch & ~0x7f);
578         }
579
580         static bool
581         ischar(int ch)
582         {
583             // iso8859.1 uses all 8 bits
584             // we have to watch out for sign extensions
585             return (0 == (ch & ~0xff) || ~0 == (ch | 0xff)) != 0;
586         }
587
588         // *** Note on assertions: The precondition is that the calls to
589         // these functions do not violate the required range of ch (type int)
590         // which is that strict_ischar(ch) should be true. It is the
591         // responsibility of the caller to make sure this precondition is not
592         // violated.
593
594         static bool
595         strict_ischar(int ch)
596         {
597             return ch >= 0 && ch <= 255;
598         }
599
600         static bool
601         isalnum(int ch)
602         {
603             BOOST_ASSERT(strict_ischar(ch));
604             return (iso8859_1_char_types[ch] & BOOST_CC_ALPHA)
605                 || (iso8859_1_char_types[ch] & BOOST_CC_DIGIT);
606         }
607
608         static bool
609         isalpha(int ch)
610         {
611             BOOST_ASSERT(strict_ischar(ch));
612             return (iso8859_1_char_types[ch] & BOOST_CC_ALPHA) != 0;
613         }
614
615         static bool
616         isdigit(int ch)
617         {
618             BOOST_ASSERT(strict_ischar(ch));
619             return (iso8859_1_char_types[ch] & BOOST_CC_DIGIT) != 0;
620         }
621
622         static bool
623         isxdigit(int ch)
624         {
625             BOOST_ASSERT(strict_ischar(ch));
626             return (iso8859_1_char_types[ch] & BOOST_CC_XDIGIT) != 0;
627         }
628
629         static bool
630         iscntrl(int ch)
631         {
632             BOOST_ASSERT(strict_ischar(ch));
633             return (iso8859_1_char_types[ch] & BOOST_CC_CTRL) != 0;
634         }
635
636         static bool
637         isgraph(int ch)
638         {
639             return ('\x21' <= ch && ch <= '\x7e') || ('\xa1' <= ch && ch <= '\xff');
640         }
641
642         static bool
643         islower(int ch)
644         {
645             BOOST_ASSERT(strict_ischar(ch));
646             return (iso8859_1_char_types[ch] & BOOST_CC_LOWER) != 0;
647         }
648
649         static bool
650         isprint(int ch)
651         {
652             return ('\x20' <= ch && ch <= '\x7e') || ('\xa0' <= ch && ch <= '\xff');
653         }
654
655         static bool
656         ispunct(int ch)
657         {
658             BOOST_ASSERT(strict_ischar(ch));
659             return (iso8859_1_char_types[ch] & BOOST_CC_PUNCT) != 0;
660         }
661
662         static bool
663         isspace(int ch)
664         {
665             BOOST_ASSERT(strict_ischar(ch));
666             return (iso8859_1_char_types[ch] & BOOST_CC_SPACE) != 0;
667         }
668
669         static bool
670         isblank BOOST_PREVENT_MACRO_SUBSTITUTION (int ch)
671         {
672             BOOST_ASSERT(strict_ischar(ch));
673             return ('\x09' == ch || '\x20' == ch || '\xa0' == ch);
674         }
675
676         static bool
677         isupper(int ch)
678         {
679             BOOST_ASSERT(strict_ischar(ch));
680             return (iso8859_1_char_types[ch] & BOOST_CC_UPPER) != 0;
681         }
682
683     ///////////////////////////////////////////////////////////////////////////
684     //  Simple character conversions
685     ///////////////////////////////////////////////////////////////////////////
686
687         static int
688         tolower(int ch)
689         {
690             BOOST_ASSERT(strict_ischar(ch));
691             return isupper(ch) && '\0' != iso8859_1_char_conversion[ch] ?
692                 iso8859_1_char_conversion[ch] : ch;
693         }
694
695         static int
696         toupper(int ch)
697         {
698             BOOST_ASSERT(strict_ischar(ch));
699             return islower(ch) && '\0' != iso8859_1_char_conversion[ch] ?
700                 iso8859_1_char_conversion[ch] : ch;
701         }
702
703         static ::boost::uint32_t
704         toucs4(int ch)
705         {
706             // The first 256 characters in Unicode and the UCS are
707             // identical to those in ISO/IEC-8859-1.
708             BOOST_ASSERT(strict_ischar(ch));
709             return ch;
710         }
711     };
712
713 }}}
714
715 ///////////////////////////////////////////////////////////////////////////////
716 // undefine macros
717 ///////////////////////////////////////////////////////////////////////////////
718 #undef BOOST_CC_DIGIT
719 #undef BOOST_CC_XDIGIT
720 #undef BOOST_CC_ALPHA
721 #undef BOOST_CC_CTRL
722 #undef BOOST_CC_LOWER
723 #undef BOOST_CC_UPPER
724 #undef BOOST_CC_PUNCT
725 #undef BOOST_CC_SPACE
726
727 #endif
728