diff --git a/.gitignore b/.gitignore index 7d93f66..b0e9238 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ cmake-build-debug/ \.idea/ docs/node_modules/ docs/doc/ + +build/ diff --git a/.travis.yml b/.travis.yml index 189bc2c..d322b3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ env: global: - - CONAN_REFERENCE: "MofileReader/0.1.2" + - CONAN_REFERENCE: "MofileReader/1.0.0" - CONAN_USERNAME: "anotherfoxguy" - CONAN_LOGIN_USERNAME: "anotherfoxguy" - - CONAN_CHANNEL: "MofileReader" + - CONAN_CHANNEL: "testing" - CONAN_UPLOAD: "https://api.bintray.com/conan/anotherfoxguy/ror-dependencies" linux: &linux diff --git a/CMakeLists.txt b/CMakeLists.txt index ab046a7..3e69f17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ # moFileReader Main Build Script # # Defined Variables: -# - COMPILE_DLL +# - COMPILE_DLL # - ON : Compiles the code as a shared Library # - OFF : Compiles the code as a static Library # - BUILD_DEBUG @@ -13,12 +13,9 @@ # possible settings. #------------------------------------------------------- cmake_minimum_required(VERSION 3.0) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) project(moFileReader) -# The main include directory -include_directories(BEFORE ${CMAKE_SOURCE_DIR}/include) - - # Let the user choose between static lib and dll # To use it, call cmake -DCOMPILE_DLL=ON option(COMPILE_DLL "Set this to ON if you want to compile the library as an DLL. When this is OFF, a static library is created (default)." OFF) @@ -30,6 +27,9 @@ endif () add_library(moFileReader STATIC ${CMAKE_SOURCE_DIR}/src/moFileReader.cpp ${CMAKE_SOURCE_DIR}/src/mo.cpp) add_executable(moReader ${CMAKE_SOURCE_DIR}/src/mo.cpp) +target_include_directories(moFileReader PRIVATE ${CMAKE_SOURCE_DIR}/include) +target_include_directories(moReader PRIVATE ${CMAKE_SOURCE_DIR}/include) + if (COMPILE_DLL) target_compile_definitions(moReader PRIVATE _CONSOLE MOFILE_IMPORT) else () @@ -42,10 +42,6 @@ target_link_libraries(moReader moFileReader) option(BUILD_TEST "Set this to ON if you want to build the test" OFF) if(BUILD_TEST) + enable_testing() add_subdirectory(test) endif() - - - - - diff --git a/appveyor.yml b/appveyor.yml index 23eaa0e..654673b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,10 +6,10 @@ environment: PYTHON_VERSION: "2.7.8" PYTHON_ARCH: "32" - CONAN_REFERENCE: "MofileReader/0.1.2" + CONAN_REFERENCE: "MofileReader/1.0.0" CONAN_USERNAME: "anotherfoxguy" CONAN_LOGIN_USERNAME: "anotherfoxguy" - CONAN_CHANNEL: "MofileReader" + CONAN_CHANNEL: "testing" CONAN_UPLOAD: "https://api.bintray.com/conan/anotherfoxguy/ror-dependencies" CONAN_VISUAL_VERSIONS: 15 diff --git a/conanfile.py b/conanfile.py index e808df8..f5d4121 100644 --- a/conanfile.py +++ b/conanfile.py @@ -3,7 +3,7 @@ import os class MofilereaderConan(ConanFile): name = "MofileReader" - version = "0.1.2" + version = "1.0.0" license = "MIT" url = "https://github.com/AnotherFoxGuy/conan-MofileReader/" description = "This API lets you read .mo-Files and use their content just as you would do with GNUs gettext." diff --git a/include/moFileConfig.h b/include/moFileConfig.h index cad9c94..32479dc 100644 --- a/include/moFileConfig.h +++ b/include/moFileConfig.h @@ -1,7 +1,8 @@ /* * moFileReader - A simple .mo-File-Reader * Copyright (C) 2009 Domenico Gentner (scorcher24@gmail.com) - * All rights reserved. + * Copyright (C) 2018 Edgar (Edgar@AnotherFoxGuy.com) + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -14,8 +15,8 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * 3. The names of its contributors may not be used to endorse or promote - * products derived from this software without specific prior written + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS @@ -37,9 +38,9 @@ // Defines an export-macro when compiling as dll on woe32. //------------------------------------------------------------- #if defined(MOFILE_EXPORTS) && defined (WIN32) -# define MOEXPORT __declspec(dllexport) -#elif defined (MOFILE_IMPORT) && defined(WIN32) -# define MOEXPORT __declspec(dllimport) +# define MOEXPORT __declspec(dllexport) +#elif defined (MOFILE_IMPORT) && defined(WIN32) +# define MOEXPORT __declspec(dllimport) #else # define MOEXPORT #endif @@ -66,5 +67,3 @@ #endif /* __MOFILECONFIG_H_INCLUDED__ */ - - diff --git a/include/moFileReader.h b/include/moFileReader.h index 8febf15..6d47b97 100644 --- a/include/moFileReader.h +++ b/include/moFileReader.h @@ -1,7 +1,8 @@ /* * moFileReader - A simple .mo-File-Reader * Copyright (C) 2009 Domenico Gentner (scorcher24@gmail.com) - * All rights reserved. + * Copyright (C) 2018 Edgar (Edgar@AnotherFoxGuy.com) + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -14,8 +15,8 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * 3. The names of its contributors may not be used to endorse or promote - * products derived from this software without specific prior written + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS @@ -45,33 +46,10 @@ #endif /** \mainpage moFileReaderSDK - * - * - *

Compilation with Visual C++ (Express and better)

- * - * We provide a project for Visual C++ 2008. You can select 3 Types of Compilation: - * - *

Executable (Release or Debug)

- * - * This will compile the code as an executable which can lookup strings from every .mo-File you load with it. - * This can be handy if you want to have a peek into a file or test something etc. I recommend building the - * release-executable only if you just want to use it. - * - *

Dynamic Loaded Library ( ReleaseDLL )

- * - * This may be overkill, but perhaps you like it modular. This Configuration will create a dll and an import-library. - * Do not forget to link against the import-library and please define MOFILE_IMPORT in your preprocessor-settings, - * otherwise you will receive a bunch of linker-errors. - * You will find all files in the directory "lib" in the Solutions Directory. - * - *

Static Library ( ReleaseLIB )

- * - * This will compile the code as a static library with no Entry-Point. This is the recommended usage. - * But please do not forget to link against moFileReader.static.lib. Otherwise you will receive linker-errors. * *

Compilation via cmake

* - * - Make sure you have cmake installed and in your path. If not, go to http://www.cmake.org and get it. + * - Make sure you have cmake installed and in your path. If not, go to http://www.cmake.org and get it. * - Switch to a Shell or commandline * - Run cmake in $INSTALLDIR\\build. See cmake --help for possible generators. Here are the available Options: * - COMPILE_DLL Setting this to ON will compile the library as a shared module. By default, a static library is built. @@ -84,13 +62,13 @@ * \endcode * * cmake will compile the library and moReader[.exe]-binary, which can do lookups in moFiles and export moFiles as HTML. - * See moReader[.exe] --help for details. + * See moReader[.exe] --help for details. * You will find the libraries in %%projectdir%%/lib and the binary in %%projectdir%%/bin * * - *

None of those?

+ *

Include in project

* - * The last option is to simply add moFileReader.cpp, moFileReader.h and moFileConfig.h to your project. Thats all you have to do. + * The last option is to simply add moFileReader.cpp, moFileReader.h and moFileConfig.h to your project. Thats all you have to do. * You can safely exclude mo.cpp, since this file keeps the entry-points of the .exe and .dll only. * *

Usage

@@ -108,7 +86,7 @@ * } * * // Now, you can lookup the strings you stored in the .mo-File: - * std::cout << reader.Lookup("MyTranslationString") << std::endl; + * std::cout << reader.Lookup("MyTranslationString") << std::endl; * * \endcode * Thats all! This small code has no dependencies, except the C/C++-runtime of your compiler, @@ -118,7 +96,13 @@ * a file to test it and I hate to release stuff I wasn't able to test. * *

Changelog

- * + * + * - Version 1.0.0 + * - Added new function: LookupWithContext + * - Added unit-tests + * - Added support for packaging with Conan + * - Moved project to https://github.com/AnotherFoxGuy/MofileReader + * * - Version 0.1.2 * - Generic improvements to the documentation. * - Generic improvements to the code @@ -126,11 +110,11 @@ * message if only --export or --lookup where missing. * - Added -h, --help and -? to moReader[.exe]. It will print the help-screen. * - Added --version and -v to moReader[.exe]. It will print some informations about the program. - * - Added --license to moReader[.exe]. This will print its license. - * - --export gives now a feedback about success or failure. - * - The HTML-Dump-Method outputs now the whole table from the empty msgid in a nice html-table, not only a few hardcoded. - * - I had an issue-report that the Error-Constants can collide with foreign code under certain conditions, - * so I added a patch which renamed the error-constants to more compatible names. + * - Added --license to moReader[.exe]. This will print its license. + * - --export gives now a feedback about success or failure. + * - The HTML-Dump-Method outputs now the whole table from the empty msgid in a nice html-table, not only a few hardcoded. + * - I had an issue-report that the Error-Constants can collide with foreign code under certain conditions, + * so I added a patch which renamed the error-constants to more compatible names. * * - Version 0.1.1 * - Added the ability to export mo's as HTML. @@ -152,7 +136,7 @@ * \n * Thanks for using this piece of OpenSource-Software.\n * Submit patches and/or bugs on https://github.com/AnotherFoxGuy/MofileReader. - * Send your flames, dumb comments etc to /dev/null, thank you. + * Send your flames, dumb comments etc to /dev/null, thank you. */ @@ -161,7 +145,7 @@ About Warning 4251: http://support.microsoft.com/default.aspx?scid=KB;EN-US;16. - I am aware of this warning and know how to deal with it. + I am aware of this warning and know how to deal with it. To avoid that derived projects are influenced by this warning I have deactivated it for your convinience. Note: This warning only occurs, when using this code as a DLL. @@ -208,8 +192,8 @@ a:hover{color:blue;}\ struct moTranslationPairInformation { /// \brief Constructor - moTranslationPairInformation() - : m_orLength(0), m_orOffset(0), + moTranslationPairInformation() + : m_orLength(0), m_orOffset(0), m_trLength(0), m_trOffset(0) {} @@ -229,13 +213,13 @@ struct moTranslationPairInformation /** * \brief Describes the "Header" of a .mo-File. * - * - * The File info keeps the header of a .mo-file and + * + * The File info keeps the header of a .mo-file and * a list of the string-descriptions. * The typedef is for the type of the string-list. * The constructor ensures, that all members get a nice * initial value. - */ + */ struct moFileInfo { /// \brief Type for the list of all Translation-Pair-Descriptions. @@ -244,53 +228,53 @@ struct moFileInfo /// \brief Constructor moFileInfo() : m_magicNumber(0), m_fileVersion(0), m_numStrings(0), - m_offsetOriginal(0), m_offsetTranslation(0), m_sizeHashtable(0), + m_offsetOriginal(0), m_offsetTranslation(0), m_sizeHashtable(0), m_offsetHashtable(0), m_reversed(false) {} /// \brief The Magic Number, compare it to g_MagicNumber. - int m_magicNumber; - + int m_magicNumber; + /// \brief The File Version, 0 atm according to the manpage. - int m_fileVersion; + int m_fileVersion; /// \brief Number of Strings in the .mo-file. - int m_numStrings; + int m_numStrings; /// \brief Offset of the Table of the Original Strings - int m_offsetOriginal; + int m_offsetOriginal; /// \brief Offset of the Table of the Translated Strings - int m_offsetTranslation; + int m_offsetTranslation; /// \brief Size of 1 Entry in the Hashtable. - int m_sizeHashtable; + int m_sizeHashtable; /// \brief The Offset of the Hashtable. - int m_offsetHashtable; + int m_offsetHashtable; /** \brief Tells you if the bytes are reversed * \note When this is true, the bytes are reversed and the Magic number is like g_MagicReversed */ - bool m_reversed; + bool m_reversed; /// \brief A list containing offset and length of the strings in the file. - moTranslationPairList m_translationPairInformation; + moTranslationPairList m_translationPairInformation; }; -/** +/** * \brief This class is a gettext-replacement. * * * The usage is quite simple:\n - * Tell the class which .mo-file it shall load via + * Tell the class which .mo-file it shall load via * moFileReader::ReadFile(). The method will attempt to load * the file, all translations will be stored in memory. * Afterwards you can lookup the strings with moFileReader::Lookup() just * like you would do with gettext. - * Additionally, you can call moFileReader::ReadFile() for as much files as you + * Additionally, you can call moFileReader::ReadFile() for as much files as you * like. But please be aware, that if there are duplicated keys (original strings), - * that they will replace each other in the lookup-table. There is no check done, if a + * that they will replace each other in the lookup-table. There is no check done, if a * key already exists. * * \note If you add "Lookup" to the keywords of the gettext-parser (like poEdit), @@ -306,10 +290,10 @@ protected: public: - /// \brief The Magic Number describes the endianess of bytes on the system. + /// \brief The Magic Number describes the endianess of bytes on the system. static const long MagicNumber = 0x950412DE; - /// \brief If the Magic Number is Reversed, we need to swap the bytes. + /// \brief If the Magic Number is Reversed, we need to swap the bytes. static const long MagicReversed = 0xDE120495; /// \brief The possible errorcodes for methods of this class @@ -330,14 +314,14 @@ public: /// \brief Empty Lookup-Table (returned by ExportAsHTML()) EC_TABLEEMPTY, - /// \brief The magic number did not match - EC_MAGICNUMBER_NOMATCH, + /// \brief The magic number did not match + EC_MAGICNUMBER_NOMATCH, /** * \brief The magic number is reversed. * \note This is an error until the class supports it. */ - EC_MAGICNUMBER_REVERSED, + EC_MAGICNUMBER_REVERSED, }; /** \brief Reads a .mo-file @@ -361,17 +345,26 @@ public: virtual eErrorCode ReadFile(const char* filename); /** \brief Returns the searched translation or returns the input. - * \param[in,out] id The id of the translation to search for. + * \param[in] id The id of the translation to search for. * \return The value you passed in via _id or the translated string. */ virtual std::string Lookup( const char* id ) const; + /** \brief Returns the searched translation or returns the input, restricted to the context given by context. + * See https://www.gnu.org/software/gettext/manual/html_node/Contexts.html for more info. + * \param[in] context The id of the translation to search for. + * \param[in] id The id of the translation to search for. + * \return The value you passed in via _id or the translated string. + */ + virtual std::string LookupWithContext (const char* context, const char* id) const; + + /// \brief Returns the Error Description. virtual const std::string& GetErrorDescription() const; /// \brief Empties the Lookup-Table. virtual void ClearTable(); - + /** \brief Returns the Number of Entries in our Lookup-Table. * \note The mo-File-table always contains an empty msgid, which contains informations * about the tranlsation-project. So the real number of strings is always minus 1. @@ -379,9 +372,9 @@ public: virtual unsigned int GetNumStrings() const; /** \brief Exports the whole content of the .mo-File as .html - * \param[in] infile The .mo-File to export. - * \param[in] filename Where to store the .html-file. If empty, the path and filename of the _infile with .html appended. - * \param[in,out] css The css-script for the visual style of the + * \param[in] infile The .mo-File to export. + * \param[in] filename Where to store the .html-file. If empty, the path and filename of the _infile with .html appended. + * \param[in,out] css The css-script for the visual style of the * file, in case you don't like mine ;). * \see g_css for the possible and used css-values. */ @@ -395,7 +388,7 @@ protected: * \param[in] in The value to swap. * \return The swapped value. */ - unsigned long SwapBytes(unsigned long in); + unsigned long SwapBytes(unsigned long in); private: // Holds the lookup-table @@ -410,29 +403,29 @@ private: * * * This class derives from moFileReader and builds a singleton to access its methods - * in a global manner. + * in a global manner. * \note This class is a Singleton. Please access it via moFileReaderSingleton::GetInstance() * or use the provided wrappers:\n * - moReadMoFile() * - _() - * - moFileClearTable() + * - moFileClearTable() * - moFileGetErrorDescription() * - moFileGetNumStrings(); */ class MOEXPORT moFileReaderSingleton : public moFileReader { private: - // Private Contructor and Copy-Constructor to avoid + // Private Contructor and Copy-Constructor to avoid // that this class is instanced. moFileReaderSingleton(); moFileReaderSingleton(const moFileReaderSingleton&); moFileReaderSingleton& operator=(const moFileReaderSingleton&); - + public: - /** \brief Singleton-Accessor. + /** \brief Singleton-Accessor. * \return A static instance of moFileReaderSingleton. */ - static moFileReaderSingleton& GetInstance(); + static moFileReaderSingleton& GetInstance(); }; /** \brief Reads the .mo-File. @@ -455,6 +448,16 @@ inline std::string _(const char* id) return r; } +/** \brief Looks for the spec. string to translate. + * \param[in] id The string-id to search. + * \return The translation if found, otherwise it returns id. + */ +inline std::string _L(const char* id) +{ + std::string r = moFileReaderSingleton::GetInstance().Lookup(id); + return r; +} + /// \brief Resets the Lookup-Table. inline void moFileClearTable() { @@ -462,7 +465,7 @@ inline void moFileClearTable() } /// \brief Returns the last known error as string or an empty class. -inline std::string moFileGetErrorDescription() +inline std::string moFileGetErrorDescription() { std::string r = moFileReaderSingleton::GetInstance().GetErrorDescription(); return r; diff --git a/src/mo.cpp b/src/mo.cpp index 8753dcf..09505dc 100644 --- a/src/mo.cpp +++ b/src/mo.cpp @@ -1,7 +1,8 @@ /* * moFileReader - A simple .mo-File-Reader * Copyright (C) 2009 Domenico Gentner (scorcher24@gmail.com) - * All rights reserved. + * Copyright (C) 2018 Edgar (Edgar@AnotherFoxGuy.com) + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -14,8 +15,8 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * 3. The names of its contributors may not be used to endorse or promote - * products derived from this software without specific prior written + * 3. The names of its contributors may not be used to endorse or promote + * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS @@ -30,12 +31,12 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "../include/moFileReader.h" +#include "moFileReader.h" #include #include #if defined(_MSC_VER) && defined(_DEBUG) -# include +# include #endif /* _MSC_VER */ using namespace moFileLib; @@ -45,8 +46,8 @@ void Usage(const std::string appname) std::cout << "Usage: " << std::endl; std::cout << appname << "