/
ScryMUD/mud/
ScryMUD/mud/grrmud/Boards/
ScryMUD/mud/grrmud/Help/
ScryMUD/mud/grrmud/Pfiles/
ScryMUD/mud/grrmud/PlayerSacks/
ScryMUD/mud/grrmud/PlayerShops/
ScryMUD/mud/grrmud/help_filter/
ScryMUD/mud/hegemon/
ScryMUD/mud/hegemon/data/
ScryMUD/mud/hegemon/data/help/battle/
ScryMUD/mud/hegemon/data/help/client/
ScryMUD/mud/hegemon/data/help/communications/
ScryMUD/mud/hegemon/data/help/skills/
ScryMUD/mud/hegemon/data/help/spells/
ScryMUD/mud/include/
ScryMUD/mud/lib/
ScryMUD/mud/lib/bitfield/
ScryMUD/mud/lib/log/
ScryMUD/mud/lib/string2/
// $Id: string2.h,v 1.12 1999/07/18 00:59:24 greear Exp $
// $Revision: 1.12 $  $Author: greear $ $Date: 1999/07/18 00:59:24 $

//
//ScryMUD Server Code
//Copyright (C) 1998  Ben Greear
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// To contact the Author, Ben Greear:  greear@cyberhighway.net, (preferred)
//                                     greearb@agcs.com
//

// string2.h -- Declarations for the String library
// Coded by Ben Greear

// Everyone is free to use this code, just leave my name intact.
// This has not been tested very much, so use at your own risk!! :)

// Any questions, write me at:  greear@pollux.cs.uga.edu

 
#ifndef String2Include
#define String2Include


#define TRUE 	1
#define FALSE 	0

#include <stdio.h> 
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>
#include <LogStream.h>
#include <stdarg.h>

#define LOGFILE (*(String::getLogFile()))


class String {
protected:

   char *string;
   int max_len;
   int cur_len;
   int Assert(int boolean_val, const char* msg) const;

public:
   static int string_cnt;
   static int total_bytes;

   static LogStream* logfile;

   String  (); //default constructor
   String  (const char* S);
   String  (const String& S);
   String  (const int m_len);
   ~String ();
   
   static void setLogFile(LogStream* dafile);// { logfile = dafile; }
   static LogStream* getLogFile();// { return logfile; }

   ///*********************  OPERATORS  ******************************///
   
   String& operator+= (const String &S);
   String& operator+= (const char* S);
   String& operator+= (const char s);
   String& operator+= (const int i);
   String& operator+= (const long l);
   String& operator= (const String &S);
   String& operator= (const char* S);
   String& operator= (const int i);
   String& operator= (const long l);
   String& operator= (const char c);

   // NOTE:  can't assign with this operator, see setCharAt()
   char operator[] (const unsigned int i) const;

   String operator+ (const char* S) const;
   String operator+ (const String& S) const;
   int operator== (const char* S) const;
   int operator!= (const char* S) const;
   int operator> (const char* S) const;
   int operator< (const char* S) const;
   int operator> (const String& S) const;
   int operator< (const String& S) const;
   int operator>= (const char* S) const;
   int operator<= (const char* S) const;
   operator const char* () const;


///********************  FRIEND OVERLOADS  **************************///

   friend ostream& operator<< (ostream& stream, const String& str);
   friend istream& operator>> (istream& stream, String& str);
   friend void Sprintf(String& targ, const char* string, ...);
   friend void vSprintf(String& targ, const char* string, va_list var_args);
   friend int Strncompare(const String& a, const String& b);
   
///**********************  MEMBER FUNCTIONS  ************************///

   char charAt(int idx) const ;
   void setCharAt(int idx, const char val);

   /** Doesn't release memory, but virtually clears out the data. */
   void Clear();
   void Vclear() { Clear(); } //Same as Clear now.. (Deprecated)
   void clear() { Clear(); } //Should migrate to lower-case cmds some day.

   /** Releases all the memory it can. */
   void purge();

   void Prepend(const int source);
   void Prepend(const long source);
   void Prepend(const char* source);
   void Prepend(const String& source);
   void Append(const int source);
   void Append(const long source);
   void Append(const char* source);
   void Append(const String& source);
   void Append(const char source);
   void appendHex(const long l);
   void Getline(istream& stream, int max_len);
   void getLine(istream& stream, int max_len) {
      Getline(stream, max_len);
   }
   void Cap();
   void Tolower(); //makes total string lowercase
   void toLower() { Tolower(); } //makes total string lowercase
   void toUpper(); //makes total string lowercase
   int  Strlen() const;
   void Report() const; //logs vital stats, for debugging.
   void ensureCapacity(int max_length);
   unsigned int hash(); // return a value that should be pretty unique.

   int  Write(const int desc, const int max_to_write);
   //writes to a descriptor, deletes what it writes

   int  Read(const int desc, const int max_to_read); //reads from a desc

   /** Reads untill it finds the delim, and then reads untill
    * it finds another.  Escape the delim with a \ (backslash).
    * This is not too efficient, as it reads one character at
    * a time, btw.
    */
   int readToken(char delim, ifstream& dafile, int include_delim);

   void Termed_Read(ifstream& da_file);
   int Contains(const char ch) const;
   void  Refigure_strlen();			//bletcherous hack!
   void parse_show(short posn);  //specific to ScryMUD program
   void InsertAfter(char a, int posn);
   void InsertBefore(char a, int posn);
   void insertAfter(int i, const char* str);

   void Strip(); //take spaces off of front and back
   void dropFromEnd(int num_chards); //drop a few off the end of the string
   String sterilizeForHtml() const;

   /* Both of these next two delete what they grab from the string.
    * grabs first word or number deliminated
    * by space, a '.' or null char
    */
   String Get_Command(short& eos, short& term_by_period, short is_first = 0);

   /** Grabs first token deliminated by a space, period, or null character.*/
   String getToken() {
      short eos, tbp;
      return Get_Command(eos, tbp);
   }

   String Get_Rest(short destruct = TRUE);	//grabs phrase, deliminated 
   //by a newline or null char
   
   String Look_Command(short is_first = 0) const; //grabs first word or number deliminated
				//by space, a '.' or null char, does not 
				//delete it from the string.

   //grabs everything untill that character is found.  It removes all that
   // from the string, so successive calls iterate through it...
   // Returned pointer is to a String allocated off of the Heap..ie delete it
   // eventually if that makes sense.
   String* getUntil(char dlm);
   
};
#endif