Author: sebor
Date: Fri Jul 18 12:14:27 2008
New Revision: 678003
URL: http://svn.apache.org/viewvc?rev=678003&view=rev
Log:
2008-07-18 Martin Sebor <[EMAIL PROTECTED]>
* examples/manual/wctype.cpp: New example showcasing the wchar_t
specialization of the std::ctype_byname facet along with the wide
character classification functions, inspired by the following post
to the Sun C++ discussion forum:
http://forums.sun.com/thread.jspa?threadID=5315069.
Added:
stdcxx/branches/4.2.x/examples/manual/wctype.cpp (with props)
Added: stdcxx/branches/4.2.x/examples/manual/wctype.cpp
URL:
http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/examples/manual/wctype.cpp?rev=678003&view=auto
==============================================================================
--- stdcxx/branches/4.2.x/examples/manual/wctype.cpp (added)
+++ stdcxx/branches/4.2.x/examples/manual/wctype.cpp Fri Jul 18 12:14:27 2008
@@ -0,0 +1,193 @@
+/**************************************************************************
+ *
+ * wctype.cpp - Example program showcasing the wchar_t specialization
+ * of the std::ctype_byname facet, inspired by a Sun C++
+ * forum post:
+ * http://forums.sun.com/thread.jspa?threadID=5315069
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ * Copyright 2008 Rogue Wave Software, Inc.
+ *
+ **************************************************************************/
+
+#include <cwctype> // for iswxxx(), wint_t
+#include <stdexcept> // for runtime_error
+#include <iomanip> // for setfill, setw
+#include <ios> // for oct
+#include <iostream> // for cerr, cout
+#include <locale> // for isxxx(), locale
+
+
+static std::locale
+make_named_locale ()
+{
+ static const char* const
+ locale_names [] = {
+ "es_ES.ISO8859-1", // AIX, Solaris, Tru64
+ "es_ES.iso88591", // HP-UX, Linux
+ "es_ES.88591",
+ "De_DE.88591", // Reliant
+ "es_ES",
+ "es", // Linux, Solaris
+ "Spanish",
+ "spanish", // Linux
+ "espanol", // Linux
+ "spanish_spain.1252", // Windows
+ "POSIX", // POSIX systems
+ "C", // all C/C++ systems
+ 0 // (sentinel)
+ };
+
+ std::locale german;
+
+ // iterate over the know locale names above until a valid one
+ // is found (i.e., one that doesn't cause locale to throw)
+ for (const char* const *names = locale_names; ; ) {
+ try {
+ german = std::locale (names [0]);
+ break;
+ }
+ catch (std::runtime_error&) {
+ // continue trying until the next name is null
+ if (0 == *++names)
+ throw;
+ }
+ catch (...) {
+ throw;
+ }
+ }
+
+ return german;
+}
+
+
+int main ()
+{
+ std::locale locale;
+
+ try {
+ // try to contruct a named locale
+ locale = make_named_locale ();
+ }
+ catch (std::runtime_error& e) {
+ // a runtime_error will be thrown if the locale cannot be constructed
+ std::cerr << "Caught runtime_error:\n";
+ std::cerr << e.what () << '\n';
+
+ return 1;
+ }
+ catch (...) {
+ std::cerr << "Caught an unknown exception\n";
+
+ return 2;
+ }
+
+ // set the global C/C++ locale to be used by the C classification
+ // functions (such as iswalpha())
+ std::locale::global (locale);
+
+ // imbue the named locale in wcout
+ std::wcout.imbue (locale);
+
+ std::wcout << "Wide character classification in "
+ << locale.name ().c_str () << " locale.\n";
+
+
+ // number of mismatched classifications between C and C++
+ // (expect zero for 100% conforming implementation)
+ int mismatch_count = 0;
+
+ // iterate over all characters in the extended ASCII range
+ // printing out the value of each along with its character
+ // class using the letters A, a, C, D, G, L, P, p, S, U,
+ // and X to denote each of the C/C++ classes corresponding
+ // to the C and C++ classification functions
+ for (std::wint_t wi = 0; wi < std::wint_t (256); ++wi) {
+
+ // convert the wint_t to wchar_t
+ const wchar_t wc (wi);
+
+ char cxx_class [11]; // C++ classification letters
+ char c_class [11]; // C classification letters
+
+ std::size_t i = 0;
+
+ // assign the appropriate letter for the C++ classification
+ cxx_class [i++] = (std::isalnum)(wc, locale) ? 'A' : '-';
+ cxx_class [i++] = (std::isalpha)(wc, locale) ? 'a' : '-';
+ cxx_class [i++] = (std::iscntrl)(wc, locale) ? 'C' : '-';
+ cxx_class [i++] = (std::isdigit)(wc, locale) ? 'D' : '-';
+ cxx_class [i++] = (std::isgraph)(wc, locale) ? 'G' : '-';
+ cxx_class [i++] = (std::islower)(wc, locale) ? 'L' : '-';
+ cxx_class [i++] = (std::isprint)(wc, locale) ? 'P' : '-';
+ cxx_class [i++] = (std::ispunct)(wc, locale) ? 'p' : '-';
+ cxx_class [i++] = (std::isspace)(wc, locale) ? 'S' : '-';
+ cxx_class [i++] = (std::isupper)(wc, locale) ? 'U' : '-';
+ cxx_class [i++] = (std::isxdigit)(wc, locale) ? 'X' : '-';
+
+ i = 0;
+
+ // assign the appropriate letter for the C classification
+ c_class [i++] = (std::iswalnum)(wc) ? 'A' : '-';
+ c_class [i++] = (std::iswalpha)(wc) ? 'a' : '-';
+ c_class [i++] = (std::iswcntrl)(wc) ? 'C' : '-';
+ c_class [i++] = (std::iswdigit)(wc) ? 'D' : '-';
+ c_class [i++] = (std::iswgraph)(wc) ? 'G' : '-';
+ c_class [i++] = (std::iswlower)(wc) ? 'L' : '-';
+ c_class [i++] = (std::iswprint)(wc) ? 'P' : '-';
+ c_class [i++] = (std::iswpunct)(wc) ? 'p' : '-';
+ c_class [i++] = (std::iswspace)(wc) ? 'S' : '-';
+ c_class [i++] = (std::iswupper)(wc) ? 'U' : '-';
+ c_class [i++] = (std::iswxdigit)(wc) ? 'X' : '-';
+
+ // print the value of the character and its glyph only when
+ // it's printable, otherwise print a space
+ std::wcout << " '\\" << std::setw (3)
+ << std::setfill (L'0') << std::oct << wi
+ << "' ('" << ((std::isprint)(wc, locale) ? wc : L' ')
+ << "') ";
+
+ bool mismatch = false;
+
+ // print out the letters denoting each character class
+ for (i = 0; i != sizeof cxx_class; ++i) {
+
+ if (cxx_class [i] == c_class [i])
+ std::wcout << cxx_class [i] << ' ';
+ else {
+ std::wcout << cxx_class [i] << ':' << c_class [i] << ' ';
+ mismatch = true;
+ }
+ }
+
+ if (mismatch) {
+ std::wcout << " *** C/C++ mismatch ***";
+
+ // increment the number of mimatched character classes
+ ++mismatch_count;
+ }
+
+ std::wcout << '\n';
+ }
+
+ return mismatch_count ? 1 : 0;
+}
Propchange: stdcxx/branches/4.2.x/examples/manual/wctype.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: stdcxx/branches/4.2.x/examples/manual/wctype.cpp
------------------------------------------------------------------------------
svn:keywords = Id