diff --git a/native/dicttoolkit/NativeFileList.mk b/native/dicttoolkit/NativeFileList.mk index b6be9c541161eba342819716b0302fd66cc9d2ed..2ba9859a1ec87dada9bf2307f6fd2675099e29fa 100644 --- a/native/dicttoolkit/NativeFileList.mk +++ b/native/dicttoolkit/NativeFileList.mk @@ -15,7 +15,9 @@ LATIN_IME_DICT_TOOLKIT_MAIN_SRC_FILES := \ dict_toolkit_main.cpp -LATIN_IME_DICT_TOOLKIT_SRC_FILES := +LATIN_IME_DICT_TOOLKIT_SRC_FILES := \ + utils/command_utils.cpp LATIN_IME_DICT_TOOLKIT_TEST_FILES := \ - dict_toolkit_defines_test.cpp + dict_toolkit_defines_test.cpp \ + utils/command_utils_test.cpp diff --git a/native/dicttoolkit/UnitTests.mk b/native/dicttoolkit/UnitTests.mk index d568db44ad50dd7ab70da1f5b1c369b8a0957ef1..96e28730e88a772553485ca77c8bb6d032331230 100644 --- a/native/dicttoolkit/UnitTests.mk +++ b/native/dicttoolkit/UnitTests.mk @@ -46,6 +46,7 @@ include $(BUILD_HOST_STATIC_LIBRARY) include $(CLEAR_VARS) # TODO: Remove -std=c++11 once it is set by default on host build. +LOCAL_ADDRESS_SANITIZER := true LOCAL_CFLAGS += -std=c++11 -Wno-unused-parameter -Wno-unused-function LOCAL_CLANG := true LOCAL_CXX_STL := libc++ diff --git a/native/dicttoolkit/dict_toolkit_main.cpp b/native/dicttoolkit/dict_toolkit_main.cpp index d71b50eb41ffd1c52f2482c6a3ec6fd3ff66fd4d..22db3d4d15c47c3daf4abff23761a063492724d5 100644 --- a/native/dicttoolkit/dict_toolkit_main.cpp +++ b/native/dicttoolkit/dict_toolkit_main.cpp @@ -16,8 +16,25 @@ #include <cstdio> +#include "dict_toolkit_defines.h" +#include "utils/command_utils.h" + +void usage(int argc, char **argv) { + fprintf(stderr, "Usage: %s <command> [arguments]\n", argc > 0 ? argv[0] : "dicttoolkit"); +} + int main(int argc, char **argv) { + if (argc < MIN_ARG_COUNT) { + usage(argc, argv); + return 0; + } + using namespace latinime::dicttoolkit; + const CommandType commandType = CommandUtils::getCommandType(argv[1]); + if (commandType == CommandType::Unknown) { + CommandUtils::printCommandUnknownMessage(argv[0], argv[1]); + return 0; + } // TODO: Implement. - printf("%s\n", argv[0]); + fprintf(stderr, "Command '%s' has not been implemented yet.\n", argv[1]); return 0; } diff --git a/native/dicttoolkit/src/dict_toolkit_defines.h b/native/dicttoolkit/src/dict_toolkit_defines.h index 2a2104e267001d6ebe1a7e6ae9a2cff253c42718..dbaae0ca0fd07f339035de285f72b02729492d14 100644 --- a/native/dicttoolkit/src/dict_toolkit_defines.h +++ b/native/dicttoolkit/src/dict_toolkit_defines.h @@ -19,4 +19,6 @@ #include "defines.h" +#define MIN_ARG_COUNT 2 + #endif // LATINIME_DICT_TOOLKIT_DEFINES_H diff --git a/native/dicttoolkit/src/utils/command_utils.cpp b/native/dicttoolkit/src/utils/command_utils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..14fd4778132d816502fc5dde508933bd1130695d --- /dev/null +++ b/native/dicttoolkit/src/utils/command_utils.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed 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 "utils/command_utils.h" + +namespace latinime { +namespace dicttoolkit { + +const char *const CommandUtils::COMMAND_NAME_INFO = "info"; +const char *const CommandUtils::COMMAND_NAME_DIFF = "diff"; +const char *const CommandUtils::COMMAND_NAME_MAKEDICT = "makedict"; +const char *const CommandUtils::COMMAND_NAME_HEADER = "header"; +const char *const CommandUtils::COMMAND_NAME_HELP = "help"; + +/* static */ CommandType CommandUtils::getCommandType(const std::string &commandName) { + if (commandName == COMMAND_NAME_INFO) { + return CommandType::Info; + } else if (commandName == COMMAND_NAME_DIFF) { + return CommandType::Diff; + } else if (commandName == COMMAND_NAME_MAKEDICT) { + return CommandType::Makedict; + } else if (commandName == COMMAND_NAME_HEADER) { + return CommandType::Header; + } else if (commandName == COMMAND_NAME_HELP) { + return CommandType::Help; + } else { + return CommandType::Unknown; + } +} + +} // namespace dicttoolkit +} // namespace latinime diff --git a/native/dicttoolkit/src/utils/command_utils.h b/native/dicttoolkit/src/utils/command_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..7df0dd9701702f470126f6ae53b3164cecd73d18 --- /dev/null +++ b/native/dicttoolkit/src/utils/command_utils.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed 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. + */ + +#ifndef LATINIME_DICT_TOOLKIT_COMMAND_UTILS_H +#define LATINIME_DICT_TOOLKIT_COMMAND_UTILS_H + +#include <cstdio> +#include <string> + +#include "dict_toolkit_defines.h" + +namespace latinime { +namespace dicttoolkit { + +enum class CommandType : int { + Info, + Diff, + Makedict, + Header, + Help, + Unknown +}; + +class CommandUtils { +public: + static CommandType getCommandType(const std::string &commandName); + + static void printCommandUnknownMessage(const std::string &programName, + const std::string &commandName) { + fprintf(stderr, "Command '%s' is unknown. Try '%s %s' for more information.\n", + commandName.c_str(), programName.c_str(), COMMAND_NAME_HELP); + } + +private: + DISALLOW_IMPLICIT_CONSTRUCTORS(CommandUtils); + + static const char *const COMMAND_NAME_INFO; + static const char *const COMMAND_NAME_DIFF; + static const char *const COMMAND_NAME_MAKEDICT; + static const char *const COMMAND_NAME_HEADER; + static const char *const COMMAND_NAME_HELP; +}; +} // namespace dicttoolkit +} // namespace latinime +#endif // LATINIME_DICT_TOOLKIT_COMMAND_UTILS_H diff --git a/native/dicttoolkit/tests/utils/command_utils_test.cpp b/native/dicttoolkit/tests/utils/command_utils_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9d79c9dd9aa6eb6a5fe90f4d13091c44c006f498 --- /dev/null +++ b/native/dicttoolkit/tests/utils/command_utils_test.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed 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 "utils/command_utils.h" + +#include <gtest/gtest.h> + +namespace latinime { +namespace dicttoolkit { +namespace { + +TEST(CommandUtilsTests, TestGetCommandType) { + EXPECT_EQ(CommandUtils::getCommandType(""), CommandType::Unknown); + EXPECT_EQ(CommandUtils::getCommandType("abc"), CommandType::Unknown); + EXPECT_EQ(CommandUtils::getCommandType("info"), CommandType::Info); + EXPECT_EQ(CommandUtils::getCommandType("diff"), CommandType::Diff); + EXPECT_EQ(CommandUtils::getCommandType("makedict"), CommandType::Makedict); + EXPECT_EQ(CommandUtils::getCommandType("header"), CommandType::Header); + EXPECT_EQ(CommandUtils::getCommandType("help"), CommandType::Help); +} + +} // namespace +} // namespace dicttoolkit +} // namespace latinime