1
This commit is contained in:
282
fgdlib/wckeyvalues.cpp
Normal file
282
fgdlib/wckeyvalues.cpp
Normal file
@ -0,0 +1,282 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#include "fgdlib/WCKeyValues.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include <tier0/memdbgon.h>
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Destructor.
|
||||
//-----------------------------------------------------------------------------
|
||||
MDkeyvalue::~MDkeyvalue(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Assignment operator.
|
||||
//-----------------------------------------------------------------------------
|
||||
MDkeyvalue &MDkeyvalue::operator =(const MDkeyvalue &other)
|
||||
{
|
||||
V_strcpy_safe(szKey, other.szKey);
|
||||
V_strcpy_safe(szValue, other.szValue);
|
||||
|
||||
return(*this);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
void WCKVBase_Vector::RemoveKeyAt(int nIndex)
|
||||
{
|
||||
Assert(nIndex >= 0);
|
||||
Assert(nIndex < (int)m_KeyValues.Count());
|
||||
|
||||
if ((nIndex >= 0) && (nIndex < (int)m_KeyValues.Count()))
|
||||
{
|
||||
m_KeyValues.Remove(nIndex);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Adds the key to the keyvalue array. Allows duplicate keys.
|
||||
//
|
||||
// NOTE: This should only be used for keyvalue lists that do not require
|
||||
// unique key names! If you use this function then you should use GetCount
|
||||
// and GetKey/Value by index rather than GetValue by key name.
|
||||
//-----------------------------------------------------------------------------
|
||||
void WCKVBase_Vector::AddKeyValue(const char *pszKey, const char *pszValue)
|
||||
{
|
||||
if (!pszKey || !pszValue)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
char szTmpKey[KEYVALUE_MAX_KEY_LENGTH];
|
||||
char szTmpValue[KEYVALUE_MAX_VALUE_LENGTH];
|
||||
|
||||
V_strcpy_safe(szTmpKey, pszKey);
|
||||
V_strcpy_safe(szTmpValue, pszValue);
|
||||
|
||||
StripEdgeWhiteSpace(szTmpKey);
|
||||
StripEdgeWhiteSpace(szTmpValue);
|
||||
|
||||
//
|
||||
// Add the keyvalue to our list.
|
||||
//
|
||||
MDkeyvalue newkv;
|
||||
V_strcpy_safe(newkv.szKey, szTmpKey);
|
||||
V_strcpy_safe(newkv.szValue, szTmpValue);
|
||||
m_KeyValues.AddToTail(newkv);
|
||||
}
|
||||
|
||||
int WCKVBase_Vector::FindByKeyName( const char *pKeyName ) const
|
||||
{
|
||||
for ( int i=0; i < m_KeyValues.Count(); i++ )
|
||||
{
|
||||
if ( V_stricmp( m_KeyValues[i].szKey, pKeyName ) == 0 )
|
||||
return i;
|
||||
}
|
||||
return GetInvalidIndex();
|
||||
}
|
||||
|
||||
void WCKVBase_Vector::InsertKeyValue( const MDkeyvalue &kv )
|
||||
{
|
||||
m_KeyValues.AddToTail( kv );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
void WCKVBase_Dict::RemoveKeyAt(int nIndex)
|
||||
{
|
||||
m_KeyValues.RemoveAt(nIndex);
|
||||
}
|
||||
|
||||
|
||||
int WCKVBase_Dict::FindByKeyName( const char *pKeyName ) const
|
||||
{
|
||||
return m_KeyValues.Find( pKeyName );
|
||||
}
|
||||
|
||||
void WCKVBase_Dict::InsertKeyValue( const MDkeyvalue &kv )
|
||||
{
|
||||
m_KeyValues.Insert( kv.szKey, kv );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Constructor. Sets the initial size of the keyvalue array.
|
||||
//-----------------------------------------------------------------------------
|
||||
template<class Base>
|
||||
WCKeyValuesT<Base>::WCKeyValuesT(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Destructor. Deletes the contents of this keyvalue array.
|
||||
//-----------------------------------------------------------------------------
|
||||
template<class Base>
|
||||
WCKeyValuesT<Base>::~WCKeyValuesT(void)
|
||||
{
|
||||
//int i = 0;
|
||||
//while (i < m_KeyValues.GetSize())
|
||||
//{
|
||||
// delete m_KeyValues.GetAt(i++);
|
||||
//}
|
||||
|
||||
RemoveAll();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
template<class Base>
|
||||
const char *WCKeyValuesT<Base>::GetValue(const char *pszKey, int *piIndex) const
|
||||
{
|
||||
int i = FindByKeyName( pszKey );
|
||||
if ( i == GetInvalidIndex() )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(piIndex)
|
||||
piIndex[0] = i;
|
||||
|
||||
return m_KeyValues[i].szValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
template<class Base>
|
||||
void WCKeyValuesT<Base>::RemoveKey(const char *pszKey)
|
||||
{
|
||||
SetValue(pszKey, (const char *)NULL);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
template<class Base>
|
||||
void WCKeyValuesT<Base>::SetValue(const char *pszKey, int iValue)
|
||||
{
|
||||
char szValue[100];
|
||||
itoa(iValue, szValue, 10);
|
||||
|
||||
SetValue(pszKey, szValue);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Strips leading and trailing whitespace from the string.
|
||||
// Input : psz -
|
||||
//-----------------------------------------------------------------------------
|
||||
void StripEdgeWhiteSpace(char *psz)
|
||||
{
|
||||
if (!psz || !*psz)
|
||||
return;
|
||||
|
||||
char *pszBase = psz;
|
||||
|
||||
while (V_isspace(*psz))
|
||||
{
|
||||
psz++;
|
||||
}
|
||||
|
||||
int iLen = strlen(psz) - 1;
|
||||
|
||||
if ( iLen >= 0 )
|
||||
{
|
||||
while (V_isspace(psz[iLen]))
|
||||
{
|
||||
psz[iLen--] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (psz != pszBase)
|
||||
{
|
||||
memmove(pszBase, psz, iLen + 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Input : pszKey -
|
||||
// pszValue -
|
||||
//-----------------------------------------------------------------------------
|
||||
template<class Base>
|
||||
void WCKeyValuesT<Base>::SetValue(const char *pszKey, const char *pszValue)
|
||||
{
|
||||
char szTmpKey[KEYVALUE_MAX_KEY_LENGTH];
|
||||
char szTmpValue[KEYVALUE_MAX_VALUE_LENGTH];
|
||||
|
||||
V_strcpy_safe(szTmpKey, pszKey);
|
||||
|
||||
if (pszValue != NULL)
|
||||
{
|
||||
V_strcpy_safe(szTmpValue, pszValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
szTmpValue[0] = 0;
|
||||
}
|
||||
|
||||
StripEdgeWhiteSpace(szTmpKey);
|
||||
StripEdgeWhiteSpace(szTmpValue);
|
||||
|
||||
int i = FindByKeyName( szTmpKey );
|
||||
if ( i == GetInvalidIndex() )
|
||||
{
|
||||
if ( pszValue )
|
||||
{
|
||||
//
|
||||
// Add the keyvalue to our list.
|
||||
//
|
||||
MDkeyvalue newkv;
|
||||
Q_strncpy( newkv.szKey, szTmpKey, sizeof( newkv.szKey ) );
|
||||
Q_strncpy( newkv.szValue, szTmpValue, sizeof( newkv.szValue ) );
|
||||
InsertKeyValue( newkv );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pszValue != NULL)
|
||||
{
|
||||
V_strncpy(m_KeyValues[i].szValue, szTmpValue, sizeof(m_KeyValues[i].szValue));
|
||||
}
|
||||
//
|
||||
// If we are setting to a NULL value, delete the key.
|
||||
//
|
||||
else
|
||||
{
|
||||
RemoveKeyAt( i );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
template<class Base>
|
||||
void WCKeyValuesT<Base>::RemoveAll(void)
|
||||
{
|
||||
m_KeyValues.RemoveAll();
|
||||
}
|
||||
|
||||
|
||||
// Explicit instantiations.
|
||||
template class WCKeyValuesT<WCKVBase_Dict>;
|
||||
template class WCKeyValuesT<WCKVBase_Vector>;
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user