/***************************************************************************
 *
 * gencat.cpp - Utility for generating message catalogs on Windows
 *
 * $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 system(), getenv()
#include <cstdio>    // for printf()
#include <cstring>   // for strcmp(), strrchr()
#include <cstddef>   // for size_t

#include <string>

static const char
usage_text[] = {
    "Usage: %s OUTPUT-FILE INPUT-FILE\n"
    "Generate message catalog.\n"
    "\n"
    "  -?, --help                 Give this help list\n"
};

#ifdef _WIN32
#  define SLASH '\\'

// replace file extension in str by new extension ext
static void change_ext (std::string& str, const char* ext)
{
    const std::string::size_type npos = std::string::npos;
    std::string::size_type dot_pos = str.find_last_of ('.');
    std::string::size_type quote_pos =
        npos == dot_pos ? str.find_last_of ('\"')
        : str.find_first_of ('\"', dot_pos);
    if (npos == quote_pos)
        quote_pos = str.size ();
    if (npos == dot_pos)
        dot_pos = quote_pos;
    str.replace (dot_pos, quote_pos - dot_pos, ext);
}

#else    // !_WIN32
#  define SLASH '/'
#endif   // _WIN32

int main (int argc, char *argv[])
{
    const char* exe_name = std::strrchr (argv [0], SLASH);
    if (exe_name)
        ++exe_name;
    else
        exe_name = argv [0];

    if (1 == argc) {
        std::printf (usage_text, exe_name);
        return 0;
    }

    --argc;

    while (0 != *++argv && 0 < argc-- && '-' == **argv) {

        switch (*++*argv) {

        case '?':
            std::printf (usage_text, exe_name);
            return 0;

        case '-':
            if (0 == std::strcmp (*argv, "-help")) {
                std::printf (usage_text, exe_name);
                return 0;
            }

            // fall through...
        default:
            std::printf ("%s: invalid option -%s\n",
                         exe_name, *argv);
            return 1;
        }
    }

    if (1 > argc) {
        std::printf ("%s: missing arguments\n Try '%s --help'\n",
                     exe_name, exe_name);
        return 1;
    }

    std::string cmd;

#ifdef _WIN32

#  ifndef _WIN64
#    define PLATFORM "X86"
#  else   // _WIN64
#    define PLATFORM "X64"
#  endif  // _WIN64

    const char* const env_vars [] = {
        "VS90COMNTOOLS", "VS80COMNTOOLS",
        "VS71COMNTOOLS", "VSCOMNTOOLS"
    };

    for (size_t i = 0; i < sizeof (env_vars) / sizeof (*env_vars); ++i) {
        if (const char* vcvarspath = std::getenv (env_vars [i])) {
            cmd = vcvarspath;
            cmd += "vsvars32.bat";
            break;
        }
    }

    if (std::string::npos != cmd.find (' ')) {
        cmd.insert (cmd.begin (), 1, '\"');
        cmd.push_back ('\"');
    }

    const char* const dll_name = argv [0];
    const char* const rc_name = argv [1];

    std::string res_name (rc_name);
    change_ext (res_name, ".res");

    if (!cmd.empty ())
        cmd += " && ";

    cmd += "rc ";
    cmd += rc_name;
    cmd += " && link /NOLOGO /DLL /NOENTRY /MACHINE:" PLATFORM " /OUT:";
    cmd += dll_name;
    cmd += ' ';
    cmd += res_name;
    
    const int ret = std::system (cmd.c_str ());

    std::remove (res_name.c_str ());

#else    // !_WIN32

    const char* const cat_name = argv [0];
    const char* const msg_name = argv [1];

    cmd = "/usr/bin/gencat ";
    cmd += cat_name;
    cmd += ' ';
    cmd += msg_name;

    const int ret = std::system (cmd.c_str ());

#endif   // _WIN32

    return ret;
}
