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


Reply via email to