Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  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)
  35. static char sccsid[] = "@(#)ctype_.c    5.6 (Berkeley) 6/1/90";
  36. #endif /* LIBC_SCCS and not lint */
  37.  
  38. #include <ctype.h>
  39.  
  40. #define _CTYPE_DATA_0_127 \
  41.         _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
  42.         _C,     _C|_S, _C|_S, _C|_S,    _C|_S,  _C|_S,  _C,     _C, \
  43.         _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
  44.         _C,     _C,     _C,     _C,     _C,     _C,     _C,     _C, \
  45.         _S|_B,  _P,     _P,     _P,     _P,     _P,     _P,     _P, \
  46.         _P,     _P,     _P,     _P,     _P,     _P,     _P,     _P, \
  47.         _N,     _N,     _N,     _N,     _N,     _N,     _N,     _N, \
  48.         _N,     _N,     _P,     _P,     _P,     _P,     _P,     _P, \
  49.         _P,     _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U, \
  50.         _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
  51.         _U,     _U,     _U,     _U,     _U,     _U,     _U,     _U, \
  52.         _U,     _U,     _U,     _P,     _P,     _P,     _P,     _P, \
  53.         _P,     _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L, \
  54.         _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
  55.         _L,     _L,     _L,     _L,     _L,     _L,     _L,     _L, \
  56.         _L,     _L,     _L,     _P,     _P,     _P,     _P,     _C
  57.  
  58. #define _CTYPE_DATA_128_255 \
  59.         0,      0,      0,      0,      0,      0,      0,      0, \
  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.  
  76. #if (defined(__GNUC__) && !defined(__CHAR_UNSIGNED__) && !defined(COMPACT_CTYPE)) || defined (__CYGWIN__)
  77. #define ALLOW_NEGATIVE_CTYPE_INDEX
  78. #endif
  79.  
  80. #if defined(_MB_CAPABLE)
  81. #if defined(_MB_EXTENDED_CHARSETS_ISO)
  82. #include "ctype_iso.h"
  83. #endif
  84. #if defined(_MB_EXTENDED_CHARSETS_WINDOWS)
  85. #include "ctype_cp.h"
  86. #endif
  87. #endif
  88.  
  89. #if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
  90. /* No static const on Cygwin since it's referenced and potentially overwritten
  91.    for compatibility with older applications. */
  92. #ifndef __CYGWIN__
  93. static _CONST
  94. #endif
  95. char _ctype_b[128 + 256] = {
  96.         _CTYPE_DATA_128_255,
  97.         _CTYPE_DATA_0_127,
  98.         _CTYPE_DATA_128_255
  99. };
  100.  
  101. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  102. #ifndef _MB_CAPABLE
  103. _CONST
  104. #endif
  105. char __EXPORT *__ctype_ptr = (char *) _ctype_b + 128;
  106. #endif
  107.  
  108. #ifndef _MB_CAPABLE
  109. _CONST
  110. #endif
  111. char __EXPORT *__ctype_ptr__ = (char *) _ctype_b + 127;
  112.  
  113. #  ifdef __CYGWIN__
  114.  
  115. __asm__ ("                                      \n\
  116.         .data                                   \n\
  117.         .globl  __ctype_                        \n\
  118.         .set    __ctype_,__ctype_b+127          \n\
  119.         .text                                   \n\
  120. ");
  121.  
  122. #  else /* !__CYGWIN__ */
  123.  
  124. _CONST char _ctype_[1 + 256] = {
  125.         0,
  126.         _CTYPE_DATA_0_127,
  127.         _CTYPE_DATA_128_255
  128. };
  129. #  endif /* !__CYGWIN__ */
  130.  
  131. #else   /* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */
  132.  
  133. _CONST char _ctype_[1 + 256] = {
  134.         0,
  135.         _CTYPE_DATA_0_127,
  136.         _CTYPE_DATA_128_255
  137. };
  138.  
  139. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  140. #ifndef _MB_CAPABLE
  141. _CONST
  142. #endif
  143. char *__ctype_ptr = (char *) _ctype_ + 1;
  144. #endif
  145.  
  146. #ifndef _MB_CAPABLE
  147. _CONST
  148. #endif
  149. char *__ctype_ptr__ = (char *) _ctype_;
  150.  
  151. #endif
  152.  
  153. #if defined(_MB_CAPABLE)
  154. /* Cygwin has its own implementation which additionally maintains backward
  155.    compatibility with applications built under older Cygwin releases. */
  156. #ifndef __CYGWIN__
  157. void
  158. __set_ctype (const char *charset)
  159. {
  160. #if defined(_MB_EXTENDED_CHARSETS_ISO) || defined(_MB_EXTENDED_CHARSETS_WINDOWS)
  161.   int idx;
  162. #endif
  163.  
  164.   switch (*charset)
  165.     {
  166. #if defined(_MB_EXTENDED_CHARSETS_ISO)
  167.     case 'I':
  168.       idx = __iso_8859_index (charset + 9);
  169.       /* The ctype table has a leading ISO-8859-1 element so we have to add
  170.          1 to the index returned by __iso_8859_index.  If __iso_8859_index
  171.          returns < 0, it's ISO-8859-1. */
  172.       if (idx < 0)
  173.         idx = 0;
  174.       else
  175.         ++idx;
  176. #  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
  177. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  178.       __ctype_ptr = (char *) (__ctype_iso[idx] + 128);
  179. #endif
  180.       __ctype_ptr__ = (char *) (__ctype_iso[idx] + 127);
  181. #  else
  182. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  183.       __ctype_ptr = (char *) __ctype_iso[idx] + 1;
  184. #endif
  185.       __ctype_ptr__ = (char *) __ctype_iso[idx];
  186. #  endif
  187.       return;
  188. #endif
  189. #if defined(_MB_EXTENDED_CHARSETS_WINDOWS)
  190.     case 'C':
  191.       idx = __cp_index (charset + 2);
  192.       if (idx < 0)
  193.         break;
  194. #  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
  195. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  196.       __ctype_ptr = (char *) (__ctype_cp[idx] + 128);
  197. #endif
  198.       __ctype_ptr__ = (char *) (__ctype_cp[idx] + 127);
  199. #  else
  200. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  201.       __ctype_ptr = (char *) __ctype_cp[idx] + 1;
  202. #endif
  203.       __ctype_ptr__ = (char *) __ctype_cp[idx];
  204. #  endif
  205.       return;
  206. #endif
  207.     default:
  208.       break;
  209.     }
  210. #  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
  211. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  212.   __ctype_ptr = (char *) _ctype_b + 128;
  213. #endif
  214.   __ctype_ptr__ = (char *) _ctype_b + 127;
  215. #  else
  216. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  217.   __ctype_ptr = (char *) _ctype_ + 1;
  218. #endif
  219.   __ctype_ptr__ = (char *) _ctype_;
  220. #  endif
  221. }
  222. #endif /* !__CYGWIN__ */
  223. #endif /* _MB_CAPABLE */
  224.