/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project. All
................................................ contributions are welcome.
....Copyright(C).1995.Melvin.Smith.............. Enjoy.
------------------------------------------------------------------------------
Melvin Smith (aka Fusion) msmith@hom.net
MUD++ development mailing list mudpp@van.ml.org
------------------------------------------------------------------------------
index.cc
*/
#include "config.h"
#include "string.h"
#include "io.h"
#include "index.h"
Index::Index( const Index & x )
: scope(0), key(0)
{
if( x.scope )
{
scope = new char[ strlen( x.scope ) + 1 ];
strcpy( scope, x.scope );
}
if( x.key )
{
key = new char[ strlen( x.key ) + 1 ];
strcpy( key, x.key );
}
}
Index::Index( const String & str )
: scope(0), key(0)
{
parse_index_string( str );
}
Index::Index( const char * str )
: scope(0), key(0)
{
parse_index_string( str );
}
Index::Index( const String & strScope, const String & strKey )
: scope( strScope.dup() ), key( strKey.dup() )
{
}
Index::Index( const char * strScope, const char * strKey )
: scope( new char[ strlen( strScope ) + 1 ] ),
key( new char[ strlen( strKey ) + 1 ] )
{
strcpy( scope, strScope );
strcpy( key, strKey );
}
void Index::setScope( const char * x )
{
if( scope )
delete [] scope;
scope = new char[ strlen( x ) + 1 ];
strcpy( scope, x );
}
void Index::setScope( const String & x )
{
if( scope )
delete [] scope;
scope = x.dup();
}
void Index::setKey( const char * x )
{
if( key )
delete [] key;
key = new char[ strlen( x ) + 1 ];
strcpy( key, x );
}
void Index::setKey( const String & x )
{
if( key )
delete [] key;
key = x.dup();
}
const Index & Index::operator = ( const Index & x )
{
if( &x != this )
{
if( x.scope )
{
if( scope )
delete [] scope;
scope = new char[ strlen( x.scope ) + 1 ];
strcpy( scope, x.scope );
}
if( x.key )
{
if( key )
delete [] key;
key = new char[ strlen( x.key ) + 1 ];
strcpy( key, x.key );
}
}
return *this;
}
const Index & Index::operator = ( const String & x )
{
parse_index_string( x );
return *this;
}
const Index & Index::operator = ( const char * x )
{
parse_index_string( x );
return *this;
}
bool Index::operator == ( const Index & sIndex ) const
{
if( scope && sIndex.scope )
if( strcmp( scope, sIndex.scope ) )
return false;
if( !key || !sIndex.key )
return false;
if( strcmp( key, sIndex.key ) )
return false;
return true;
}
Output & operator << ( Output & out, const Index & x )
{
out << ( x.scope ? x.scope : '\0' ) << ':' << ( x.key ? x.key : '\0' );
return out;
}
const String Index::getScope() const
{
String ret;
if( scope )
ret = scope;
return ret;
}
const String Index::getKey() const
{
String ret;
if( key )
ret = key;
return ret;
}
const String Index::asString() const
{
String ret;
if( scope )
ret = scope;
ret += ':';
if( key )
ret += key;
return ret;
}
// Convert a contiguous string to an Index object
// String is in format:
// 1) "<scope-name>:<key-name>
// 2) ":<key-name>"
// 3) "<key-name>"
// Colons are not checked in key name. The first colon is assumed to
// terminate the scope name. The rest of the string is copied in the
// key name. No colon assumes the the whole string is an key string
void Index::parse_index_string( const String & x )
{
char strScope[ BUF ];
char strKey[ BUF ];
int i = 0;
int j = 0;
while( 1 )
{
if( x[i] == ':' )
{
// ':' found so terminate scope scope and break out to parse index
strScope[j] = '\0';
break;
}
else if( !x[i] )
{
// No ':' found so interpret as a plain index (no scope scope)
scope = new char('\0');
strScope[j] = '\0';
key = new char[ strlen( strScope ) + 1 ];
strcpy( key, strScope );
return;
}
strScope[j] = x[i];
i++; j++;
}
i++; j = 0;
while( x[i] )
{
strKey[j] = x[i];
i++; j++;
}
strKey[j] = '\0';
key = new char[ strlen( strKey ) + 1 ];
strcpy( key, strKey );
scope = new char[ strlen( strScope ) + 1 ];
strcpy( scope, strScope );
}
// Convert a contiguous char * to an Index object
// Same as above.
void Index::parse_index_string( const char * x )
{
char strScope[ BUF ];
char strKey[ BUF ];
int i = 0;
int j = 0;
while( 1 )
{
if( x[i] == ':' )
{
// ':' found so terminate scope scope and break out to parse index
strScope[j] = '\0';
break;
}
else if( !x[i] )
{
// No ':' found so interpret as a plain index (no scope scope)
scope = new char('\0');
strScope[j] = '\0';
key = new char[ strlen( strScope ) + 1 ];
strcpy( key, strScope );
return;
}
strScope[j] = x[i];
i++; j++;
}
i++; j = 0;
while( x[i] )
{
strKey[j] = x[i];
i++; j++;
}
strKey[j] = '\0';
key = new char[ strlen( strKey ) + 1 ];
strcpy( key, strKey );
scope = new char[ strlen( strScope ) + 1 ];
strcpy( scope, strScope );
}