stdcxx-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From se...@apache.org
Subject svn commit: r526304 - in /incubator/stdcxx/trunk: etc/config/GNUmakefile.bin util/locale.cpp util/locale_stub.cpp util/localedef.cpp
Date Fri, 06 Apr 2007 22:34:42 GMT
Author: sebor
Date: Fri Apr  6 15:34:41 2007
New Revision: 526304

URL: http://svn.apache.org/viewvc?view=rev&rev=526304
Log:
2007-04-06  Martin Sebor  <sebor@roguewave.com>

	STDCXX-386
	* locale.cpp (main): Renamed...
	(locale_main): ...to this and removed exception handling.
	(print_mon): Added missing comma.
	* localedef.cpp (main): Renamed...
	(localedef_main): ...to this and removed exception handling.
	(main): Invoked locale_main() or localedef_main() depending on whether
	the first command line option is the special keyword "--locale-mode"
	or something else. Handled exceptions from either function.
	* locale_stub.cpp: New. Invokes localedef --locale-mode ...
	* GNUmakefile.bin (localedef): Added a dependency on locale.o and
	memchk.o.
	(locale): Replaced all dependencies with one on locale_stub.o so
	as to avoid linking the same object files into more than one program.

Added:
    incubator/stdcxx/trunk/util/locale_stub.cpp   (with props)
Modified:
    incubator/stdcxx/trunk/etc/config/GNUmakefile.bin
    incubator/stdcxx/trunk/util/locale.cpp
    incubator/stdcxx/trunk/util/localedef.cpp

Modified: incubator/stdcxx/trunk/etc/config/GNUmakefile.bin
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/etc/config/GNUmakefile.bin?view=diff&rev=526304&r1=526303&r2=526304
==============================================================================
--- incubator/stdcxx/trunk/etc/config/GNUmakefile.bin (original)
+++ incubator/stdcxx/trunk/etc/config/GNUmakefile.bin Fri Apr  6 15:34:41 2007
@@ -69,17 +69,15 @@
 	$(LD) $^ -o $@ $(LDFLAGS.exec) $(LDLIBS) $(call CXX.repo,$<) $(TEEOPTS)
 
 # link the localedef utility
-localedef: localedef.o aliases.o charmap.o codecvt.o collate.o ctype.o \
-           def.o diagnostic.o messages.o monetary.o numeric.o path.o   \
-           time.o scanner.o
+localedef: localedef.o locale.o aliases.o charmap.o codecvt.o collate.o \
+           ctype.o def.o diagnostic.o memchk.o messages.o monetary.o    \
+           numeric.o path.o time.o scanner.o
 	@echo "$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS)" $(call CXX.repo,$<) \
 	>> $(LOGFILE)
 	$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS) $(call CXX.repo,$<) $(TEEOPTS)
 
 # link the locale utility
-locale: locale.o aliases.o charmap.o codecvt.o collate.o def.o ctype.o \
-        diagnostic.o memchk.o messages.o monetary.o numeric.o path.o   \
-        scanner.o time.o
+locale: locale_stub.o
 	@echo "$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS)" $(call CXX.repo,$<) \
 	>> $(LOGFILE)
 	$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS) $(call CXX.repo,$<) $(TEEOPTS)

Modified: incubator/stdcxx/trunk/util/locale.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/locale.cpp?view=diff&rev=526304&r1=526303&r2=526304
==============================================================================
--- incubator/stdcxx/trunk/util/locale.cpp (original)
+++ incubator/stdcxx/trunk/util/locale.cpp Fri Apr  6 15:34:41 2007
@@ -1924,7 +1924,7 @@
 print_mon (const char *keyword, int print_cat)
 {
     static const char str[][10] = {
-        "January", "February", "March", "April", "May", "June"
+        "January", "February", "March", "April", "May", "June",
         "July", "August", "September", "October", "November", "December"
     };
 
@@ -2816,130 +2816,113 @@
 };
 
 
-int main (int argc, char *argv[])
+int locale_main (int argc, char *argv[])
 {
-    try {
-        const char* const program_name = argv [0];
+    const char* const program_name = argv [0];
 
-        if (1 == argc) {
-            // print all localization environment variables
-            print_lc_vars ();
-        }
-        else {
-            init_sections ();
+    if (1 == argc) {
+        // print all localization environment variables
+        print_lc_vars ();
+    }
+    else {
+        init_sections ();
 
-            --argc;
+        --argc;
 
-            while (0 != *++argv && 0 < argc-- && '-' == **argv) {
+        while (0 != *++argv && 0 < argc-- && '-' == **argv) {
 
-                switch (*++*argv) {
+            switch (*++*argv) {
 
-                case 'a':
-                    // -a: print the names of all installed locales
-                    print_locale_names ();
-                    return EXIT_SUCCESS;
+            case 'a':
+                // -a: print the names of all installed locales
+                print_locale_names ();
+                return EXIT_SUCCESS;
 
-                case 'k':
-                    // -k: print the names of keywords when printing
-                    //     their values
+            case 'k':
+                // -k: print the names of keywords when printing
+                //     their values
+                print_keywords = true;
+                break;
+
+            case 'c':
+                // -c[k]: print the name of each section
+                print_sect_names = true;
+                if (*(*argv + 1) == 'k')
                     print_keywords = true;
-                    break;
+                break;
 
-                case 'c':
-                    // -c[k]: print the name of each section
-                    print_sect_names = true;
-                    if (*(*argv + 1) == 'k')
-                        print_keywords = true;
-                    break;
+            case 'm':
+                print_charmap_names ();
+                return EXIT_SUCCESS;
+
+            case 'h':
+                // -h: use character names from the original charmap
+                //     used by localedef to build the locale (if possible)
+                decode = true;
+                break;
 
-                case 'm':
-                    print_charmap_names ();
-                    return EXIT_SUCCESS;
+            case 'l':
+                // -l: produce output suitable as input for processing
+                //     by the localedef utility
+                posix_output = false;
+                break;
+
+            case 'p':
+                // -p: produce output using symbols from the Portable
+                //     Character Set whenever possible
+                use_pcs      = true;
+                posix_output = false;
+                break;
+
+            case 'w':
+                if (std::strlen (*argv) == 1)
+                    issue_diag (W_DISABLE, 0, 0, 0);
+                else
+                    issue_diag (std::atoi (++*argv), 0, 0, 0);
+                break;
 
-                case 'h':
-                    // -h: use character names from the original charmap
-                    //     used by localedef to build the locale (if possible)
-                    decode = true;
-                    break;
-
-                case 'l':
-                    // -l: produce output suitable as input for processing
-                    //     by the localedef utility
-                    posix_output = false;
-                    break;
-
-                case 'p':
-                    // -p: produce output using symbols from the Portable
-                    //     Character Set whenever possible
-                    use_pcs      = true;
-                    posix_output = false;
-                    break;
-
-                case 'w':
-                    if (std::strlen (*argv) == 1)
-                        issue_diag (W_DISABLE, 0, 0, 0);
-                    else
-                        issue_diag (std::atoi (++*argv), 0, 0, 0);
-                    break;
+            case '?':
+                print_help ();
+                return EXIT_SUCCESS;
 
-                case '?':
+            case '-':
+                if (0 == std::strcmp (*argv, "-help")) {
                     print_help ();
                     return EXIT_SUCCESS;
+                }
 
-                case '-':
-                    if (0 == std::strcmp (*argv, "-help")) {
-                        print_help ();
-                        return EXIT_SUCCESS;
-                    }
-
-                    if (0 == std::strcmp (*argv, "-charmap")) {
-                        print_charmap ();
-                        return EXIT_SUCCESS;
-                    }
-
-                    // fall through...
-
-                default:
-                    issue_diag (504, true, 0, "%s: invalid option "
-                                "-%s\n", program_name, *argv);
+                if (0 == std::strcmp (*argv, "-charmap")) {
+                    print_charmap ();
+                    return EXIT_SUCCESS;
                 }
-            }
 
-            if (0 == *argv) {
-                issue_diag (505, true, 0, "%s: missing argument\n Try '"
-                            "%s --help'\n", program_name, program_name);
+                // fall through...
+
+            default:
+                issue_diag (504, true, 0, "%s: invalid option "
+                            "-%s\n", program_name, *argv);
             }
+        }
 
-            for (; 0 != *argv; ++argv) {
+        if (0 == *argv) {
+            issue_diag (505, true, 0, "%s: missing argument\n Try '"
+                        "%s --help'\n", program_name, program_name);
+        }
+
+        for (; 0 != *argv; ++argv) {
 
-                for (std::size_t i = 0; handlers [i].name; ++i) {
-                    if (0 == std::strcmp (*argv, handlers [i].name)) {
+            for (std::size_t i = 0; handlers [i].name; ++i) {
+                if (0 == std::strcmp (*argv, handlers [i].name)) {
 
-                        const int arg =
-                            -1 == handlers [i].arg ? print_sect_names
-                                                   : handlers [i].arg;
+                    const int arg =
+                        -1 == handlers [i].arg ? print_sect_names
+                        : handlers [i].arg;
 
-                        handlers [i].print (handlers [i].name, arg);
-                    }
+                    handlers [i].print (handlers [i].name, arg);
                 }
             }
         }
     }
-    catch (loc_exception&) {
-        return 1;
-    }
-    catch (const std::exception& error) {
-        std::cerr <<"Error: " << error.what () << '\n';
-        return 1;
-    }
-    catch (...) {
-        std::cerr << "unknown exception\n";
-        return 1;
-    }
-
-#ifdef _RWSTD_NO_ISO_10646_WCHAR_T
-        //      std::setlocale (LC_CTYPE, saved_loc_name);
-#endif   // _RWSTD_NO_ISO_10646_WCHAR_T
 
     return EXIT_SUCCESS;
 }

Added: incubator/stdcxx/trunk/util/locale_stub.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/locale_stub.cpp?view=auto&rev=526304
==============================================================================
--- incubator/stdcxx/trunk/util/locale_stub.cpp (added)
+++ incubator/stdcxx/trunk/util/locale_stub.cpp Fri Apr  6 15:34:41 2007
@@ -0,0 +1,78 @@
+/***************************************************************************
+ *
+ * locale_stub.cpp
+ *
+ * $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.
+ *
+ **************************************************************************/
+
+#include <cstdlib>   // for size_t, system()
+#include <cstring>   // for strcat(), strlen()
+
+
+int main (int argc, char *argv[])
+{
+    // compute the total length of the command line arguments
+    std::size_t arglen = 0;
+    for (int i = 1; i != argc; ++i)
+        arglen += std::strlen (argv [i]);
+
+    // add the length of space separating adjacent pairs
+    arglen += argc;
+
+    // add the length of the option to invoke localeded in locale mode
+    const char argv_1[] = "--locale-mode";
+    arglen += sizeof argv_1;
+
+    // allocate space for the new command line
+    char* const cmdline = new char [arglen + 3];
+
+    // replace the basename of argv[0] with "localedef" keeping the
+    // directory portion, if it's there, followed by the new option
+    // separated by a space
+    std::strcpy (cmdline, argv [0]);
+    char* slash = std::strrchr (cmdline, '/');
+
+    if (0 == slash) {
+        // look for backslash for Windoze
+        slash = std::strrchr (cmdline, '\\');
+    }
+
+    std::strcpy (slash ? slash + 1 : cmdline, "localedef");
+
+    std::strcat (cmdline, " ");
+    std::strcat (cmdline, argv_1);
+
+    // copy arguments to the newly allocated buffer
+    for (int i = 1; i != argc; ++i) {
+        std::strcat (cmdline, " ");
+        std::strcat (cmdline, argv [i]);
+    }
+
+    // invoke the localedef utility instructing it to switch
+    // to locale mode
+    const int status = std::system (cmdline);
+
+    // clean up
+    delete[] cmdline;
+
+    return status;
+}

Propchange: incubator/stdcxx/trunk/util/locale_stub.cpp
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: incubator/stdcxx/trunk/util/localedef.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/util/localedef.cpp?view=diff&rev=526304&r1=526303&r2=526304
==============================================================================
--- incubator/stdcxx/trunk/util/localedef.cpp (original)
+++ incubator/stdcxx/trunk/util/localedef.cpp Fri Apr  6 15:34:41 2007
@@ -6,16 +6,23 @@
  *
  ***************************************************************************
  *
- * Copyright (c) 1994-2005 Quovadx,  Inc., acting through its  Rogue Wave
- * Software division. Licensed 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.
+ * 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 2001-2006 Rogue Wave Software.
  * 
  **************************************************************************/
 
@@ -514,51 +521,79 @@
 }
 
 
+int localedef_main (int argc, char *argv[])
+{
+    ProgramOptions opts;
+
+    if (!process_command_line (&opts, argc, argv))
+        return EXIT_OK;
+
+    if (opts.gen) {
+        // create the locale databases as specified in generation list
+        generate_locales (opts.map_file, opts.alias_file,
+                          opts.charmap_dir.c_str (),
+                          opts.src_dir.c_str (),
+                          opts.output_dir.c_str (),
+                          opts.use_ucs,
+                          opts.no_position,
+                          opts.link_aliases);
+    }
+    else {
+        assert (0 != opts.locale_name);
+
+        // C++ locale name requested
+        std::string std_locale (opts.locale_name);
+
+        // retrieve the output directory if any
+        std::string std_outdir ("");
+
+        if (std_locale.rfind (_RWSTD_PATH_SEP) != std::string::npos) {
+            std_outdir = 
+                std_locale.substr (
+                    0, std_locale.rfind (_RWSTD_PATH_SEP) + 1);
+
+            std_locale = 
+                std_locale.substr (std_locale.rfind (_RWSTD_PATH_SEP) + 1,
+                                   std_locale.size ());
+        }
+
+        // create the locale database
+        create_locale (opts.source_name, opts.charmap_name,
+                       std_outdir, std_locale,
+                       opts.force_output, opts.use_ucs,
+                       opts.no_position, opts.link_aliases);
+    }
+
+    return EXIT_OK;
+}
+
+
+// defined in locale.cpp
+int locale_main (int, char*[]);
+
+
 int main (int argc, char *argv[])
 {
     int exit_status = EXIT_OK;
 
     try {
 
-        ProgramOptions opts;
-
-        if (!process_command_line (&opts, argc, argv))
-            return exit_status;
-
-        if (opts.gen) {
-            // create the locale databases as specified in generation list
-            generate_locales (opts.map_file, opts.alias_file,
-                              opts.charmap_dir.c_str (),
-                              opts.src_dir.c_str (),
-                              opts.output_dir.c_str (),
-                              opts.use_ucs,
-                              opts.no_position,
-                              opts.link_aliases);
-        }
-        else {
-            assert (0 != opts.locale_name);
+        if (1 < argc && 0 == std::strcmp (argv [1], "--locale-mode")) {
 
-            // C++ locale name requested
-            std::string std_locale (opts.locale_name);
+            // invoked with the special option ""--locale-mode"
+            // to act like the locale utility
 
-            // retrieve the output directory if any
-            std::string std_outdir ("");
+            // remove argv [1] from command line
+            for (int i = 2; argv [i]; ++i)
+                argv [i - 1] = argv [i];
 
-            if (std_locale.rfind (_RWSTD_PATH_SEP) != std::string::npos) {
-                std_outdir = 
-                    std_locale.substr (
-                        0, std_locale.rfind (_RWSTD_PATH_SEP) + 1);
-
-                std_locale = 
-                    std_locale.substr (std_locale.rfind (_RWSTD_PATH_SEP) + 1,
-                                       std_locale.size ());
-            }
+            // NULL-terminate argv
+            argv [argc - 1] = 0;
 
-            // create the locale database
-            create_locale (opts.source_name, opts.charmap_name,
-                           std_outdir, std_locale,
-                           opts.force_output, opts.use_ucs,
-                           opts.no_position, opts.link_aliases);
+            exit_status = locale_main (argc - 1, argv);
+        }
+        else {
+            exit_status = localedef_main (argc, argv);
         }
     }
     catch (const std::ios::failure& error) {



Mime
View raw message