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 << "