1
1
forked from 0ad/0ad
0ad/source/dcdt/se/sr_var_table.cpp
janwas 5bf9bca9ef fix/disable warnings.
there are too many W4 and "potentially uninitialized", so those are
disabled by 0ad_warning_disable.h.

the silly "int x = strlen" and very dangerous "int x = (void*)p" (and
vice versa) problems are fixed.

This was SVN commit r5526.
2007-12-23 12:18:57 +00:00

184 lines
3.7 KiB
C++

#include "precompiled.h"
#include "0ad_warning_disable.h"
# include <stdlib.h>
# include "sr_var_table.h"
//====================================== SrVarTable =======================================
SrVarTable::SrVarTable ( const SrVarTable& vt )
{
_table.size ( vt.size() );
int i;
for ( i=0; i<_table.size(); i++ )
_table[i] = new SrVar ( vt[i] );
_name = 0;
sr_string_set ( _name, vt._name );
}
SrVarTable::~SrVarTable ()
{
delete _name;
init();
}
void SrVarTable::name ( const char* n )
{
sr_string_set ( _name, n );
}
const char* SrVarTable::name () const
{
return _name? _name:"";
}
void SrVarTable::init ()
{
while ( _table.size()>0 )
delete _table.pop();
}
SrVar* SrVarTable::get ( const char* name ) const
{
int i = search ( name );
return i<0? 0 : _table[i];
}
SrVar* SrVarTable::set ( const char* name, int value, int index )
{
int i = search ( name );
if ( i<0 ) return 0;
_table[i]->set(value,index);
return _table[i];
}
SrVar* SrVarTable::set ( const char* name, bool value, int index )
{
int i = search ( name );
if ( i<0 ) return 0;
_table[i]->set(value,index);
return _table[i];
}
SrVar* SrVarTable::set ( const char* name, float value, int index )
{
int i = search ( name );
if ( i<0 ) return 0;
_table[i]->set(value,index);
return _table[i];
}
SrVar* SrVarTable::set ( const char* name, const char* value, int index )
{
int i = search ( name );
if ( i<0 ) return 0;
_table[i]->set(value,index);
return _table[i];
}
static int fcmp ( SrVar*const* pt1, SrVar*const* pt2 )
{
return sr_compare ( *pt1, *pt2 );
}
int SrVarTable::search ( const char* name ) const
{
SrVar v;
v.name ( name );
return _table.bsearch ( &v, fcmp );
}
int SrVarTable::insert ( SrVar* v )
{
int pos;
pos = _table.insort ( v, fcmp, true );
return pos;
}
void SrVarTable::remove ( int i )
{
if ( i<0 || i>=_table.size() ) return;
delete _table[i];
_table.remove ( i );
}
void SrVarTable::merge ( SrVarTable& vt )
{
int i, id;
for ( i=0; i<vt.size(); i++ )
{ id = search(vt.get(i).name());
if ( id>=0 ) // found with same name
{ get(id).init ( vt.get(i) ); // get the value
delete vt._table[i];
vt._table[i] = 0;
}
}
for ( i=0; i<vt.size(); i++ )
{ if ( vt._table[i] )
_table.push() = vt._table[i];
}
_table.sort ( fcmp );
vt._table.size(0);
}
SrVar* SrVarTable::extract ( int i )
{
if ( i<0 || i>=_table.size() ) return 0;
SrVar* v = _table[i];
_table.remove ( i );
return v;
}
SrOutput& operator<< ( SrOutput& o, const SrVarTable& vt )
{
int i;
SrString buf;
if ( vt.name()[0] )
{ buf.make_valid_string ( vt.name() );
o << buf << srspc;
}
o << '[' << srnl;
for ( i=0; i<vt.size(); i++ ) o << vt[i] << srnl;
o << ']' << srnl;
return o;
}
SrInput& operator>> ( SrInput& in, SrVarTable& vt )
{
vt.init ();
vt.name ( 0 );
in.get_token(); // name or '['
if ( in.last_token()[0]!='[' )
{ vt.name ( in.last_token() );
in.get_token (); // now it should come '['
}
while ( true )
{ in.get_token ();
if ( in.last_token()[0]==']' ) break;
in.unget_token ();
vt._table.push () = new SrVar;
in >> *vt._table.top();
}
// sort elements in case data was edited by hand
vt._table.sort ( fcmp );
return in;
}
//================================ End of File =================================================