/*
....[@@@..[@@@..............[@.................. 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@falcon.mercer.peachnet.edu
MUD++ development mailing list mudpp-list@spice.com
------------------------------------------------------------------------------
string.h
*/
// 25 Apr 1995 Written by Fusion <msmith@falcon.mercer.peachnet.edu>
// 25 Apr 1995 Casual hacking by Furey <mec@duracef.shout.net>
#ifndef STRING_H
#define STRING_H
#include "io.h"
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "signal.h"
#define ASSERT( p ) if( !p ) raise( SIGSEGV )
#define BUF 4096
#define TAB 0x09
const char * itoa( int );
const char * ltoa( unsigned long );
int str_cmp( const char *, const char * );
class String;
class StringRep
{
private:
friend class String;
int count;
int sz; // actual size, strlen will return len
char *str;
StringRep( )
: count(1), sz(0), str(0) { }
StringRep( const char * );
StringRep( const StringRep & );
StringRep( int );
~StringRep( );
const StringRep & operator = ( const StringRep & );
};
inline StringRep::StringRep( const char *x )
: count( 1 ), sz( strlen(x)+1 ),
str( new char[ strlen(x)+1 ] )
{
strcpy( str, x );
}
inline StringRep::StringRep( const StringRep &orig )
: count( 1 ), sz( strlen( orig.str ) + 1 ), str( new char[ sz ] )
{
strcpy( str, orig.str );
}
inline StringRep::StringRep( int asize )
: count( 1 ), sz( asize ), str( new char[ asize ] )
{
*str = '\0';
}
inline StringRep::~StringRep()
{
delete [] str;
}
// String class
class String
{
private:
StringRep *rep;
protected:
// For startArgs(), getArg(), and getArgRest()
static char _argbuf[ 1024 ];
static char *_argptr;
static char *_argnext;
public:
String();
String( const char * );
String( const String & );
String( int );
~String();
operator const char *() { return rep->str; }
int count() { return rep->count; }
int len() const; // strlen
void clr();
int size() const; // size of allocated mem
void allocate( int ); // explicitly allocate size mem
const char * chars() const;
char * dup() const;
String asUpper() const;
String asLower() const;
String asProper() const;
String & chop();
String & clean();
String & crypt( const String & salt );
int asInt() const;
bool isNumber() const;
String & toUpper();
String & toLower();
String & toProper();
String & operator = ( const char * );
String & operator = ( const String & );
bool operator == ( const String & ) const;
bool operator == ( const char * ) const;
bool operator != ( const String & ) const;
bool operator != ( const char * ) const;
String & append( const String & );
String & append( const char );
String & append( const char * );
String & operator += ( const String & );
String & operator += ( const char );
String & operator += ( const char * );
String & operator += ( int );
String & operator += ( unsigned long int );
String operator + ( const String & ) const;
String operator + ( const char * ) const;
String operator + ( const char ) const;
String operator + ( int ) const;
String operator + ( unsigned long ) const;
operator bool() const { return (bool)*rep->str; }
char & operator [] ( int i );
char operator [] ( int i ) const;
bool compare( const String & ) const;
bool compare( const char * ) const;
bool compareWithCase( const String & ) const;
bool compareWithCase( const char * ) const;
bool hasChar( const char & x ) const { return (bool)strchr( rep->str, x ); }
bool abbrev( const String & ) const;
bool abbrev( const char * ) const;
bool subStr( const String & ) const;
bool subStr( const char * ) const;
String getLine( int ) const;
String & operator << ( const char * );
String & operator << ( const String & );
String & operator << ( char );
String & operator << ( int );
String & operator << ( unsigned long int );
String & operator << ( float );
int sprintf( const char * fmt, ... );
int sprintfAdd( const char * fmt, ... );
void startArgs();
const char * getArg();
const char * getArgRest();
void shiftLeft();
void shiftRight();
// void rotateLeft();
// void rotateRight();
friend OStream & operator << ( OStream &, const String & );
// friend IStream & operator >> ( IStream &, const String & );
// Disabled
void setLen(); // these are needed if the [] array
void setLen( int ); // operators are used to mod the string
};
// This fixes the problem which arises in a lot of implementations
// when you do if( "blah" == str ) and the const char * operator is
// invoked for the string object instead of the ==
inline bool operator == ( const char * ptr, const String & str )
{
// Invoke string operator first.
return str.compare( ptr );
}
inline const char * String::chars() const
{
return rep->str;
}
inline String & String::operator += ( const String & x )
{
return append( x );
}
inline String & String::operator += ( const char x )
{
return append( x );
}
inline String & String::operator += ( const char * x )
{
return append( x );
}
inline String & String::operator += ( int x )
{
return append( itoa( x ) );
}
inline String & String::operator += ( unsigned long x )
{
return append( ltoa( x ) );
}
inline bool String::operator == ( const String & str ) const
{
return compare( str );
}
inline bool String::operator == ( const char * str ) const
{
return compare( str );
}
inline bool String::operator != ( const String & str ) const
{
return !(compare( str ));
}
inline bool String::subStr( const String & str ) const
{
return abbrev( str );
}
inline bool String::subStr( const char * str ) const
{
return abbrev( str );
}
inline void String::startArgs()
{
strcpy( _argbuf, rep->str );
_argnext = _argbuf;
}
inline const char * String::getArgRest()
{
return _argnext;
}
#endif