Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // std::collate implementation details, generic version -*- C++ -*-
  2.  
  3. // Copyright (C) 2001-2015 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 3, 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. // Under Section 7 of GPL version 3, you are granted additional
  17. // permissions described in the GCC Runtime Library Exception, version
  18. // 3.1, as published by the Free Software Foundation.
  19.  
  20. // You should have received a copy of the GNU General Public License and
  21. // a copy of the GCC Runtime Library Exception along with this program;
  22. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  23. // <http://www.gnu.org/licenses/>.
  24.  
  25. //
  26. // ISO C++ 14882: 22.2.4.1.2  collate virtual functions
  27. //
  28.  
  29. // Written by Benjamin Kosnik <bkoz@redhat.com>
  30.  
  31. #include <locale>
  32. #include <cstring>
  33.  
  34. namespace std _GLIBCXX_VISIBILITY(default)
  35. {
  36. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  37.  
  38.   // These are basically extensions to char_traits, and perhaps should
  39.   // be put there instead of here.
  40.   template<>
  41.     int
  42.     collate<char>::_M_compare(const char* __one,
  43.                               const char* __two) const throw()
  44.     {
  45.       int __cmp = strcoll(__one, __two);
  46.       return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
  47.     }
  48.  
  49.   template<>
  50.     size_t
  51.     collate<char>::_M_transform(char* __to, const char* __from,
  52.                                 size_t __n) const throw()
  53.     { return strxfrm(__to, __from, __n); }
  54.  
  55. #ifdef _GLIBCXX_USE_WCHAR_T
  56.   template<>
  57.     int
  58.     collate<wchar_t>::_M_compare(const wchar_t* __one,
  59.                                  const wchar_t* __two) const throw()
  60.     {
  61.       int __cmp = wcscoll(__one, __two);
  62.       return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0);
  63.     }
  64.  
  65.   template<>
  66.     size_t
  67.     collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from,
  68.                                    size_t __n) const throw()
  69.     { return wcsxfrm(__to, __from, __n); }
  70. #endif
  71.  
  72. _GLIBCXX_END_NAMESPACE_VERSION
  73. } // namespace
  74.