Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/ctype/towlower.c')
-rw-r--r--newlib/libc/ctype/towlower.c478
1 files changed, 478 insertions, 0 deletions
diff --git a/newlib/libc/ctype/towlower.c b/newlib/libc/ctype/towlower.c
new file mode 100644
index 000000000..5520e3720
--- /dev/null
+++ b/newlib/libc/ctype/towlower.c
@@ -0,0 +1,478 @@
+/* Copyright (c) 2002 Red Hat Incorporated.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ The name of Red Hat Incorporated may not be used to endorse
+ or promote products derived from this software without specific
+ prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+FUNCTION
+ <<towlower>>---translate wide-characters to lower case
+
+INDEX
+ towlower
+
+ANSI_SYNOPSIS
+ #include <wctype.h>
+ wint_t towlower(wint_t <[c]>);
+
+TRAD_SYNOPSIS
+ #include <wctype.h>
+ wint_t towlower(<[c]>)
+ wint_t <[c]>;
+
+
+DESCRIPTION
+<<towlower>> is a function which converts upper-case wide-characters to lower
+case, leaving all other characters unchanged.
+
+RETURNS
+<<towlower>> returns the lower-case equivalent of <[c]> when it is a
+upper-case wide-character, otherwise, it returns the input character.
+
+PORTABILITY
+<<towlower>> is C99.
+
+No supporting OS subroutines are required.
+*/
+
+#include <_ansi.h>
+#include <string.h>
+#include <reent.h>
+#include <ctype.h>
+#include <wctype.h>
+#include "local.h"
+
+wint_t
+_DEFUN(towlower,(c), wint_t c)
+{
+ int unicode = 0;
+
+ if (__lc_ctype[0] == 'C' && __lc_ctype[1] == '\0')
+ {
+ unicode = 0;
+ /* fall-through */
+ }
+#ifdef MB_CAPABLE
+ else if (!strcmp (__lc_ctype, "C-JIS"))
+ {
+ c = __jp2uc (c, JP_JIS);
+ unicode = 1;
+ }
+ else if (!strcmp (__lc_ctype, "C-SJIS"))
+ {
+ c = __jp2uc (c, JP_JIS);
+ unicode = 1;
+ }
+ else if (!strcmp (__lc_ctype, "C-EUCJP"))
+ {
+ c = __jp2uc (c, JP_JIS);
+ unicode = 1;
+ }
+ else if (!strcmp (__lc_ctype, "C-UTF-8"))
+ {
+ unicode = 1;
+ }
+
+ if (unicode)
+ {
+ if (c < 0x100)
+ {
+ if ((c >= 0x0041 && c <= 0x005a) ||
+ (c >= 0x00c0 && c <= 0x00de))
+ return (c + 0x20);
+
+ if (c == 0x00b5)
+ return 0x03bc;
+
+ return c;
+ }
+ else if (c < 0x300)
+ {
+ if ((c >= 0x0100 && c <= 0x012e) ||
+ (c >= 0x0132 && c <= 0x0136) ||
+ (c >= 0x014a && c <= 0x0176) ||
+ (c >= 0x01de && c <= 0x01ee) ||
+ (c >= 0x01f8 && c <= 0x021e) ||
+ (c >= 0x0222 && c <= 0x0232))
+ {
+ if (!(c & 0x01))
+ return (c + 1);
+ return c;
+ }
+
+ if ((c >= 0x0139 && c <= 0x0147) ||
+ (c >= 0x01cd && c <= 0x91db))
+ {
+ if (c & 0x01)
+ return (c + 1);
+ return c;
+ }
+
+ if (c >= 0x178 && c <= 0x01f7)
+ {
+ wint_t k;
+ switch (c)
+ {
+ case 0x0178:
+ k = 0x00ff;
+ break;
+ case 0x0179:
+ case 0x017b:
+ case 0x017d:
+ case 0x0182:
+ case 0x0184:
+ case 0x0187:
+ case 0x018b:
+ case 0x0191:
+ case 0x0198:
+ case 0x01a0:
+ case 0x01a2:
+ case 0x01a4:
+ case 0x01a7:
+ case 0x01ac:
+ case 0x01af:
+ case 0x01b3:
+ case 0x01b5:
+ case 0x01b8:
+ case 0x01bc:
+ case 0x01c5:
+ case 0x01c8:
+ case 0x01cb:
+ case 0x01cd:
+ case 0x01cf:
+ case 0x01d1:
+ case 0x01d3:
+ case 0x01d5:
+ case 0x01d7:
+ case 0x01d9:
+ case 0x01db:
+ case 0x01f2:
+ case 0x01f4:
+ k = c + 1;
+ break;
+ case 0x017f:
+ k = 0x0073;
+ break;
+ case 0x0181:
+ k = 0x0253;
+ break;
+ case 0x0186:
+ k = 0x0254;
+ break;
+ case 0x0189:
+ k = 0x0256;
+ break;
+ case 0x018a:
+ k = 0x0257;
+ break;
+ case 0x018e:
+ k = 0x01dd;
+ break;
+ case 0x018f:
+ k = 0x0259;
+ break;
+ case 0x0190:
+ k = 0x025b;
+ break;
+ case 0x0193:
+ k = 0x0260;
+ break;
+ case 0x0194:
+ k = 0x0263;
+ break;
+ case 0x0196:
+ k = 0x0269;
+ break;
+ case 0x0197:
+ k = 0x0268;
+ break;
+ case 0x019c:
+ k = 0x026f;
+ break;
+ case 0x019d:
+ k = 0x0272;
+ break;
+ case 0x019f:
+ k = 0x0275;
+ break;
+ case 0x01a6:
+ k = 0x0280;
+ break;
+ case 0x01a9:
+ k = 0x0283;
+ break;
+ case 0x01ae:
+ k = 0x0288;
+ break;
+ case 0x01b1:
+ k = 0x028a;
+ break;
+ case 0x01b2:
+ k = 0x028b;
+ break;
+ case 0x01b7:
+ k = 0x0292;
+ break;
+ case 0x01c4:
+ case 0x01c7:
+ case 0x01ca:
+ case 0x01f1:
+ k = c + 2;
+ break;
+ case 0x01f6:
+ k = 0x0195;
+ break;
+ case 0x01f7:
+ k = 0x01bf;
+ break;
+ default:
+ k = 0;
+ }
+ if (k != 0)
+ return k;
+ }
+
+ if (c == 0x0220)
+ return 0x019e;
+ }
+ else if (c < 0x0400)
+ {
+ if (c >= 0x0391 && c <= 0x03ab && c != 0x03a2)
+ return (c + 0x20);
+ if (c >= 0x03d8 && c <= 0x03ee && !(c & 0x01))
+ return (c + 1);
+ if (c >= 0x0386 && c <= 0x03f5)
+ {
+ wint_t k;
+ switch (c)
+ {
+ case 0x0386:
+ k = 0x03ac;
+ break;
+ case 0x0388:
+ k = 0x03ad;
+ break;
+ case 0x0389:
+ k = 0x03ae;
+ break;
+ case 0x038a:
+ k = 0x03af;
+ break;
+ case 0x038c:
+ k = 0x03cc;
+ break;
+ case 0x038e:
+ k = 0x03cd;
+ break;
+ case 0x038f:
+ k = 0x038f;
+ break;
+ case 0x03c2:
+ k = 0x03c3;
+ break;
+ case 0x03d0:
+ k = 0x03b2;
+ break;
+ case 0x03d1:
+ k = 0x03b8;
+ break;
+ case 0x03d5:
+ k = 0x03c6;
+ break;
+ case 0x03d6:
+ k = 0x03c0;
+ break;
+ case 0x03f0:
+ k = 0x03ba;
+ break;
+ case 0x03f1:
+ k = 0x03c1;
+ break;
+ case 0x03f2:
+ k = 0x03c3;
+ break;
+ case 0x03f4:
+ k = 0x03b8;
+ break;
+ case 0x03f5:
+ k = 0x03b5;
+ break;
+ default:
+ k = 0;
+ }
+ if (k != 0)
+ return k;
+ }
+
+ if (c == 0x0345)
+ return 0x03b9;
+ }
+ else if (c < 0x500)
+ {
+ if (c >= 0x0400 && c <= 0x040f)
+ return (c + 0x50);
+
+ if (c >= 0x0410 && c <= 0x042f)
+ return (c + 0x20);
+
+ if ((c >= 0x0460 && c <= 0x0480) ||
+ (c >= 0x048a && c <= 0x04be) ||
+ (c >= 0x04d0 && c <= 0x04f4) ||
+ (c == 0x04f8))
+ {
+ if (!(c & 0x01))
+ return (c + 1);
+ return c;
+ }
+
+ if (c >= 0x04c1 && c <= 0x04cd)
+ {
+ if (c & 0x01)
+ return (c + 1);
+ return c;
+ }
+ }
+ else if (c < 0x1f00)
+ {
+ if ((c >= 0x0500 && c <= 0x050e) ||
+ (c >= 0x1e00 && c <= 0x1e94) ||
+ (c >= 0x1ea0 && c <= 0x1ef8))
+ {
+ if (!(c & 0x01))
+ return (c + 1);
+ return c;
+ }
+
+ if (c >= 0x0531 && c <= 0x0556)
+ return (c + 0x30);
+
+ if (c == 0x1e9b)
+ return 0x1e61;
+ }
+ else if (c < 0x2000)
+ {
+ if ((c >= 0x1f08 && c <= 0x1f0f) ||
+ (c >= 0x1f18 && c <= 0x1f1d) ||
+ (c >= 0x1f28 && c <= 0x1f2f) ||
+ (c >= 0x1f38 && c <= 0x1f3f) ||
+ (c >= 0x1f48 && c <= 0x1f4d) ||
+ (c >= 0x1f68 && c <= 0x1f6f) ||
+ (c >= 0x1f88 && c <= 0x1f8f) ||
+ (c >= 0x1f98 && c <= 0x1f9f) ||
+ (c >= 0x1fa8 && c <= 0x1faf))
+ return (c - 0x08);
+
+ if (c >= 0x1f59 && c <= 0x1f5f)
+ {
+ if (c & 0x01)
+ return (c - 0x08);
+ return c;
+ }
+
+ if (c >= 0x1fb8 && c <= 0x1ffc)
+ {
+ wint_t k;
+ switch (c)
+ {
+ case 0x1fb8:
+ case 0x1fb9:
+ case 0x1fd8:
+ case 0x1fd9:
+ case 0x1fe8:
+ case 0x1fe9:
+ k = c - 0x08;
+ break;
+ case 0x1fba:
+ case 0x1fbb:
+ k = c - 0x4a;
+ break;
+ case 0x1fbc:
+ k = 0x1fb3;
+ break;
+ case 0x1fbe:
+ k = 0x03b9;
+ break;
+ case 0x1fc8:
+ case 0x1fc9:
+ case 0x1fca:
+ case 0x1fcb:
+ k = c - 0x56;
+ break;
+ case 0x1fcc:
+ k = 0x1fc3;
+ break;
+ case 0x1fda:
+ case 0x1fdb:
+ k = c - 0x64;
+ break;
+ case 0x1fea:
+ case 0x1feb:
+ k = c - 0x70;
+ break;
+ case 0x1fec:
+ k = 0x1fe5;
+ break;
+ case 0x1ffa:
+ case 0x1ffb:
+ k = c - 0x7e;
+ break;
+ case 0x1ffc:
+ k = 0x1ff3;
+ break;
+ default:
+ k = 0;
+ }
+ if (k != 0)
+ return k;
+ }
+ }
+ else
+ {
+ if (c >= 0x2160 && c <= 0x216f)
+ return (c + 0x10);
+
+ if (c >= 0x24b6 && c <= 0x24cf)
+ return (c + 0x1a);
+
+ if (c >= 0xff21 && c <= 0xff3a)
+ return (c + 0x20);
+
+ if (c >= 0x10400 && c <= 0x10425)
+ return (c + 0x28);
+
+ if (c == 0x2126)
+ return 0x03c9;
+ if (c == 0x212a)
+ return 0x006b;
+ if (c == 0x212b)
+ return 0x00e5;
+ }
+ }
+#endif /* MB_CAPABLE */
+
+ return (c < 0x00ff ? (wint_t)(tolower ((int)c)) : c);
+}
+