This repository has been archived on 2023-11-20. You can view files and clone it, but cannot push or open issues or pull requests.
foam-extend4.1-coherent-io/applications/utilities/postProcessing/dataConversion/foamToTecplot360/tecio/tecsrc/TranslatedString.cpp
2013-07-18 10:15:54 +02:00

362 lines
8.6 KiB
C++

/*
* NOTICE and LICENSE for Tecplot Input/Output Library (TecIO) - OpenFOAM
*
* Copyright (C) 1988-2009 Tecplot, Inc. All rights reserved worldwide.
*
* Tecplot hereby grants OpenCFD limited authority to distribute without
* alteration the source code to the Tecplot Input/Output library, known
* as TecIO, as part of its distribution of OpenFOAM and the
* OpenFOAM_to_Tecplot converter. Users of this converter are also hereby
* granted access to the TecIO source code, and may redistribute it for the
* purpose of maintaining the converter. However, no authority is granted
* to alter the TecIO source code in any form or manner.
*
* This limited grant of distribution does not supersede Tecplot, Inc.'s
* copyright in TecIO. Contact Tecplot, Inc. for further information.
*
* Tecplot, Inc.
* 3535 Factoria Blvd, Ste. 550
* Bellevue, WA 98006, USA
* Phone: +1 425 653 1200
* http://www.tecplot.com/
*
*/
#include "stdafx.h"
#include "MASTER.h"
#define TECPLOTENGINEMODULE
/*
*****************************************************************
*****************************************************************
******* ********
****** Copyright (C) 1988-2008 Tecplot, Inc. *******
******* ********
*****************************************************************
*****************************************************************
*/
#include "GLOBAL.h"
#include "TASSERT.h"
#include "Q_UNICODE.h"
using namespace std;
namespace tecplot
{
namespace strutil
{
#if defined MSWIN && !defined TECPLOTKERNEL
/**
* Stub function for non-TECPLOTKERNEL
*/
string LookUpTranslation(string& str)
{
return string(str);
}
#endif
/**
* Convenience function for creating Utf8 string translations.
*
* @param str
* String to translate.
*
* @return
* A new Utf8 translated string.
*/
static inline string* createUtf8StringTranslation(string& str)
{
#if defined MSWIN
string *result = new string(LookUpTranslation(str));
#else
string *result = new string(str);
#endif
ENSURE(VALID_REF(result));
return result;
}
#if defined MSWIN
/**
* Convenience function for creating wide string translations.
*
* @param str
* String to translate.
*
* @return
* A new wide translated string.
*/
static inline wstring* createWideStringTranslation(string& str)
{
wstring *result = new wstring;
*result = StringToWString(LookUpTranslation(str));
ENSURE(VALID_REF(result));
return result;
}
#endif
#if defined MSWIN
/**
* Convenience function for creating wide string with the given mode.
*
* @param mode
* Indicates if this string is to be translated or not.
* @param str
* String to translate.
*
* @return
* A new wide translated string.
*/
static inline wstring* createWideString(TranslatedString::Mode mode,
string& str)
{
REQUIRE(mode == TranslatedString::DoTranslate || mode == TranslatedString::DontTranslate);
wstring* result;
if (mode == TranslatedString::DoTranslate)
result = createWideStringTranslation(str);
else
result = new wstring(StringToWString(str));
return result;
}
#endif
/**
*/
void TranslatedString::init(TranslatedString::Mode mode,
const char* str,
const char* translatorNotes)
{
REQUIRE(mode == DoTranslate || mode == DontTranslate);
REQUIRE(VALID_REF_OR_NULL(str));
REQUIRE(VALID_REF_OR_NULL(translatorNotes));
m_mode = mode;
m_isNull = (str == NULL);
if (!m_isNull)
m_string = str;
m_utf8String = NULL; // ...on demand resource
#if defined MSWIN
m_wideString = NULL; // ...on demand resource
#endif
}
/**
*/
TranslatedString::TranslatedString()
{
init(DontTranslate, (const char*)NULL, (const char*)NULL);
ENSURE(this->isValid());
}
/**
*/
TranslatedString TranslatedString::null()
{
return dontTranslate(NULL);
}
/**
*/
TranslatedString::TranslatedString(TranslatedString::Mode mode,
const char* str,
const char* translatorNotes)
{
REQUIRE(mode == DoTranslate || mode == DontTranslate);
REQUIRE(VALID_REF_OR_NULL(str));
REQUIRE(VALID_REF_OR_NULL(translatorNotes));
init(mode, str, translatorNotes);
ENSURE(this->isValid());
}
/**
*/
TranslatedString::~TranslatedString()
{
delete m_utf8String;
#if defined MSWIN
delete m_wideString;
#endif
}
#if !defined NO_ASSERTS
/**
*/
bool TranslatedString::isValid() const
{
CHECK(IMPLICATION(m_isNull, m_string.length() == 0));
#if 0
/* TODO(DTO/RMS/CAM): 11/2/2007
* Code currently exists in Tecplot where we call translate() on a
* variable. This seems wrong and at times (PleaseWait() in
* particular) the variable passed is a NULL pointer which causes
* this assertion to fail. There is not enough time before v11.2
* release to remove all translate() calls to non-literal strings so
* we'll have to do this as a post release cleanup. For now just
* deactivate this assertion.
*/
CHECK(IMPLICATION(m_isNull, m_mode == DontTranslate));
#endif
return true;
}
#endif
/**
*/
bool TranslatedString::isNull() const
{
INVARIANT(this->isValid());
return m_isNull;
}
/**
*/
bool TranslatedString::isNullOrZeroLength() const
{
INVARIANT(this->isValid());
return m_isNull || m_string.length() == 0;
}
/**
*/
const char* TranslatedString::c_str()
{
INVARIANT(this->isValid());
const char* result = NULL;
if (!isNull())
{
if (m_mode == DoTranslate)
{
if (m_utf8String == NULL)
m_utf8String = createUtf8StringTranslation(m_string);
result = m_utf8String->c_str();
}
else // ...if we aren't translating don't bother creating another Utf8 copy just use m_string
result = m_string.c_str();
}
ENSURE(result == NULL || VALID_REF(result));
return result;
}
#if defined MSWIN
/**
*/
const wchar_t *TranslatedString::c_wstr()
{
INVARIANT(this->isValid());
const wchar_t *result = NULL;
if (!isNull())
{
if (m_wideString == NULL)
m_wideString = createWideString(m_mode, m_string);
result = m_wideString->c_str();
}
ENSURE(result == NULL || VALID_REF(result));
return result;
}
#endif
/**
*/
TranslatedString::operator string()
{
INVARIANT(this->isValid());
REQUIRE(!isNull());
string* result;
if (m_mode == DoTranslate)
{
if (m_utf8String == NULL)
m_utf8String = createUtf8StringTranslation(m_string);
result = m_utf8String;
}
else // ...if we aren't translating don't bother creating another Utf8 copy just use m_string
result = &m_string;
return *result;
}
#if defined MSWIN
/**
*/
TranslatedString::operator wstring()
{
INVARIANT(this->isValid());
REQUIRE(!isNull());
if (m_wideString == NULL)
m_wideString = createWideString(m_mode, m_string);
return *m_wideString;
}
#endif
/**
*/
TranslatedString& TranslatedString::operator =(const TranslatedString& other)
{
REQUIRE(other.isValid());
if (this != &other) // ...only perform if not self assignment
{
m_mode = other.m_mode;
m_isNull = other.m_isNull;
m_string = other.m_string;
m_utf8String = (other.m_utf8String != NULL ? new string(*other.m_utf8String) : NULL);
#if defined MSWIN
m_wideString = (other.m_wideString != NULL ? new wstring(*other.m_wideString) : NULL);
#endif
}
ENSURE(this->isValid());
return *this;
}
/**
*/
TranslatedString::TranslatedString(const TranslatedString& other)
{
REQUIRE(other.isValid());
m_mode = other.m_mode;
m_isNull = other.m_isNull;
m_string = other.m_string;
m_utf8String = (other.m_utf8String != NULL ? new string(*other.m_utf8String) : NULL);
#if defined MSWIN
m_wideString = (other.m_wideString != NULL ? new wstring(*other.m_wideString) : NULL);
#endif
ENSURE(this->isValid());
}
/**
*/
TranslatedString TranslatedString::translate(const char* str,
const char* translatorNotes)
{
REQUIRE(VALID_REF_OR_NULL(str));
REQUIRE(VALID_REF_OR_NULL(translatorNotes));
return TranslatedString(DoTranslate, str, translatorNotes);
}
/**
*/
TranslatedString TranslatedString::dontTranslate(const char* str)
{
REQUIRE(VALID_REF_OR_NULL(str));
return TranslatedString(DontTranslate, str, NULL);
}
}
}