1// Locale support -*- C++ -*- 2 3// Copyright (C) 2002 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 2, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// As a special exception, you may use this file as part of a free software 22// library without restriction. Specifically, if other files instantiate 23// templates or use macros or inline functions from this file, or you compile 24// this file and link it with other files to produce an executable, this 25// file does not by itself cause the resulting executable to be covered by 26// the GNU General Public License. This exception does not however 27// invalidate any other reasons why the executable file might be covered by 28// the GNU General Public License. 29 30// 31// ISO C++ 14882: 22.1 Locales 32// 33 34// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) 35// functions go in ctype.cc 36 37// The following definitions are portable, but insanely slow. If one 38// cares at all about performance, then specialized ctype 39// functionality should be added for the native os in question: see 40// the config/os/bits/ctype_*.h files. 41 42 bool 43 ctype<char>:: 44 is(mask __m, char __c) const 45 { 46 bool __ret; 47 switch (__m) 48 { 49 case space: 50 __ret = isspace(__c); 51 break; 52 case print: 53 __ret = isprint(__c); 54 break; 55 case cntrl: 56 __ret = iscntrl(__c); 57 break; 58 case upper: 59 __ret = isupper(__c); 60 break; 61 case lower: 62 __ret = islower(__c); 63 break; 64 case alpha: 65 __ret = isalpha(__c); 66 break; 67 case digit: 68 __ret = isdigit(__c); 69 break; 70 case punct: 71 __ret = ispunct(__c); 72 break; 73 case xdigit: 74 __ret = isxdigit(__c); 75 break; 76 case alnum: 77 __ret = isalnum(__c); 78 break; 79 case graph: 80 __ret = isgraph(__c); 81 break; 82 default: 83 __ret = false; 84 break; 85 } 86 return __ret; 87 } 88 89 const char* 90 ctype<char>:: 91 is(const char* __low, const char* __high, mask* __vec) const 92 { 93 const int __bitmasksize = 11; // Highest bitmask in ctype_base == 10 94 for (;__low < __high; ++__vec, ++__low) 95 { 96 mask __m = 0; 97 int __i = 0; // Lowest bitmask in ctype_base == 0 98 for (;__i < __bitmasksize; ++__i) 99 { 100 mask __bit = static_cast<mask>(1 << __i); 101 if (this->is(__bit, *__low)) 102 __m |= __bit; 103 } 104 *__vec = __m; 105 } 106 return __high; 107 } 108 109 const char* 110 ctype<char>:: 111 scan_is(mask __m, const char* __low, const char* __high) const 112 { 113 while (__low < __high && !this->is(__m, *__low)) 114 ++__low; 115 return __low; 116 } 117 118 const char* 119 ctype<char>:: 120 scan_not(mask __m, const char* __low, const char* __high) const 121 { 122 while (__low < __high && this->is(__m, *__low) != 0) 123 ++__low; 124 return __low; 125 } 126