source: trunk/libs/newlib/src/newlib/libc/ctype/towupper.c @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 11.5 KB
Line 
1/* Copyright (c) 2002 Red Hat Incorporated.
2   All rights reserved.
3
4   Redistribution and use in source and binary forms, with or without
5   modification, are permitted provided that the following conditions are met:
6
7     Redistributions of source code must retain the above copyright
8     notice, this list of conditions and the following disclaimer.
9
10     Redistributions in binary form must reproduce the above copyright
11     notice, this list of conditions and the following disclaimer in the
12     documentation and/or other materials provided with the distribution.
13
14     The name of Red Hat Incorporated may not be used to endorse
15     or promote products derived from this software without specific
16     prior written permission.
17
18   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21   ARE DISCLAIMED.  IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY
22   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS   
27   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30/*
31FUNCTION
32        <<towupper>>, <<towupper_l>>---translate wide characters to uppercase
33
34INDEX
35        towupper
36
37INDEX
38        towupper_l
39
40SYNOPSIS
41        #include <wctype.h>
42        wint_t towupper(wint_t <[c]>);
43
44        #include <wctype.h>
45        wint_t towupper_l(wint_t <[c]>, locale_t <[locale]>);
46
47
48DESCRIPTION
49<<towupper>> is a function which converts lowercase wide characters to
50uppercase, leaving all other characters unchanged.
51
52<<towupper_l>> is like <<towupper>> but performs the function based on the
53locale specified by the locale object locale.  If <[locale]> is
54LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined.
55
56RETURNS
57<<towupper>>, <<towupper_l>> return the uppercase equivalent of <[c]> when it is a
58lowercase wide character, otherwise, it returns the input character.
59
60PORTABILITY
61<<towupper>> is C99.
62<<towupper_l>> is POSIX-1.2008.
63
64No supporting OS subroutines are required.
65*/
66
67#include <_ansi.h>
68#include <newlib.h>
69#include <string.h>
70#include <reent.h>
71#include <ctype.h>
72#include <wctype.h>
73#include "local.h"
74
75wint_t
76towupper (wint_t c)
77{
78#ifdef _MB_CAPABLE
79  c = _jp2uc (c);
80  /* Based on and tested against Unicode 5.2 */
81
82  /* Expression used to filter out the characters for the below code:
83
84     awk -F\; '{ if ( $13 != "" ) print $1; }' UnicodeData.txt
85  */
86  if (c < 0x100)
87    {
88      if (c == 0x00b5)
89        return 0x039c;
90     
91      if ((c >= 0x00e0 && c <= 0x00fe && c != 0x00f7) ||
92          (c >= 0x0061 && c <= 0x007a))
93        return (c - 0x20);
94     
95      if (c == 0xff)
96        return 0x0178;
97     
98      return c;
99    }
100  else if (c < 0x300)
101    {
102      if ((c >= 0x0101 && c <= 0x012f) ||
103          (c >= 0x0133 && c <= 0x0137) ||
104          (c >= 0x014b && c <= 0x0177) ||
105          (c >= 0x01df && c <= 0x01ef) ||
106          (c >= 0x01f9 && c <= 0x021f) ||
107          (c >= 0x0223 && c <= 0x0233) ||
108          (c >= 0x0247 && c <= 0x024f))
109        {
110          if (c & 0x01)
111            return (c - 1);
112          return c;
113        }
114
115      if ((c >= 0x013a && c <= 0x0148) ||
116          (c >= 0x01ce && c <= 0x01dc) ||
117          c == 0x023c || c == 0x0242)
118        {
119          if (!(c & 0x01))
120            return (c - 1);
121          return c;
122        }
123     
124      if (c == 0x0131)
125        return 0x0049;
126     
127      if (c == 0x017a || c == 0x017c || c == 0x017e)
128        return (c - 1);
129     
130      if (c >= 0x017f && c <= 0x0292)
131        {
132          wint_t k;
133          switch (c)
134            {
135            case 0x017f:
136              k = 0x0053;
137              break;
138            case 0x0180:
139              k = 0x0243;
140              break;
141            case 0x0183:
142              k = 0x0182;
143              break;
144            case 0x0185:
145              k = 0x0184;
146              break;
147            case 0x0188:
148              k = 0x0187;
149              break;
150            case 0x018c:
151              k = 0x018b;
152              break;
153            case 0x0192:
154              k = 0x0191;
155              break;
156            case 0x0195:
157              k = 0x01f6;
158              break;
159            case 0x0199:
160              k = 0x0198;
161              break;
162            case 0x019a:
163              k = 0x023d;
164              break;
165            case 0x019e:
166              k = 0x0220;
167              break;
168            case 0x01a1:
169            case 0x01a3:
170            case 0x01a5:
171            case 0x01a8:
172            case 0x01ad:
173            case 0x01b0:
174            case 0x01b4:
175            case 0x01b6:
176            case 0x01b9:
177            case 0x01bd:
178            case 0x01c5:
179            case 0x01c8:
180            case 0x01cb:
181            case 0x01f2:
182            case 0x01f5:
183              k = c - 1;
184              break;
185            case 0x01bf:
186              k = 0x01f7;
187              break;
188            case 0x01c6:
189            case 0x01c9:
190            case 0x01cc:
191              k = c - 2;
192              break;
193            case 0x01dd:
194              k = 0x018e;
195              break;
196            case 0x01f3:
197              k = 0x01f1;
198              break;
199            case 0x023f:
200              k = 0x2c7e;
201              break;
202            case 0x0240:
203              k = 0x2c7f;
204              break;
205            case 0x0250:
206              k = 0x2c6f;
207              break;
208            case 0x0251:
209              k = 0x2c6d;
210              break;
211            case 0x0252:
212              k = 0x2c70;
213              break;
214            case 0x0253:
215              k = 0x0181;
216              break;
217            case 0x0254:
218              k = 0x0186;
219              break;
220            case 0x0256:
221              k = 0x0189;
222              break;
223            case 0x0257:
224              k = 0x018a;
225              break;
226            case 0x0259:
227              k = 0x018f;
228              break;
229            case 0x025b:
230              k = 0x0190;
231              break;
232            case 0x0260:
233              k = 0x0193;
234              break;
235            case 0x0263:
236              k = 0x0194;
237              break;
238            case 0x0268:
239              k = 0x0197;
240              break;
241            case 0x0269:
242              k = 0x0196;
243              break;
244            case 0x026b:
245              k = 0x2c62;
246              break;
247            case 0x026f:
248              k = 0x019c;
249              break;
250            case 0x0271:
251              k = 0x2c6e;
252              break;
253            case 0x0272:
254              k = 0x019d;
255              break;
256            case 0x0275:
257              k = 0x019f;
258              break;
259            case 0x027d:
260              k = 0x2c64;
261              break;
262            case 0x0280:
263              k = 0x01a6;
264              break;
265            case 0x0283:
266              k = 0x01a9;
267              break;
268            case 0x0288:
269              k = 0x01ae;
270              break;
271            case 0x0289:
272              k = 0x0244;
273              break;
274            case 0x028a:
275              k = 0x01b1;
276              break;
277            case 0x028b:
278              k = 0x01b2;
279              break;
280            case 0x028c:
281              k = 0x0245;
282              break;
283            case 0x0292:
284              k = 0x01b7;
285              break;
286            default:
287              k = 0;
288            }
289          if (k != 0)
290            return k;
291        }
292    }
293  else if (c < 0x0400)
294    {
295      wint_t k;
296
297      if (c >= 0x03ad && c <= 0x03af)
298        return (c - 0x25);
299
300      if (c >= 0x03b1 && c <= 0x03cb && c != 0x03c2)
301        return (c - 0x20);
302     
303      if (c >= 0x03d9 && c <= 0x03ef && (c & 1))
304        return (c - 1);
305
306      switch (c)
307        {
308        case 0x0345:
309          k = 0x0399;
310          break;
311        case 0x0371:
312        case 0x0373:
313        case 0x0377:
314        case 0x03f8:
315        case 0x03fb:
316          k = c - 1;
317          break;
318        case 0x037b:
319        case 0x037c:
320        case 0x037d:
321          k = c + 0x82;
322          break;
323        case 0x03ac:
324          k = 0x0386;
325          break;
326        case 0x03c2:
327          k = 0x03a3;
328          break;
329        case 0x03cc:
330          k = 0x038c;
331          break;
332        case 0x03cd:
333        case 0x03ce:
334          k = c - 0x3f;
335          break;
336        case 0x03d0:
337          k = 0x0392;
338          break;
339        case 0x03d1:
340          k = 0x0398;
341          break;
342        case 0x03d5:
343          k = 0x03a6;
344          break;
345        case 0x03d6:
346          k = 0x03a0;
347          break;
348        case 0x03d7:
349          k = 0x03cf;
350          break;
351        case 0x03f0:
352          k = 0x039a;
353          break;
354        case 0x03f1:
355          k = 0x03a1;
356          break;
357        case 0x03f2:
358          k = 0x03f9;
359          break;
360        case 0x03f5:
361          k = 0x0395;
362          break;
363        default:
364          k = 0;
365        }
366      if (k != 0)
367        return k;
368    }
369  else if (c < 0x500)
370    {
371      if (c >= 0x0430 && c <= 0x044f)
372        return (c - 0x20);
373     
374      if (c >= 0x0450 && c <= 0x045f)
375        return (c - 0x50);
376     
377      if ((c >= 0x0461 && c <= 0x0481) ||
378          (c >= 0x048b && c <= 0x04bf) ||
379          (c >= 0x04d1 && c <= 0x04ff))
380        {
381          if (c & 0x01)
382            return (c - 1);
383          return c;
384        }
385     
386      if (c >= 0x04c2 && c <= 0x04ce)
387        {
388          if (!(c & 0x01))
389            return (c - 1);
390          return c;
391        }
392     
393      if (c == 0x04cf)
394        return 0x04c0;
395    }
396  else if (c < 0x0600)
397    {
398      if (c >= 0x0501 && c <= 0x0525 && (c & 1))
399        return c - 1;
400
401      if (c >= 0x0561 && c <= 0x0586)
402        return (c - 0x30);
403    }
404  else if (c < 0x1f00)
405    {
406      if (c == 0x1d79)
407        return 0xa77d;
408
409      if (c == 0x1d7d)
410        return 0x2c63;
411
412      if ((c >= 0x1e01 && c <= 0x1e95) ||
413          (c >= 0x1ea1 && c <= 0x1eff))
414        {
415          if (c & 0x01)
416            return (c - 1);
417          return c;
418        }
419     
420      if (c == 0x1e9b)
421        return 0x1e60;
422    }
423  else if (c < 0x2000)
424    {
425     
426      if ((c >= 0x1f00 && c <= 0x1f07) ||
427          (c >= 0x1f10 && c <= 0x1f15) ||
428          (c >= 0x1f20 && c <= 0x1f27) ||
429          (c >= 0x1f30 && c <= 0x1f37) ||
430          (c >= 0x1f40 && c <= 0x1f45) ||
431          (c >= 0x1f60 && c <= 0x1f67) ||
432          (c >= 0x1f80 && c <= 0x1f87) ||
433          (c >= 0x1f90 && c <= 0x1f97) ||
434          (c >= 0x1fa0 && c <= 0x1fa7))
435        return (c + 0x08);
436
437      if (c >= 0x1f51 && c <= 0x1f57 && (c & 0x01))
438        return (c + 0x08);
439     
440      if (c >= 0x1f70 && c <= 0x1ff3)
441        {
442          wint_t k;
443          switch (c)
444            {
445            case 0x1fb0:
446              k = 0x1fb8;
447              break;
448            case 0x1fb1:
449              k = 0x1fb9;
450              break;
451            case 0x1f70:
452              k = 0x1fba;
453              break;
454            case 0x1f71:
455              k = 0x1fbb;
456              break;
457            case 0x1fb3:
458              k = 0x1fbc;
459              break;
460            case 0x1fbe:
461              k = 0x0399;
462              break;
463            case 0x1f72:
464              k = 0x1fc8;
465              break;
466            case 0x1f73:
467              k = 0x1fc9;
468              break;
469            case 0x1f74:
470              k = 0x1fca;
471              break;
472            case 0x1f75:
473              k = 0x1fcb;
474              break;
475            case 0x1fc3:
476              k = 0x1fcc;
477              break;
478            case 0x1fd0:
479              k = 0x1fd8;
480              break;
481            case 0x1fd1:
482              k = 0x1fd9;
483              break;
484            case 0x1f76:
485              k = 0x1fda;
486              break;
487            case 0x1f77:
488              k = 0x1fdb;
489              break;
490            case 0x1fe0:
491              k = 0x1fe8;
492              break;
493            case 0x1fe1:
494              k = 0x1fe9;
495              break;
496            case 0x1f7a:
497              k = 0x1fea;
498              break;
499            case 0x1f7b:
500              k = 0x1feb;
501              break;
502            case 0x1fe5:
503              k = 0x1fec;
504              break;
505            case 0x1f78:
506              k = 0x1ff8;
507              break;
508            case 0x1f79:
509              k = 0x1ff9;
510              break;
511            case 0x1f7c:
512              k = 0x1ffa;
513              break;
514            case 0x1f7d:
515              k = 0x1ffb;
516              break;
517            case 0x1ff3:
518              k = 0x1ffc;
519              break;
520            default:
521              k = 0;
522            }
523          if (k != 0)
524            return k;
525        }
526    }
527  else if (c < 0x3000)
528    {
529      if (c == 0x214e)
530        return 0x2132;
531
532      if (c == 0x2184)
533        return 0x2183;
534
535      if (c >= 0x2170 && c <= 0x217f)
536        return (c - 0x10);
537     
538      if (c >= 0x24d0 && c <= 0x24e9)
539        return (c - 0x1a);
540     
541      if (c >= 0x2c30 && c <= 0x2c5e)
542        return (c - 0x30);
543
544      if ((c >= 0x2c68 && c <= 0x2c6c && !(c & 1)) ||
545          (c >= 0x2c81 && c <= 0x2ce3 &&  (c & 1)) ||
546          c == 0x2c73 || c == 0x2c76 ||
547          c == 0x2cec || c == 0x2cee)
548        return (c - 1);
549
550      if (c >= 0x2c81 && c <= 0x2ce3 && (c & 1))
551        return (c - 1);
552
553      if (c >= 0x2d00 && c <= 0x2d25)
554        return (c - 0x1c60);
555
556      switch (c)
557        {
558        case 0x2c61:
559          return 0x2c60;
560        case 0x2c65:
561          return 0x023a;
562        case 0x2c66:
563          return 0x023e;
564        }
565    }
566  else if (c >= 0xa000 && c < 0xb000)
567    {
568      if (((c >= 0xa641 && c <= 0xa65f) ||
569           (c >= 0xa663 && c <= 0xa66d) ||
570           (c >= 0xa681 && c <= 0xa697) ||
571           (c >= 0xa723 && c <= 0xa72f) ||
572           (c >= 0xa733 && c <= 0xa76f) ||
573           (c >= 0xa77f && c <= 0xa787)) &&
574          (c & 1))
575        return (c - 1);
576       
577      if (c == 0xa77a || c == 0xa77c || c == 0xa78c)
578        return (c - 1);
579    }
580  else
581    {
582      if (c >= 0xff41 && c <= 0xff5a)
583        return (c - 0x20);
584     
585      if (c >= 0x10428 && c <= 0x1044f)
586        return (c - 0x28);
587    }
588  return c;
589#else
590  return (c < 0x00ff ? (wint_t)(toupper ((int)c)) : c);
591#endif /* _MB_CAPABLE */
592}
593
Note: See TracBrowser for help on using the repository browser.