/***************************************************************************
 *
 * 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 <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 = 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;
}
