/*************************************************************************** * * locale_stub.cpp * * $Id: locale_stub.cpp 648752 2008-04-16 17:01:56Z faridz $ * *************************************************************************** * * 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 // for size_t, system() #include // 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 = 0; 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; const char localedef[] = "localedef"; arglen += sizeof localedef; // allocate space for the new command line char* const cmdline = new char [arglen]; // 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, '\\'); } if (slash) std::strcpy (slash + 1, localedef); else std::strcpy (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; }