Subversion Repositories Kolibri OS

Rev

Rev 4874 | Blame | Compare with Previous | Last modification | View Log | 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. #    ifdef __x86_64__
  115. __asm__ ("                                      \n\
  116.         .data                                   \n\
  117.         .globl  _ctype_                         \n\
  118.         .set    _ctype_,_ctype_b+127            \n\
  119.         .text                                   \n\
  120. ");
  121. #    else
  122. __asm__ ("                                      \n\
  123.         .data                                   \n\
  124.         .globl  __ctype_                        \n\
  125.         .set    __ctype_,__ctype_b+127          \n\
  126.         .text                                   \n\
  127. ");
  128. #    endif
  129. #  else /* !__CYGWIN__ */
  130.  
  131. _CONST char _ctype_[1 + 256] = {
  132.         0,
  133.         _CTYPE_DATA_0_127,
  134.         _CTYPE_DATA_128_255
  135. };
  136. #  endif /* !__CYGWIN__ */
  137.  
  138. #else   /* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */
  139.  
  140. _CONST char _ctype_[1 + 256] = {
  141.         0,
  142.         _CTYPE_DATA_0_127,
  143.         _CTYPE_DATA_128_255
  144. };
  145.  
  146. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  147. #ifndef _MB_CAPABLE
  148. _CONST
  149. #endif
  150. char *__ctype_ptr = (char *) _ctype_ + 1;
  151. #endif
  152.  
  153. #ifndef _MB_CAPABLE
  154. _CONST
  155. #endif
  156. char *__ctype_ptr__ = (char *) _ctype_;
  157.  
  158. #endif
  159.  
  160. #if defined(_MB_CAPABLE)
  161. /* Cygwin has its own implementation which additionally maintains backward
  162.    compatibility with applications built under older Cygwin releases. */
  163. #ifndef __CYGWIN__
  164. void
  165. __set_ctype (const char *charset)
  166. {
  167. #if defined(_MB_EXTENDED_CHARSETS_ISO) || defined(_MB_EXTENDED_CHARSETS_WINDOWS)
  168.   int idx;
  169. #endif
  170.  
  171.   switch (*charset)
  172.     {
  173. #if defined(_MB_EXTENDED_CHARSETS_ISO)
  174.     case 'I':
  175.       idx = __iso_8859_index (charset + 9);
  176.       /* The ctype table has a leading ISO-8859-1 element so we have to add
  177.          1 to the index returned by __iso_8859_index.  If __iso_8859_index
  178.          returns < 0, it's ISO-8859-1. */
  179.       if (idx < 0)
  180.         idx = 0;
  181.       else
  182.         ++idx;
  183. #  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
  184. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  185.       __ctype_ptr = (char *) (__ctype_iso[idx] + 128);
  186. #endif
  187.       __ctype_ptr__ = (char *) (__ctype_iso[idx] + 127);
  188. #  else
  189. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  190.       __ctype_ptr = (char *) __ctype_iso[idx] + 1;
  191. #endif
  192.       __ctype_ptr__ = (char *) __ctype_iso[idx];
  193. #  endif
  194.       return;
  195. #endif
  196. #if defined(_MB_EXTENDED_CHARSETS_WINDOWS)
  197.     case 'C':
  198.       idx = __cp_index (charset + 2);
  199.       if (idx < 0)
  200.         break;
  201. #  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
  202. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  203.       __ctype_ptr = (char *) (__ctype_cp[idx] + 128);
  204. #endif
  205.       __ctype_ptr__ = (char *) (__ctype_cp[idx] + 127);
  206. #  else
  207. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  208.       __ctype_ptr = (char *) __ctype_cp[idx] + 1;
  209. #endif
  210.       __ctype_ptr__ = (char *) __ctype_cp[idx];
  211. #  endif
  212.       return;
  213. #endif
  214.     default:
  215.       break;
  216.     }
  217. #  if defined(ALLOW_NEGATIVE_CTYPE_INDEX)
  218. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  219.   __ctype_ptr = (char *) _ctype_b + 128;
  220. #endif
  221.   __ctype_ptr__ = (char *) _ctype_b + 127;
  222. #  else
  223. #ifdef _NEED_OLD_CTYPE_PTR_DEFINITION
  224.   __ctype_ptr = (char *) _ctype_ + 1;
  225. #endif
  226.   __ctype_ptr__ = (char *) _ctype_;
  227. #  endif
  228. }
  229. #endif /* !__CYGWIN__ */
  230. #endif /* _MB_CAPABLE */
  231.