+ import from github

This commit is contained in:
scorcher24
2015-08-04 06:00:51 +02:00
commit e86fcb8827
17 changed files with 2998 additions and 0 deletions

232
src/mo.cpp Normal file
View File

@ -0,0 +1,232 @@
/*
* moFileReader - A simple .mo-File-Reader
* Copyright (C) 2009 Domenico Gentner (scorcher24@gmail.com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* 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
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* 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 <iostream>
#include <cstdlib>
#if defined(_MSC_VER) && defined(_DEBUG)
# include <crtdbg.h>
#endif /* _MSC_VER */
using namespace moFileLib;
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 << "--help,-h,-? - Prints this screen" << std::endl;
std::cout << "--license - Prints the license of this program. " << std::endl;
std::cout << std::endl;
std::cout << "Example: " << appname << " --export my18n.mo exportfile.html" << std::endl;
std::cout << "Example: " << appname << " --lookup my18n.mo lookupstring" << std::endl;
std::cout << "Please encapsualte strings or pathes with spaces in \". Thank you." << std::endl;
std::cout << "Parameters in Brackets [] are optional." << std::endl;
}
void PrintLicense()
{
std::cout << "\
moFileReader - A simple .mo-File-Reader\n\
Copyright (C) 2009 Domenico Gentner (scorcher24@gmail.com)\n\
All rights reserved. \n\
\n\
Redistribution and use in source and binary forms, with or without\n\
modification, are permitted provided that the following conditions\n\
are met:\n\
\n\
1. Redistributions of source code must retain the above copyright\n\
notice, this list of conditions and the following disclaimer.\n\
2. Redistributions in binary form must reproduce the above copyright\n\
notice, this list of conditions and the following disclaimer in the\n\
documentation and/or other materials provided with the distribution.\n\
\n\
3. The names of its contributors may not be used to endorse or promote \n\
products derived from this software without specific prior written \n\
permission.\n\
\n\
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\
\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n\
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n\
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n\
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n\
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n\
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n\
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n\
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\
" << std::endl;
}
std::string GetAppName(const char* raw)
{
std::string r(raw);
int first = r.find_last_of(moPATHSEP) + 1;
r = r.substr(first, r.length() - first);
return r;
}
#if defined(_CONSOLE)
int main( int, char** argv )
{
#if defined (_DEBUG) && defined(_MSC_VER)
long flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF;
_CrtSetDbgFlag(flag);
#endif /* _MSC_VER && _DEBUG */
std::string appname = GetAppName(argv[0]);
if ( argv[1] == NULL )
{
Usage(appname);
return EXIT_FAILURE;
}
if ( std::string(argv[1]) == "--help" || std::string(argv[1]) == "-?" || std::string(argv[1]) == "-h" )
{
Usage(appname);
return EXIT_SUCCESS;
}
else if ( std::string(argv[1]) == "-v" || std::string(argv[1]) == "--version" )
{
std::cout << "This program is part of the moReaderSDK written by Domenico Gentner." << std::endl;
std::cout << "Released under the Terms of the MIT-License." << std::endl;
std::cout << "Type " << appname << " --license to view it." << std::endl;
std::cout << "Get all News and Updates from http://mofilereader.googlecode.com." << std::endl;
return EXIT_SUCCESS;
}
else if ( std::string(argv[1]) == "--license" )
{
PrintLicense();
return EXIT_SUCCESS;
}
else if ( std::string(argv[1]) == "--export" )
{
std::string outfile;
if ( argv[2] == NULL )
{
Usage(appname);
return EXIT_FAILURE;
}
if ( argv[3] )
{
outfile = argv[3];
}
moFileReader::eErrorCode r = moFileReader::ExportAsHTML(argv[2], outfile);
if ( r == moFileReader::EC_SUCCESS )
{
std::cout << "Dumped " << argv[2] << " successfully to " << outfile << std::endl;
return EXIT_SUCCESS;
}
else if ( r == moFileReader::EC_TABLEEMPTY )
{
std::cout << "Could not dump " << argv[2] << " to " << outfile << " because the lookup-table is empty!" << std::endl;
return EXIT_FAILURE;
}
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;
}
else if ( r == moFileReader::EC_FILEINVALID )
{
std::cout << "Could not dump " << argv[2] << " to " << outfile << " because the .mo-File was invalid!" << std::endl;
return EXIT_FAILURE;
}
else
{
std::cout << "Could not dump " << argv[2] << " to " << outfile << ". An unknown error occured." << std::endl;
return EXIT_FAILURE;
}
}
else if ( std::string(argv[1]) == "--lookup")
{
if ( argv[2] == NULL || argv[3] == NULL )
{
Usage(appname);
if (argv[3] == NULL)
std::cout << "HINT: If you want to call an empty msgid, please use \"\" as parameter 3." << std::endl;
return EXIT_FAILURE;
}
if ( moReadMoFile(argv[2]) != moFileReader::EC_SUCCESS )
{
std::cout << "Error while loading the file: " << moFileGetErrorDescription() << std::endl;
return -1;
}
std::cout << "-----------------------------------------" << std::endl;
std::cout << "Lookup: " << argv[3] << std::endl;
std::cout << "Result: " << _(argv[3]) << std::endl;
std::cout << "-----------------------------------------" << std::endl;
return EXIT_SUCCESS;
}
else
{
Usage(appname);
std::cout << std::endl;
std::cout << "HINT: Missing --export or --lookup!" << std::endl;
return EXIT_FAILURE;
}
}
#elif defined(_USRDLL) && defined(WIN32)
#include <windows.h>
extern "C"
int WINAPI DllMain( DWORD reason, LPVOID)
{
switch (reason)
{
case DLL_THREAD_ATTACH:
case DLL_PROCESS_ATTACH:
{
#if defined (_DEBUG) && defined(_MSC_VER)
long flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF;
_CrtSetDbgFlag(flag);
#endif /* _MSC_VER && _DEBUG */
break;
}
default:
return FALSE;
};
return TRUE;
}
#endif /* Compilation-Mode */

509
src/moFileReader.cpp Normal file
View File

@ -0,0 +1,509 @@
/*
* moFileReader - A simple .mo-File-Reader
* Copyright (C) 2009 Domenico Gentner (scorcher24@gmail.com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* 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
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* 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 <iostream>
#include <cstdlib>
MO_BEGIN_NAMESPACE
unsigned long moFileReader::SwapBytes(unsigned long in)
{
unsigned long b0 = (in >> 0) & 0xff;
unsigned long b1 = (in >> 8) & 0xff;
unsigned long b2 = (in >> 16) & 0xff;
unsigned long b3 = (in >> 24) & 0xff;
return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
}
const std::string& moFileReader::GetErrorDescription() const
{
return m_error;
}
void moFileReader::ClearTable()
{
m_lookup.clear();
}
unsigned int moFileReader::GetNumStrings() const
{
return m_lookup.size();
}
std::string moFileReader::Lookup( const char* id ) const
{
if ( m_lookup.size() <= 0) return id;
moLookupList::const_iterator iterator = m_lookup.find(id);
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);
stream.read((char*)&moInfo.m_numStrings, 4);
stream.read((char*)&moInfo.m_offsetOriginal, 4);
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 )
{
if ( MagicReversed != moInfo.m_magicNumber )
{
m_error = "The Magic Number does not match in all cases!";
printf("%s", m_error.c_str());
return moFileReader::EC_MAGICNUMBER_NOMATCH;
}
else
{
moInfo.m_reversed = true;
m_error = "Magic Number is reversed. We do not support this yet!";
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;
stream.read((char*)&_str.m_orLength, 4);
stream.read((char*)&_str.m_orOffset, 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;
}
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++ )
{
moTranslationPairInformation& _str = TransPairInfo[i];
stream.read((char*)&_str.m_trLength, 4);
stream.read((char*)&_str.m_trOffset, 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;
}
}
// 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;
// Reference to the List inside moInfo.
moFileInfo::moTranslationPairList& TransPairInfo = moInfo.m_translationPairInformation;
// Opening the file.
std::ifstream stream( filename, std::ios_base::binary | std::ios_base::in );
if ( !stream.is_open() )
{
m_error = std::string("Cannot open File ") + std::string(filename);
return moFileReader::EC_FILENOTFOUND;
}
// 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);
stream.read((char*)&moInfo.m_numStrings, 4);
stream.read((char*)&moInfo.m_offsetOriginal, 4);
stream.read((char*)&moInfo.m_offsetTranslation, 4);
stream.read((char*)&moInfo.m_sizeHashtable, 4);
stream.read((char*)&moInfo.m_offsetHashtable, 4);
if ( stream.bad() )
{
stream.close();
m_error = "Stream bad during reading. The .mo-file seems to be invalid or has bad descriptions!";
return moFileReader::EC_FILEINVALID;
}
// Checking the Magic Number
if ( MagicNumber != moInfo.m_magicNumber )
{
if ( MagicReversed != moInfo.m_magicNumber )
{
m_error = "The Magic Number does not match in all cases!";
return moFileReader::EC_MAGICNUMBER_NOMATCH;
}
else
{
moInfo.m_reversed = true;
m_error = "Magic Number is reversed. We do not support this yet!";
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;
stream.read((char*)&_str.m_orLength, 4);
stream.read((char*)&_str.m_orOffset, 4);
if ( stream.bad() )
{
stream.close();
m_error = "Stream bad during reading. The .mo-file seems to be invalid or has bad descriptions!";
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++ )
{
moTranslationPairInformation& _str = TransPairInfo[i];
stream.read((char*)&_str.m_trLength, 4);
stream.read((char*)&_str.m_trOffset, 4);
if ( stream.bad() )
{
stream.close();
m_error = "Stream bad during reading. The .mo-file seems to be invalid or has bad descriptions!";
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!";
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!";
return moFileReader::EC_FILEINVALID;
}
// Store it in the map.
m_lookup[std::string(original)] = std::string(translation);
// Cleanup...
delete original;
delete translation;
}
// Done :)
stream.close();
return moFileReader::EC_SUCCESS;
}
moFileReader::eErrorCode moFileReader::ExportAsHTML(std::string infile, std::string filename, std::string css )
{
// Read the file
moFileReader reader;
moFileReader::eErrorCode r = reader.ReadFile(infile.c_str()) ;
if ( r != moFileReader::EC_SUCCESS )
{
return r;
}
if ( reader.m_lookup.empty() )
{
return moFileReader::EC_TABLEEMPTY;
}
// Beautify Output
std::string fname;
unsigned int pos = infile.find_last_of(moPATHSEP);
if ( pos != std::string::npos )
{
fname = infile.substr( pos+1, infile.length() );
}
else
{
fname = infile;
}
// if there is no filename given, we set it to the .mo + html, e.g. test.mo.html
std::string htmlfile(filename);
if (htmlfile.empty())
{
htmlfile = infile + std::string(".html");
}
// Ok, now prepare output.
std::ofstream stream(htmlfile.c_str());
if ( stream.is_open() )
{
stream << "<!DOCTYPE HTML PUBLIC \"- //W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" << std::endl;
stream << "<html><head><style type=\"text/css\">\n" << std::endl;
stream << css << std::endl;
stream << "</style>" << std::endl;
stream << "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">" << std::endl;
stream << "<title>Dump of " << fname << "</title></head>" << std::endl;
stream << "<body>" << std::endl;
stream << "<center>" <<std::endl;
stream << "<h1>" << fname << "</h1>" << std::endl;
stream << "<table border=\"1\"><th colspan=\"2\">Project Info</th>" << std::endl;
std::stringstream parsee;
parsee << reader.Lookup("");
while ( !parsee.eof() )
{
char buffer[1024];
parsee.getline(buffer, 1024);
std::string name;
std::string value;
reader.GetPoEditorString( buffer, name, value );
if ( !(name.empty() || value.empty()) )
{
stream << "<tr><td>" << name << "</td><td>" << value << "</td></tr>" << std::endl;
}
}
stream << "</table>" << std::endl;
stream << "<hr noshade/>" << std::endl;
// Now output the content
stream << "<table border=\"1\"><th colspan=\"2\">Content</th>" << std::endl;
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.
{
stream << "<tr><td>" << it->first << "</td><td>" << it->second << "</td></tr>" << std::endl;
}
}
stream << "</table><br/>" << std::endl;
stream << "</center>" << std::endl;
stream << "<div class=\"copyleft\">File generated by <a href=\"http://mofilereader.googlecode.com\" target=\"_blank\">moFileReaderSDK</a></div>" << std::endl;
stream << "</body></html>" << std::endl;
stream.close();
}
else
{
return moFileReader::EC_FILENOTFOUND;
}
return moFileReader::EC_SUCCESS;
}
// Removes spaces from front and end.
void moFileReader::Trim(std::string& in)
{
while ( in[0] == ' ' )
{
in = in.substr(1, in.length() );
}
while( in[in.length()] == ' ' )
{
in = in.substr(0, in.length() - 1 );
}
}
// Extracts a value-pair from the po-edit-information
bool moFileReader::GetPoEditorString(const char* buffer, std::string& name, std::string& value)
{
std::string line(buffer);
size_t first = line.find_first_of(":");
if ( first != std::string::npos )
{
name = line.substr( 0, first );
value = line.substr( first + 1, line.length() );
// Replace <> with () for Html-Conformity.
MakeHtmlConform(value);
MakeHtmlConform(name);
// Remove spaces from front and end.
Trim(value);
Trim(name);
return true;
}
return false;
}
// Replaces < with ( to satisfy html-rules.
void moFileReader::MakeHtmlConform(std::string& inout)
{
std::string temp = inout;
for ( unsigned int i = 0; i < temp.length(); i++)
{
if ( temp[i] == '>')
{
inout.replace(i, 1, ")");
}
if ( temp[i] == '<' )
{
inout.replace(i, 1, "(");
}
}
}
moFileReaderSingleton& moFileReaderSingleton::GetInstance()
{
static moFileReaderSingleton theoneandonly;
return theoneandonly;
}
moFileReaderSingleton::moFileReaderSingleton(const moFileReaderSingleton& )
{
}
moFileReaderSingleton::moFileReaderSingleton()
{
}
moFileReaderSingleton& moFileReaderSingleton::operator=(const moFileReaderSingleton&)
{
return *this;
}
MO_END_NAMESPACE