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 <[EMAIL PROTECTED]>
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) {