blob: 1e7aecdd701e1583062ef3f8fa84cd7efb384734 [file] [log] [blame]
/***************************************************************************
*
* 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 <cassert> // for assert()
#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 = "gencat";
if (argv [0]) {
if (const char* slash = std::strrchr (argv [0], SLASH))
exe_name = slash + 1;
else
exe_name = argv [0];
}
assert (exe_name);
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;
}