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