2018-04-22 15:55:55 +00:00
|
|
|
//======== (C) Copyright 2002 Charles G. Cleveland All rights reserved. =========
|
|
|
|
//
|
|
|
|
// The copyright to the contents herein is the property of Charles G. Cleveland.
|
|
|
|
// The contents may be used and/or copied only with the written permission of
|
|
|
|
// Charles G. Cleveland, or in accordance with the terms and conditions stipulated in
|
|
|
|
// the agreement/contract under which the contents have been supplied.
|
|
|
|
//
|
|
|
|
// Purpose:
|
|
|
|
//
|
|
|
|
// $Workfile: TRDescription.cpp $
|
|
|
|
// $Date: 2002/07/26 01:53:49 $
|
|
|
|
//
|
|
|
|
//-------------------------------------------------------------------------------
|
|
|
|
// $Log: TRDescription.cpp,v $
|
|
|
|
// Revision 1.5 2002/07/26 01:53:49 Flayra
|
|
|
|
// - Linux support for FindFirst/FindNext
|
|
|
|
// - Added document headers
|
|
|
|
//
|
|
|
|
//===============================================================================
|
|
|
|
#include "TRDescription.h"
|
|
|
|
|
|
|
|
// Add a new pair read from the text file to this description. They can be added in any order.
|
|
|
|
void TRDescription::AddPair(const TRTagValuePair& inPair)
|
|
|
|
{
|
|
|
|
this->mTagValueList.push_back(inPair);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read a list of tags named prefix and then a number, starting with 1.
|
|
|
|
// Ie, sound1, sound2, sound3 etc. It reads in order until it doesn't find a tag, then stops.
|
|
|
|
bool TRDescription::GetTagStringList(const TRTag& inTagPrefix, StringVector& outList) const
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
|
|
|
|
for(int i = 1; ; i++)
|
|
|
|
{
|
|
|
|
char theNum[4];
|
|
|
|
sprintf(theNum, "%d", i);
|
|
|
|
string theTagName(inTagPrefix + string(theNum));
|
|
|
|
string theTagString;
|
|
|
|
|
|
|
|
if(this->GetTagValue(theTagName, theTagString))
|
|
|
|
{
|
|
|
|
// Successful if we found at least one tag
|
|
|
|
outList.push_back(theTagString);
|
|
|
|
theSuccess = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TRDescription::GetTagStringList(const TRTag& inTagPrefix, CStringList& outList) const
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
|
|
|
|
for(int i = 1; ; i++)
|
|
|
|
{
|
|
|
|
char theNum[4];
|
|
|
|
sprintf(theNum, "%d", i);
|
|
|
|
string theTagName(inTagPrefix + string(theNum));
|
|
|
|
string theTagString;
|
|
|
|
|
|
|
|
if(this->GetTagValue(theTagName, theTagString))
|
|
|
|
{
|
|
|
|
CString theCTagString;
|
|
|
|
theCTagString = theTagString;
|
|
|
|
|
|
|
|
// Successful if we found at least one tag
|
|
|
|
outList.push_back(theCTagString);
|
|
|
|
theSuccess = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
//template <class T>
|
|
|
|
//bool TRDescription::GetTagStringList(const TRTag& inTagPrefix, T& outList) const
|
|
|
|
//{
|
|
|
|
// bool theSuccess = false;
|
|
|
|
//
|
|
|
|
// for(int i = 1; ; i++)
|
|
|
|
// {
|
|
|
|
// char theNum[4];
|
|
|
|
// sprintf(theNum, "%d", i);
|
|
|
|
// string theTagName(inTagPrefix + string(theNum));
|
|
|
|
// string theTagString;
|
|
|
|
//
|
|
|
|
// string theNodeString;
|
|
|
|
// if(this->GetTagValue(theTagName, theTagString))
|
|
|
|
// {
|
|
|
|
// // Successful if we found at least one tag
|
|
|
|
// outList.push_back(theTagString);
|
|
|
|
// theSuccess = true;
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// return theSuccess;
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Get the integer associated with the named tag. Returns false if the tag
|
|
|
|
// isn't present or the data format couldn't be read.
|
|
|
|
bool TRDescription::GetTagValue(const TRTag& inTag, int& outValue) const
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
string theString;
|
|
|
|
|
|
|
|
if(this->GetValue(inTag, theString))
|
|
|
|
{
|
|
|
|
if(sscanf(theString.c_str(), "%d", &outValue) == 1)
|
|
|
|
{
|
|
|
|
theSuccess = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the float associated with the named tag. Returns false if the tag
|
|
|
|
// isn't present or the data format couldn't be read.
|
|
|
|
bool TRDescription::GetTagValue(const TRTag& inTag, float& outValue) const
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
string theString;
|
|
|
|
|
|
|
|
if(this->GetValue(inTag, theString))
|
|
|
|
{
|
|
|
|
if(sscanf(theString.c_str(),"%f", &outValue) == 1)
|
|
|
|
{
|
|
|
|
theSuccess = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the string associated with the named tag. Returns false if the tag
|
|
|
|
// isn't present (it can always be read!).
|
|
|
|
bool TRDescription::GetTagValue(const TRTag& inTag, string& outValue) const
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
|
|
|
|
if(this->GetValue(inTag, outValue))
|
|
|
|
{
|
|
|
|
theSuccess = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TRDescription::GetTagValue(const TRTag& inTag, CString& outValue) const
|
|
|
|
{
|
|
|
|
string theValue;
|
|
|
|
bool theSuccess = false;
|
|
|
|
|
|
|
|
if(this->GetValue(inTag, theValue))
|
|
|
|
{
|
|
|
|
outValue = theValue;
|
|
|
|
theSuccess = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the boolean associated with the named tag. Returns false if the tag
|
|
|
|
// isn't present or the data format wasn't either "true" or "false".
|
|
|
|
bool TRDescription::GetTagValue(const TRTag& inTag, bool& outValue) const
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
string theString;
|
|
|
|
|
|
|
|
if(this->GetValue(inTag, theString))
|
|
|
|
{
|
|
|
|
if(theString == "false")
|
|
|
|
{
|
|
|
|
outValue = false;
|
|
|
|
}
|
|
|
|
else if(theString == "true")
|
|
|
|
{
|
|
|
|
outValue = true;
|
|
|
|
}
|
|
|
|
theSuccess = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
// This is the name of this entity. It is used to find it by the client code later.
|
|
|
|
string TRDescription::GetName(void) const
|
|
|
|
{
|
|
|
|
return this->mName;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Indicates what type of object this entity represents and is the keyword used to figure out
|
|
|
|
// what class to new.
|
|
|
|
string TRDescription::GetType(void) const
|
|
|
|
{
|
|
|
|
return this->mType;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Internal searching function to get the string value associated with the specified tag name.
|
|
|
|
// It is used by all the GetTagValue functions. Returns false if the tag isn't present.
|
|
|
|
bool TRDescription::GetValue(const string& inTagName, string& outString) const
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
TRTagValueListType::const_iterator theIter;
|
|
|
|
|
|
|
|
// Lookup tag name in list
|
|
|
|
for(theIter = this->mTagValueList.begin(); theIter != this->mTagValueList.end(); theIter++)
|
|
|
|
{
|
|
|
|
if(theIter->first == inTagName)
|
|
|
|
{
|
|
|
|
outString = theIter->second;
|
|
|
|
theSuccess = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TRDescription::SetName(const string& inName)
|
|
|
|
{
|
|
|
|
this->mName = inName;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TRDescription::SetTagValue(const TRTag& inTag, int inValue)
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
char theCharArray[128];
|
|
|
|
|
|
|
|
// Convert inValue to a string
|
|
|
|
if(sprintf(theCharArray, "%d", inValue) > 0)
|
|
|
|
{
|
|
|
|
string theStringValue(theCharArray);
|
|
|
|
|
|
|
|
// Call SetValue, return what it returns
|
|
|
|
theSuccess = this->SetValue(inTag, theStringValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TRDescription::SetTagValue(const TRTag& inTag, float inValue)
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
char theCharArray[128];
|
|
|
|
|
|
|
|
// Convert inValue to a string
|
|
|
|
if(sprintf(theCharArray, "%f", inValue) > 0)
|
|
|
|
{
|
|
|
|
string theStringValue(theCharArray);
|
|
|
|
|
|
|
|
// Call SetValue, return what it returns
|
|
|
|
theSuccess = this->SetValue(inTag, theStringValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TRDescription::SetTagValue(const TRTag& inTag, const string& inValue)
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
|
|
|
|
// Call SetValue, return what it returns
|
|
|
|
theSuccess = this->SetValue(inTag, inValue);
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TRDescription::SetTagValue(const TRTag& inTag, bool inValue)
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
|
|
|
|
// Convert inValue to a string
|
|
|
|
string theStringValue;
|
|
|
|
if(inValue)
|
|
|
|
{
|
|
|
|
theStringValue = "true";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
theStringValue = "false";
|
|
|
|
}
|
|
|
|
|
|
|
|
// Call SetValue, return what it returns
|
|
|
|
theSuccess = this->SetValue(inTag, theStringValue);
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void TRDescription::SetType(const string& inType)
|
|
|
|
{
|
|
|
|
this->mType = inType;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Internal searching function to set the string for a tag. Used by all the SetTagValue functions.
|
|
|
|
bool TRDescription::SetValue(const string& inTagName, const string& inString)
|
|
|
|
{
|
|
|
|
bool theSuccess = false;
|
|
|
|
TRTagValueListType::iterator theIter;
|
|
|
|
|
|
|
|
// Lookup tag name in list
|
|
|
|
for(theIter = this->mTagValueList.begin(); theIter != this->mTagValueList.end(); theIter++)
|
|
|
|
{
|
|
|
|
if(theIter->first == inTagName)
|
|
|
|
{
|
|
|
|
theIter->second = inString;
|
|
|
|
theSuccess = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return theSuccess;
|
|
|
|
}
|
|
|
|
|