✨ Added LookupWithContext
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -4,3 +4,5 @@ cmake-build-debug/
 | 
			
		||||
\.idea/
 | 
			
		||||
docs/node_modules/
 | 
			
		||||
docs/doc/
 | 
			
		||||
 | 
			
		||||
build/
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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."
 | 
			
		||||
 
 | 
			
		||||
@@ -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__ */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
  * 
 | 
			
		||||
  *
 | 
			
		||||
  * <h2>Compilation with Visual C++ (Express and better)</h2>
 | 
			
		||||
  *
 | 
			
		||||
  * We provide a project for Visual C++ 2008. You can select 3 Types of Compilation:
 | 
			
		||||
  *
 | 
			
		||||
  * <h3>Executable (Release or Debug)</h3>
 | 
			
		||||
  *
 | 
			
		||||
  * 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.
 | 
			
		||||
  *
 | 
			
		||||
  * <h3>Dynamic Loaded Library ( ReleaseDLL )</h3>
 | 
			
		||||
  *
 | 
			
		||||
  * 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.
 | 
			
		||||
  *
 | 
			
		||||
  * <h3>Static Library ( ReleaseLIB )</h3>
 | 
			
		||||
  *
 | 
			
		||||
  * 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.
 | 
			
		||||
  *
 | 
			
		||||
  * <h2>Compilation via cmake</h2>
 | 
			
		||||
  *
 | 
			
		||||
  * - 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
 | 
			
		||||
  *
 | 
			
		||||
  *
 | 
			
		||||
  * <h2>None of those?</h2>
 | 
			
		||||
  * <h2>Include in project</h2>
 | 
			
		||||
  *
 | 
			
		||||
  * 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.
 | 
			
		||||
  *
 | 
			
		||||
  * <h2>Usage</h2>
 | 
			
		||||
@@ -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.
 | 
			
		||||
  *
 | 
			
		||||
  * <h2>Changelog</h2>
 | 
			
		||||
  * 
 | 
			
		||||
  *
 | 
			
		||||
  * - 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;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								src/mo.cpp
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								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 <iostream>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && defined(_DEBUG)
 | 
			
		||||
#   include <crtdbg.h>   
 | 
			
		||||
#   include <crtdbg.h>
 | 
			
		||||
#endif /* _MSC_VER */
 | 
			
		||||
 | 
			
		||||
using namespace moFileLib;
 | 
			
		||||
@@ -45,8 +46,8 @@ void Usage(const std::string appname)
 | 
			
		||||
    std::cout << "Usage: "                                                                  << std::endl;
 | 
			
		||||
    std::cout << appname << " <option> <params>"                                           << std::endl;
 | 
			
		||||
    std::cout << "Possible Options: "                                                       << std::endl;
 | 
			
		||||
    std::cout << "--lookup <mofile> <msgid>        - Outputs the given ID from the file."   << std::endl;    
 | 
			
		||||
    std::cout << "--export <mofile> [<exportfile>] - Exports the whole .mo-file as HTML."   << std::endl;        
 | 
			
		||||
    std::cout << "--lookup <mofile> <msgid>        - Outputs the given ID from the file."   << std::endl;
 | 
			
		||||
    std::cout << "--export <mofile> [<exportfile>] - Exports the whole .mo-file as HTML."   << std::endl;
 | 
			
		||||
    std::cout << "--help,-h,-?  - Prints this screen"                                       << std::endl;
 | 
			
		||||
    std::cout << "--license     - Prints the license of this program. "                     << std::endl;
 | 
			
		||||
    std::cout                                                                               << std::endl;
 | 
			
		||||
@@ -107,7 +108,7 @@ int main( int, char** argv )
 | 
			
		||||
            long flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
 | 
			
		||||
            flag |= _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF;
 | 
			
		||||
            _CrtSetDbgFlag(flag);
 | 
			
		||||
#endif /* _MSC_VER && _DEBUG */    
 | 
			
		||||
#endif /* _MSC_VER && _DEBUG */
 | 
			
		||||
 | 
			
		||||
    std::string appname = GetAppName(argv[0]);
 | 
			
		||||
 | 
			
		||||
@@ -146,7 +147,7 @@ int main( int, char** argv )
 | 
			
		||||
        {
 | 
			
		||||
            outfile = argv[3];
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        moFileReader::eErrorCode r = moFileReader::ExportAsHTML(argv[2], outfile);
 | 
			
		||||
        if (  r == moFileReader::EC_SUCCESS )
 | 
			
		||||
        {
 | 
			
		||||
@@ -161,7 +162,7 @@ int main( int, char** argv )
 | 
			
		||||
        else if ( r == moFileReader::EC_FILENOTFOUND )
 | 
			
		||||
        {
 | 
			
		||||
            std::cout << "Could not dump " << argv[2] << " to " << outfile << " because I could not open a file!" << std::endl;
 | 
			
		||||
            return EXIT_FAILURE;            
 | 
			
		||||
            return EXIT_FAILURE;
 | 
			
		||||
        }
 | 
			
		||||
        else if ( r == moFileReader::EC_FILEINVALID )
 | 
			
		||||
        {
 | 
			
		||||
@@ -229,4 +230,3 @@ int WINAPI DllMain( DWORD reason, LPVOID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* Compilation-Mode */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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,13 +31,13 @@
 | 
			
		||||
 * 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 <iostream>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
MO_BEGIN_NAMESPACE
 | 
			
		||||
 | 
			
		||||
unsigned long moFileReader::SwapBytes(unsigned long in) 
 | 
			
		||||
unsigned long moFileReader::SwapBytes(unsigned long in)
 | 
			
		||||
{
 | 
			
		||||
    unsigned long b0 = (in >> 0) & 0xff;
 | 
			
		||||
    unsigned long b1 = (in >> 8) & 0xff;
 | 
			
		||||
@@ -64,7 +65,7 @@ unsigned int moFileReader::GetNumStrings() const
 | 
			
		||||
std::string moFileReader::Lookup( const char* id ) const
 | 
			
		||||
{
 | 
			
		||||
    if ( m_lookup.size() <= 0) return id;
 | 
			
		||||
    moLookupList::const_iterator iterator = m_lookup.find(id);    
 | 
			
		||||
    moLookupList::const_iterator iterator = m_lookup.find(id);
 | 
			
		||||
 | 
			
		||||
    if ( iterator == m_lookup.end() )
 | 
			
		||||
    {
 | 
			
		||||
@@ -73,17 +74,33 @@ std::string moFileReader::Lookup( const char* id ) const
 | 
			
		||||
    return iterator->second;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string moFileReader::LookupWithContext (const char* context, const char* id) const
 | 
			
		||||
{
 | 
			
		||||
    std::string idName = context;
 | 
			
		||||
    idName += '\x04';
 | 
			
		||||
    idName += id;
 | 
			
		||||
 | 
			
		||||
    if (m_lookup.size () <= 0) return id;
 | 
			
		||||
    moLookupList::const_iterator iterator = m_lookup.find (idName);
 | 
			
		||||
 | 
			
		||||
    if (iterator == m_lookup.end ())
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
    return iterator->second;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
moFileReader::eErrorCode moFileReader::ParseData(std::string data)
 | 
			
		||||
{
 | 
			
		||||
    // Creating a file-description.
 | 
			
		||||
    moFileInfo moInfo;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Reference to the List inside moInfo.
 | 
			
		||||
    moFileInfo::moTranslationPairList& TransPairInfo = moInfo.m_translationPairInformation;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Opening the file.
 | 
			
		||||
    std::stringstream stream(data);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Read in all the 4 bytes of fire-magic, offsets and stuff...
 | 
			
		||||
    stream.read((char*)&moInfo.m_magicNumber, 4);
 | 
			
		||||
    stream.read((char*)&moInfo.m_fileVersion, 4);
 | 
			
		||||
@@ -92,14 +109,14 @@ moFileReader::eErrorCode moFileReader::ParseData(std::string data)
 | 
			
		||||
    stream.read((char*)&moInfo.m_offsetTranslation, 4);
 | 
			
		||||
    stream.read((char*)&moInfo.m_sizeHashtable, 4);
 | 
			
		||||
    stream.read((char*)&moInfo.m_offsetHashtable, 4);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if ( stream.bad() )
 | 
			
		||||
    {
 | 
			
		||||
        m_error = "Stream bad during reading. The .mo-file seems to be invalid or has bad descriptions!";
 | 
			
		||||
        printf("%s", m_error.c_str());
 | 
			
		||||
        return moFileReader::EC_FILEINVALID;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Checking the Magic Number
 | 
			
		||||
    if ( MagicNumber != moInfo.m_magicNumber )
 | 
			
		||||
    {
 | 
			
		||||
@@ -116,7 +133,7 @@ moFileReader::eErrorCode moFileReader::ParseData(std::string data)
 | 
			
		||||
            return moFileReader::EC_MAGICNUMBER_REVERSED;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Now we search all Length & Offsets of the original strings
 | 
			
		||||
    for ( int i = 0; i < moInfo.m_numStrings; i++ )
 | 
			
		||||
    {
 | 
			
		||||
@@ -129,10 +146,10 @@ moFileReader::eErrorCode moFileReader::ParseData(std::string data)
 | 
			
		||||
            printf("%s", m_error.c_str());
 | 
			
		||||
            return moFileReader::EC_FILEINVALID;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        TransPairInfo.push_back(_str);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Get all Lengths & Offsets of the translated strings
 | 
			
		||||
    // Be aware: The Descriptors already exist in our list, so we just mod. refs from the deque.
 | 
			
		||||
    for ( int i = 0; i < moInfo.m_numStrings; i++ )
 | 
			
		||||
@@ -147,61 +164,61 @@ moFileReader::eErrorCode moFileReader::ParseData(std::string data)
 | 
			
		||||
            return moFileReader::EC_FILEINVALID;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Normally you would read the hash-table here, but we don't use it. :)
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Now to the interesting part, we read the strings-pairs now
 | 
			
		||||
    for ( int i = 0; i < moInfo.m_numStrings; i++)
 | 
			
		||||
    {
 | 
			
		||||
        // We need a length of +1 to catch the trailing \0.
 | 
			
		||||
        int orLength = TransPairInfo[i].m_orLength+1;
 | 
			
		||||
        int trLength = TransPairInfo[i].m_trLength+1;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        int orOffset = TransPairInfo[i].m_orOffset;
 | 
			
		||||
        int trOffset = TransPairInfo[i].m_trOffset;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // Original
 | 
			
		||||
        char* original  = new char[orLength];
 | 
			
		||||
        memset(original, 0, sizeof(char)*orLength);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        stream.seekg(orOffset);
 | 
			
		||||
        stream.read(original, orLength);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if ( stream.bad() )
 | 
			
		||||
        {
 | 
			
		||||
            m_error = "Stream bad during reading. The .mo-file seems to be invalid or has bad descriptions!";
 | 
			
		||||
            printf("%s", m_error.c_str());
 | 
			
		||||
            return moFileReader::EC_FILEINVALID;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // Translation
 | 
			
		||||
        char* translation = new char[trLength];
 | 
			
		||||
        memset(translation, 0, sizeof(char)*trLength);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        stream.seekg(trOffset);
 | 
			
		||||
        stream.read(translation, trLength);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if ( stream.bad() )
 | 
			
		||||
        {
 | 
			
		||||
            m_error = "Stream bad during reading. The .mo-file seems to be invalid or has bad descriptions!";
 | 
			
		||||
            printf("%s", m_error.c_str());
 | 
			
		||||
            return moFileReader::EC_FILEINVALID;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // Store it in the map.
 | 
			
		||||
        m_lookup[std::string(original)] = std::string(translation);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // Cleanup...
 | 
			
		||||
        delete original;
 | 
			
		||||
        delete translation;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Done :)
 | 
			
		||||
    return moFileReader::EC_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
moFileReader::eErrorCode moFileReader::ReadFile( const char* filename )
 | 
			
		||||
{    
 | 
			
		||||
{
 | 
			
		||||
    // Creating a file-description.
 | 
			
		||||
    moFileInfo moInfo;
 | 
			
		||||
 | 
			
		||||
@@ -247,11 +264,11 @@ moFileReader::eErrorCode moFileReader::ReadFile( const char* filename )
 | 
			
		||||
            return moFileReader::EC_MAGICNUMBER_REVERSED;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Now we search all Length & Offsets of the original strings
 | 
			
		||||
    for ( int i = 0; i < moInfo.m_numStrings; i++ )
 | 
			
		||||
    {
 | 
			
		||||
        moTranslationPairInformation _str;        
 | 
			
		||||
        moTranslationPairInformation _str;
 | 
			
		||||
        stream.read((char*)&_str.m_orLength, 4);
 | 
			
		||||
        stream.read((char*)&_str.m_orOffset, 4);
 | 
			
		||||
        if ( stream.bad() )
 | 
			
		||||
@@ -303,7 +320,7 @@ moFileReader::eErrorCode moFileReader::ReadFile( const char* filename )
 | 
			
		||||
            m_error = "Stream bad during reading. The .mo-file seems to be invalid or has bad descriptions!";
 | 
			
		||||
            return moFileReader::EC_FILEINVALID;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // Translation
 | 
			
		||||
        char* translation = new char[trLength];
 | 
			
		||||
        memset(translation, 0, sizeof(char)*trLength);
 | 
			
		||||
@@ -317,7 +334,7 @@ moFileReader::eErrorCode moFileReader::ReadFile( const char* filename )
 | 
			
		||||
            return moFileReader::EC_FILEINVALID;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Store it in the map.    
 | 
			
		||||
        // Store it in the map.
 | 
			
		||||
        m_lookup[std::string(original)] = std::string(translation);
 | 
			
		||||
 | 
			
		||||
        // Cleanup...
 | 
			
		||||
@@ -344,7 +361,7 @@ moFileReader::eErrorCode moFileReader::ExportAsHTML(std::string infile, std::str
 | 
			
		||||
    if ( reader.m_lookup.empty() )
 | 
			
		||||
    {
 | 
			
		||||
        return moFileReader::EC_TABLEEMPTY;
 | 
			
		||||
    }    
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Beautify Output
 | 
			
		||||
    std::string fname;
 | 
			
		||||
@@ -363,11 +380,11 @@ moFileReader::eErrorCode moFileReader::ExportAsHTML(std::string infile, std::str
 | 
			
		||||
    if (htmlfile.empty())
 | 
			
		||||
    {
 | 
			
		||||
        htmlfile = infile + std::string(".html");
 | 
			
		||||
    }   
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Ok, now prepare output.
 | 
			
		||||
    std::ofstream stream(htmlfile.c_str());
 | 
			
		||||
    if ( stream.is_open() ) 
 | 
			
		||||
    if ( stream.is_open() )
 | 
			
		||||
    {
 | 
			
		||||
        stream << R"(<!DOCTYPE HTML PUBLIC "- //W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">)"
 | 
			
		||||
               << std::endl;
 | 
			
		||||
@@ -383,7 +400,7 @@ moFileReader::eErrorCode moFileReader::ExportAsHTML(std::string infile, std::str
 | 
			
		||||
 | 
			
		||||
        std::stringstream parsee;
 | 
			
		||||
        parsee << reader.Lookup("");
 | 
			
		||||
     
 | 
			
		||||
 | 
			
		||||
        while ( !parsee.eof() )
 | 
			
		||||
        {
 | 
			
		||||
            char buffer[1024];
 | 
			
		||||
@@ -402,7 +419,7 @@ moFileReader::eErrorCode moFileReader::ExportAsHTML(std::string infile, std::str
 | 
			
		||||
 | 
			
		||||
        // Now output the content
 | 
			
		||||
        stream << R"(<table border="1"><th colspan="2">Content</th>)" << std::endl;
 | 
			
		||||
        for ( moLookupList::const_iterator it = reader.m_lookup.begin(); 
 | 
			
		||||
        for ( moLookupList::const_iterator it = reader.m_lookup.begin();
 | 
			
		||||
             it != reader.m_lookup.end(); it++)
 | 
			
		||||
        {
 | 
			
		||||
            if ( it->first != "" ) // Skip the empty msgid, its the table we handled above.
 | 
			
		||||
@@ -421,12 +438,12 @@ moFileReader::eErrorCode moFileReader::ExportAsHTML(std::string infile, std::str
 | 
			
		||||
    {
 | 
			
		||||
        return moFileReader::EC_FILENOTFOUND;
 | 
			
		||||
    }
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
    return moFileReader::EC_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Removes spaces from front and end. 
 | 
			
		||||
// Removes spaces from front and end.
 | 
			
		||||
void moFileReader::Trim(std::string& in)
 | 
			
		||||
{
 | 
			
		||||
    while ( in[0] == ' ' )
 | 
			
		||||
@@ -477,7 +494,7 @@ void moFileReader::MakeHtmlConform(std::string& inout)
 | 
			
		||||
        {
 | 
			
		||||
            inout.replace(i, 1, "(");
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -489,7 +506,7 @@ moFileReaderSingleton& moFileReaderSingleton::GetInstance()
 | 
			
		||||
{
 | 
			
		||||
    static moFileReaderSingleton theoneandonly;
 | 
			
		||||
    return theoneandonly;
 | 
			
		||||
} 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
moFileReaderSingleton::moFileReaderSingleton(const moFileReaderSingleton& )
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,13 @@ include(${CMAKE_BINARY_DIR}/conan.cmake)
 | 
			
		||||
 | 
			
		||||
conan_cmake_run(REQUIRES gtest/1.8.1@bincrafters/stable BASIC_SETUP CMAKE_TARGETS BUILD missing)
 | 
			
		||||
 | 
			
		||||
add_executable(test test.cpp)
 | 
			
		||||
target_link_libraries(test CONAN_PKG::gtest moFileReader)
 | 
			
		||||
add_test(NAME mo_test COMMAND test)
 | 
			
		||||
add_executable(moFileReaderTest test.cpp)
 | 
			
		||||
target_include_directories(moFileReaderTest PRIVATE ${CMAKE_SOURCE_DIR}/include)
 | 
			
		||||
target_link_libraries(moFileReaderTest CONAN_PKG::gtest moFileReader)
 | 
			
		||||
add_test(NAME mo_test COMMAND moFileReaderTest)
 | 
			
		||||
 | 
			
		||||
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test.mo DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/bin/)
 | 
			
		||||
add_custom_command(
 | 
			
		||||
	TARGET moFileReaderTest POST_BUILD
 | 
			
		||||
  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/test.mo $<TARGET_FILE_DIR:moFileReaderTest>/test.mo
 | 
			
		||||
	COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/test.mo ${CMAKE_CURRENT_BINARY_DIR}/test.mo
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,2 +1,2 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
xgettext -o test.pot -k_L -s -j test.cpp
 | 
			
		||||
xgettext -o test.pot -k_ -k"_LC:1c,2" -s -c --package-name=moFileReader test.cpp
 | 
			
		||||
@@ -2,19 +2,35 @@
 | 
			
		||||
#include "moFileReader.h"
 | 
			
		||||
#include "gtest/gtest.h"
 | 
			
		||||
 | 
			
		||||
#define _L(str) moFileLib::moFileReaderSingleton::GetInstance().Lookup(str)
 | 
			
		||||
using namespace moFileLib;
 | 
			
		||||
#define _LC(ctx,str) moFileReaderSingleton::GetInstance().LookupWithContext(ctx,str)
 | 
			
		||||
 | 
			
		||||
auto testMo = "test.mo";
 | 
			
		||||
 | 
			
		||||
TEST(moFileReader, setup)
 | 
			
		||||
{
 | 
			
		||||
	EXPECT_EQ(moFileLib::moFileReaderSingleton::GetInstance().ReadFile(testMo), moFileLib::moFileReader::EC_SUCCESS);
 | 
			
		||||
	EXPECT_EQ(moFileReaderSingleton::GetInstance().ReadFile(testMo), moFileLib::moFileReader::EC_SUCCESS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(moFileReader, Lookup)
 | 
			
		||||
{
 | 
			
		||||
	moFileLib::moFileReaderSingleton::GetInstance().ReadFile(testMo);
 | 
			
		||||
	EXPECT_EQ("Text Nederlands Een", _L("String English One"));
 | 
			
		||||
	EXPECT_EQ("Text Nederlands Twee", _L("String English Two"));
 | 
			
		||||
	EXPECT_EQ("Text Nederlands Drie", _L("String English Three"));
 | 
			
		||||
    moFileReaderSingleton::GetInstance ().ReadFile (testMo);
 | 
			
		||||
    /* This is the first comment. */
 | 
			
		||||
    EXPECT_EQ ("Text Nederlands Een", _ ("String English One"));
 | 
			
		||||
    /* This is the second comment. */
 | 
			
		||||
    EXPECT_EQ ("Text Nederlands Twee", _ ("String English Two"));
 | 
			
		||||
    /* This is the third comment.  */
 | 
			
		||||
    EXPECT_EQ ("Text Nederlands Drie", _ ("String English Three"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEST (moFileReader, LookupWithContext)
 | 
			
		||||
{
 | 
			
		||||
    moFileReaderSingleton::GetInstance ().ReadFile (testMo);
 | 
			
		||||
    /* This is the first comment. */
 | 
			
		||||
    EXPECT_EQ ("Text Nederlands Een", _LC ("TEST|String|1", "String English"));
 | 
			
		||||
    /* This is the second comment. */
 | 
			
		||||
    EXPECT_EQ ("Text Nederlands Twee", _LC ("TEST|String|2", "String English"));
 | 
			
		||||
    /* This is the third comment.  */
 | 
			
		||||
    EXPECT_EQ ("Text Nederlands Drie", _LC ("TEST|String|3", "String English"));
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								test/test.mo
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								test/test.mo
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										51
									
								
								test/test.po
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								test/test.po
									
									
									
									
									
								
							@@ -5,27 +5,64 @@
 | 
			
		||||
#
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: \n"
 | 
			
		||||
"Project-Id-Version: moFileReader\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2018-12-13 10:49+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2018-12-13 11:00+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-12-13 14:39+0100\n"
 | 
			
		||||
"PO-Revision-Date: 2018-12-13 14:40+0100\n"
 | 
			
		||||
"Last-Translator: \n"
 | 
			
		||||
"Language-Team: \n"
 | 
			
		||||
"Language-Team: Test\n"
 | 
			
		||||
"Language: nl\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.6\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
"X-Generator: Poedit 2.2\n"
 | 
			
		||||
 | 
			
		||||
#: test.cpp:21
 | 
			
		||||
#. This is the first comment.
 | 
			
		||||
#: test.cpp:31
 | 
			
		||||
msgctxt "TEST|String|1"
 | 
			
		||||
msgid "String English"
 | 
			
		||||
msgstr "Text Nederlands Een"
 | 
			
		||||
 | 
			
		||||
#. This is the second comment.
 | 
			
		||||
#: test.cpp:33
 | 
			
		||||
msgctxt "TEST|String|2"
 | 
			
		||||
msgid "String English"
 | 
			
		||||
msgstr "Text Nederlands Twee"
 | 
			
		||||
 | 
			
		||||
#. This is the third comment.
 | 
			
		||||
#: test.cpp:35
 | 
			
		||||
msgctxt "TEST|String|3"
 | 
			
		||||
msgid "String English"
 | 
			
		||||
msgstr "Text Nederlands Drie"
 | 
			
		||||
 | 
			
		||||
#. This is the first comment.
 | 
			
		||||
#: test.cpp:19
 | 
			
		||||
msgid "String English One"
 | 
			
		||||
msgstr "Text Nederlands Een"
 | 
			
		||||
 | 
			
		||||
#. This is the third comment.
 | 
			
		||||
#: test.cpp:23
 | 
			
		||||
msgid "String English Three"
 | 
			
		||||
msgstr "Text Nederlands Drie"
 | 
			
		||||
 | 
			
		||||
#: test.cpp:22
 | 
			
		||||
#. This is the second comment.
 | 
			
		||||
#: test.cpp:21
 | 
			
		||||
msgid "String English Two"
 | 
			
		||||
msgstr "Text Nederlands Twee"
 | 
			
		||||
 | 
			
		||||
#~ msgctxt "TEST|String|1"
 | 
			
		||||
#~ msgid "String English One"
 | 
			
		||||
#~ msgstr "Text Nederlands Een"
 | 
			
		||||
 | 
			
		||||
#~ msgctxt "TEST|String|3"
 | 
			
		||||
#~ msgid "String English Three"
 | 
			
		||||
#~ msgstr "Text Nederlands Drie"
 | 
			
		||||
 | 
			
		||||
#~ msgctxt "TEST|String|2"
 | 
			
		||||
#~ msgid "String English Two"
 | 
			
		||||
#~ msgstr "Text Nederlands Twee"
 | 
			
		||||
 | 
			
		||||
#~ msgctxt "Menu|"
 | 
			
		||||
#~ msgid "File"
 | 
			
		||||
#~ msgstr "Bestand"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +1,51 @@
 | 
			
		||||
# SOME DESCRIPTIVE TITLE.
 | 
			
		||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# This file is distributed under the same license as the moFileReader package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
			
		||||
"Project-Id-Version: moFileReader\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2018-12-13 10:49+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-12-13 14:39+0100\n"
 | 
			
		||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
			
		||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
			
		||||
"Language: \n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Type: text/plain; charset=CHARSET\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
 | 
			
		||||
#: test.cpp:21
 | 
			
		||||
#. This is the first comment.
 | 
			
		||||
#: test.cpp:31
 | 
			
		||||
msgctxt "TEST|String|1"
 | 
			
		||||
msgid "String English"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. This is the second comment.
 | 
			
		||||
#: test.cpp:33
 | 
			
		||||
msgctxt "TEST|String|2"
 | 
			
		||||
msgid "String English"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. This is the third comment.
 | 
			
		||||
#: test.cpp:35
 | 
			
		||||
msgctxt "TEST|String|3"
 | 
			
		||||
msgid "String English"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. This is the first comment.
 | 
			
		||||
#: test.cpp:19
 | 
			
		||||
msgid "String English One"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#. This is the third comment.
 | 
			
		||||
#: test.cpp:23
 | 
			
		||||
msgid "String English Three"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: test.cpp:22
 | 
			
		||||
#. This is the second comment.
 | 
			
		||||
#: test.cpp:21
 | 
			
		||||
msgid "String English Two"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user