source: trunk/libs/newlib/src/newlib/libc/ctype/ctype_.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: 5.5 KB
Line 
1/*
2 * Copyright (c) 1989 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. 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 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *      This product includes software developed by the University of
16 *      California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#if defined(LIBC_SCCS) && !defined(lint)
35static char sccsid[] = "@(#)ctype_.c    5.6 (Berkeley) 6/1/90";
36#endif /* LIBC_SCCS and not lint */
37
38#include "ctype_.h"
39#include "../locale/setlocale.h"
40
41#define _CTYPE_DATA_0_127 \
42        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
43        _C,     _C|_S, _C|_S, _C|_S,    _C|_S,  _C|_S,  _C,     _C, \
44        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
45        _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
46        _S|_B,  _P,     _P,     _P,     _P,     _P,     _P,     _P, \
47        _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
48        _N,     _N,     _N,     _N,     _N,     _N,     _N,     _N, \
49        _N,     _N,     _P,     _P,     _P,     _P,     _P,     _P, \
50        _P,     _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U, \
51        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
52        _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
53        _U,     _U,     _U,     _P,     _P,     _P,     _P,     _P, \
54        _P,     _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L, \
55        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
56        _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
57        _L,     _L,     _L,     _P,     _P,     _P,     _P,     _C
58
59#define _CTYPE_DATA_128_255 \
60        0,      0,      0,      0,      0,      0,      0,      0, \
61        0,      0,      0,      0,      0,      0,      0,      0, \
62        0,      0,      0,      0,      0,      0,      0,      0, \
63        0,      0,      0,      0,      0,      0,      0,      0, \
64        0,      0,      0,      0,      0,      0,      0,      0, \
65        0,      0,      0,      0,      0,      0,      0,      0, \
66        0,      0,      0,      0,      0,      0,      0,      0, \
67        0,      0,      0,      0,      0,      0,      0,      0, \
68        0,      0,      0,      0,      0,      0,      0,      0, \
69        0,      0,      0,      0,      0,      0,      0,      0, \
70        0,      0,      0,      0,      0,      0,      0,      0, \
71        0,      0,      0,      0,      0,      0,      0,      0, \
72        0,      0,      0,      0,      0,      0,      0,      0, \
73        0,      0,      0,      0,      0,      0,      0,      0, \
74        0,      0,      0,      0,      0,      0,      0,      0, \
75        0,      0,      0,      0,      0,      0,      0,      0
76
77#if defined(_MB_CAPABLE)
78#if defined(_MB_EXTENDED_CHARSETS_ISO)
79#include "ctype_iso.h"
80#endif
81#if defined(_MB_EXTENDED_CHARSETS_WINDOWS)
82#include "ctype_cp.h"
83#endif
84#endif
85
86#if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
87/* No static const on Cygwin since it's referenced and potentially overwritten
88   for compatibility with older applications. */
89#ifndef __CYGWIN__
90const
91#endif
92char _ctype_b[128 + 256] = {
93        _CTYPE_DATA_128_255,
94        _CTYPE_DATA_0_127,
95        _CTYPE_DATA_128_255
96};
97
98#  ifdef __CYGWIN__
99/* For backward compatibility */
100char __EXPORT *__ctype_ptr__ = DEFAULT_CTYPE_PTR;
101
102#    ifdef __x86_64__
103__asm__ ("                                      \n\
104        .data                                   \n\
105        .globl  _ctype_                         \n\
106        .set    _ctype_,_ctype_b+127            \n\
107        .text                                   \n\
108");
109#    else
110__asm__ ("                                      \n\
111        .data                                   \n\
112        .globl  __ctype_                        \n\
113        .set    __ctype_,__ctype_b+127          \n\
114        .text                                   \n\
115");
116#    endif
117#  else /* !__CYGWIN__ */
118
119const char _ctype_[1 + 256] = {
120        0,
121        _CTYPE_DATA_0_127,
122        _CTYPE_DATA_128_255
123};
124#  endif /* !__CYGWIN__ */
125
126#else   /* !ALLOW_NEGATIVE_CTYPE_INDEX */
127
128const char _ctype_[1 + 256] = {
129        0,
130        _CTYPE_DATA_0_127,
131        _CTYPE_DATA_128_255
132};
133
134#endif  /* !ALLOW_NEGATIVE_CTYPE_INDEX */
135
136#if defined(_MB_CAPABLE)
137/* Cygwin has its own implementation which additionally maintains backward
138   compatibility with applications built under older Cygwin releases. */
139#ifndef __CYGWIN__
140void
141__set_ctype (struct __locale_t *loc, const char *charset)
142{
143#if defined(_MB_EXTENDED_CHARSETS_ISO) || defined(_MB_EXTENDED_CHARSETS_WINDOWS)
144  int idx;
145#endif
146  char *ctype_ptr = NULL;
147
148  switch (*charset)
149    {
150#if defined(_MB_EXTENDED_CHARSETS_ISO)
151    case 'I':
152      idx = __iso_8859_index (charset + 9);
153      /* The ctype table has a leading ISO-8859-1 element so we have to add
154         1 to the index returned by __iso_8859_index.  If __iso_8859_index
155         returns < 0, it's ISO-8859-1. */
156      if (idx < 0)
157        idx = 0;
158      else
159        ++idx;
160      ctype_ptr = __ctype_iso[idx];
161      break;
162#endif
163#if defined(_MB_EXTENDED_CHARSETS_WINDOWS)
164    case 'C':
165      idx = __cp_index (charset + 2);
166      if (idx < 0)
167        break;
168      ctype_ptr = __ctype_cp[idx];
169      break;
170#endif
171    default:
172      break;
173    }
174  if (!ctype_ptr)
175    {
176#  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
177     ctype_ptr = _ctype_b;
178#  else
179     ctype_ptr = _ctype_;
180#  endif
181    }
182#  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
183  loc->ctype_ptr = ctype_ptr + 127;
184#  else
185  loc->ctype_ptr = ctype_ptr;
186#  endif
187}
188#endif /* !__CYGWIN__ */
189#endif /* _MB_CAPABLE */
Note: See TracBrowser for help on using the repository browser.