//****************************************************************//
// Filename:    SIFC_Strings.cpp
// Autor:       Christian Taulien of Strange Intelligence
// Purpose:     Implementierung der StringC Klasse
// Creation:    27. Mai 1997
//****************************************************************//
#define RCSID_SIFC_STRINGS_CPP "$Id: SIFC_Strings.cpp 1.23 1998/04/20 02:44:01 Christian_Taulien Exp Christian_Taulien $"

#include "SIFC_Strings.h"
#include <stdio.h>
#include <pragma/utility_lib.h>

//#ifdef si_debug
//#undef si_debug
//#define si_debug_x
//#endif

/*S*/ // stringc-needed macros
#ifndef SIFC_MAX
# define SIFC_MAX(a,b) ((a)>(b) ? (a) : (b))
#endif

void dummyFunc(void *,...) {};

#ifndef SIFC_MIN
# define SIFC_MIN(a,b) ((a)<(b) ? (a) : (b))
#endif

#ifndef TRACEMETHOD
# ifdef si_debug
#  define TRACEMETHOD cout << __FUNC__ " [this: " << (void *) this << "]" << endl;
# else
#  define TRACEMETHOD
# endif
#endif

// TRACE-Macro
#ifndef TRACE
# ifdef si_debug
#  define TRACE printf
# else
#  define TRACE ::dummyFunc
# endif
#endif

#ifndef ASSERT
# ifdef si_asserts
#  define ASSERT(condition) if (!(condition)) \
   {\
      cout << "!!!Assertion failed: \"" << #condition << "\", in file " << __FILE__ << " line " << __LINE__ << endl;\
   }
# else
#  define ASSERT(contition)
# endif
#endif

#define STRINGC_XC "stringc-class-exception"
/*E*/

StringDataC glob_oEmptyStringData =
{
  "",
  0,
  0,
  1
};

const char *StringC::m_asStringTable[StringC::STRINGC_AccessLast] =
/*S*/
{
  "tried to access a char not in bufferrange",
  "not enough memory for string addition",
  "write access on empty string",
  "illegal use of zero-string length"
};
/*E*/

// private methods -------------------------------------------------
const char *StringC::getStringTableEntry(ULONG arg_ulIndex)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: getStringTableEntry()
*
* Klasse: StringC
*
* Funktion: ermittelt einen Bibliotheken-String
*
* Zugriff: private
*
* Eingabe-Parameter: 1
*   ULONG arg_ulIndex:  Der Index des gewünschten Strings
*       [0...STRINGC_Last aus der enum-Anweisung]
*
* Ausgabe-Parameter: const char *: Zeiger auf den ermittelten String
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: 1
*   global_sSpecialErr_WrongStringID: Zeiger auf Text für schweren Fehler
*
* Benutzte Methoden: -
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  4. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  4. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
ASSERT(arg_ulIndex < STRINGC_Last)

  // if the index is smaller than STRINGC_Last (max. ID)
  if (arg_ulIndex < STRINGC_Last)
  {
    // return the wanted string
    return(m_asStringTable[arg_ulIndex]);
  }
  else
  {
    // return a heavy-error-message
    return("###");
  } // if (arg_ulIndex < STRINGC_Last)
}
/*E*/

BOOL StringC::isFilled()
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode:
*
* Klasse:
*
* Funktion:
*
* Zugriff:
*
* Eingabe-Parameter:
*
* Ausgabe-Parameter:
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden:
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*  1. April 1998: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(m_poData)
return m_poData != &glob_oEmptyStringData;
}
/*E*/
BOOL StringC::isMultiUsed()
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode:
*
* Klasse:
*
* Funktion:
*
* Zugriff:
*
* Eingabe-Parameter:
*
* Ausgabe-Parameter:
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden:
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*  1. April 1998: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(m_poData);
return m_poData->m_lRefs > 1 ? TRUE : FALSE;
}
/*E*/
void StringC::decReference()
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode:
*
* Klasse:
*
* Funktion:
*
* Zugriff:
*
* Eingabe-Parameter:
*
* Ausgabe-Parameter:
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden:
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*  1. April 1998: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance());

  // if we are not the default pointer
  if (isFilled() && isMultiUsed())
  {
    // increment the reference counter
    m_poData->m_lRefs--;
  } // if
}
/*E*/
void StringC::incReference()
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode:
*
* Klasse:
*
* Funktion:
*
* Zugriff:
*
* Eingabe-Parameter:
*
* Ausgabe-Parameter:
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden:
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*  1. April 1998: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance());

  // if we are not the default pointer
  if (isFilled())
  {
    // increment the reference counter
    m_poData->m_lRefs++;
  } // if
}
/*E*/
void StringC::prepareModify()
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode:
*
* Klasse:
*
* Funktion:
*
* Zugriff:
*
* Eingabe-Parameter:
*
* Ausgabe-Parameter:
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden:
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. April 1998
*
* Letzte Änderungen/Neuerungen:
*  2. April 1998: Methode definiert
*
*************************************************************************/
/*E*/
{    
TRACEMETHOD
ASSERT(checkInstance())

  // if the object is empty or multiused
  if (!isFilled() || isMultiUsed())
  {
    // allocate a new data-object
    StringDataC *poNewData = new StringDataC;
    if (!poNewData)
    {
      throw STRINGC_XC;
    } // if

    // take over the datas
    poNewData->m_ulStrLen = m_poData->m_ulStrLen;
    poNewData->m_ulBufLen = SIFC_MAX(m_poData->m_ulBufLen,8);
    poNewData->m_lRefs    = 1;

    // allocate the buffer
    poNewData->m_sStrPtr = new char [m_poData->m_ulBufLen+1];
    if (!poNewData->m_sStrPtr)
    {
      delete poNewData;
      throw STRINGC_XC;
    }
      // ... and copy the string
    memcpy(poNewData->m_sStrPtr, m_poData->m_sStrPtr, poNewData->m_ulBufLen);
    poNewData->m_sStrPtr[poNewData->m_ulStrLen] = '\0';

    // from now on, we're changed to the new buffer
    m_poData = poNewData;
  } // if
}
/*E*/
StringC::StringC(ULONG arg_ulStrLen, ULONG arg_ulBufLen, char *arg_sStrPtr)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode:
*
* Klasse:
*
* Funktion:
*
* Zugriff:
*
* Eingabe-Parameter:
*
* Ausgabe-Parameter:
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden:
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*  1. April 1998: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  m_poData = new StringDataC;
  if (!m_poData)
  {
    throw STRINGC_XC;
  } // if

  m_poData->m_sStrPtr  = arg_sStrPtr;
  m_poData->m_ulStrLen = arg_ulStrLen;
  m_poData->m_ulBufLen = arg_ulBufLen;
  m_poData->m_lRefs    = 1;
}
/*E*/

// protected methods -----------------------------------------------
#ifdef si_debug
void StringC::dumpContext(void) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: dumpContext()
*
* Klasse: StringC
*
* Funktion: gibt den Inhalt der Datenmember nach cout aus
*
* Zugriff: protected
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 28. Mai 1997
*
* Letzte Änderungen/Neuerungen:
*   28. Mai 1997:   Methode definiert
*
*************************************************************************/
/*E*/
{
ASSERT(checkInstance())
  cout << "+++ StringC-Datenmembers: +++" << endl;
  cout << "StringC::m_sStrPtr=\t\t" << (void *) m_poData->m_sStrPtr << endl;
  cout << "StringC::m_ulStrLen=\t\t" << m_poData->m_ulStrLen << endl;
  cout << "StringC::m_ulBufLen=\t\t" << m_poData->m_ulBufLen << endl;
  cout << "StringC::m_rRefs=\t\t\t" << m_poData->m_lRefs << endl;
  cout << "+++ StringC dump complete " << endl;
}
/*E*/
#endif
void StringC::initStringC(const char *arg_sStrPtr, ULONG arg_ulBufLen)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: initStringC()  [Nr. 1]
*
* Klasse: StringC
*
* Funktion: initialisiert ein Objekt anhand eines Quellpointers und
*   einer Bufferlänge
*
* Zugriff: protected
*
* Eingabe-Parameter: 2
*   char *arg_sStrPtr:  Der Zeiger auf den Quell-String (wird kopiert)
*   ULONG arg_ulBufLen:   Gewünschte Länge des Buffers
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 4
*   initInstance()
*   allocBuffer()
*   string.h/strlen()
*   string.h/strncpy()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 28. Mai 1997
*
* Letzte Änderungen/Neuerungen:
*   28. Mai 1997:     Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(arg_sStrPtr)

  // Init & Alloc
  initInstance();

  // for safety reasons an additional byte must be allocated
  allocBuffer(arg_ulBufLen);

  // Compute the new string length, but maximal the new buflength
  ULONG lStrLen=SIFC_MIN(arg_ulBufLen, strlen(arg_sStrPtr));

  // copy the source-string
  strncpy(m_poData->m_sStrPtr, arg_sStrPtr, lStrLen);

  // init the values
  m_poData->m_ulStrLen=lStrLen;       // the new string length
  m_poData->m_sStrPtr[lStrLen]=0;     // set the terminating byte
}
/*E*/
void StringC::initStringC(ULONG arg_ulBufLen)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: initStringC()  [Nr. 2]
*
* Klasse: StringC
*
* Funktion: Initialisiert das Objekt anhand einer Buffer-Größe
*
* Zugriff: protected
*
* Eingabe-Parameter: 1
*   ULONG arg_ulBufLen: Gewünschte Größe des Buffers
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   allocBuffer()
*   initInstance()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   28. Mai 1997:   Methode definiert
*   25. Juni 1997:  memset() wird nun von allocBuffer() übernommen.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
// Parameter-Check
ASSERT(arg_ulBufLen)

  // Init & Alloc
  initInstance();
  // allocate buffer and initialize it with zeros
  allocBuffer(arg_ulBufLen);
}
/*E*/
void StringC::allocBuffer(ULONG arg_ulSize)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: allocBuffer()
*
* Klasse: StringC
*
* Funktion: alloziert Speicher für den String-Object-Buffer
*       Achtung: Wenn nicht genug Mem, dann wird eine XC geschmissen
*
* Zugriff: protected
*
* Eingabe-Parameter: 1
*   ULONG arg_ulSize: Die Größe des Buffers in Bytes. NULL für Speicher
*             freigeben
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: 1
*   global_sCommonErr_NoMem - bei Übergabe an XC
*
* Benutzte Methoden: 4
*   freeBuffer()
*   isMultiUsed()
*   ObjectXC::ObjectXC()
*   string.h/memset()
*
* Version: 3.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*   27. Mai 1997:   Methode definiert
*  4. Juni 1997:  Speichermanagement verbessert. Es wird nur noch dann
*           neuer Speicher reserviert, wenn der alte Buffer nicht
*           groß genug für den neuen ist. Um Buffer explizit zu
*           schmälern sollte zuvor freeBuffer() aufgerufen werden
*  1. April 1998: Speichermanagement für StringArrayC angepasst
*
*************************************************************************/
/*E*/
{
TRACEMETHOD

  // a size of zero means freeBuffer()
  if (!arg_ulSize)
  {
    freeBuffer();
    return;
  } // if (!arg_ulSize)

  // A new buffer can't contain a string yet
  m_poData->m_ulStrLen=0;

  // If multiused or the existing buffer is not big enough
  if (isMultiUsed() || m_poData->m_ulBufLen < arg_ulSize)
  {
    // free the old buffer
    freeBuffer();

    // allocate a new big one
    // (dividable by 8 and mind 1 bigger than wanted)
    ULONG ulSize=(arg_ulSize+8) & (~0x7);
    m_poData = new StringDataC;

    if (!m_poData)
    {
      throw STRINGC_XC;
    } // if

    m_poData->m_sStrPtr = new char [ulSize];
    if (!m_poData->m_sStrPtr)
    {
      // if the string-buffer could not be allocated
      delete m_poData;
      throw STRINGC_XC;
    } // if

    m_poData->m_ulBufLen = ulSize-1; // one wall-byte
    m_poData->m_lRefs = 1;
  } // if (m_ulBufLen < arg_ulSize)

  // always set the Bytes in the buffer to zero
  memset(m_poData->m_sStrPtr, 0, m_poData->m_ulBufLen+1);
}
/*E*/
void StringC::freeBuffer(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: freeBuffer(void)
*
* Klasse: StringC
*
* Funktion: Gibt den Puffer-Speicher eines String-Objekts frei und init-
*   ialisiert es wieder.
*
* Zugriff: protected
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   isFilled()
*   isMultiUsed()
*   initInstance()
*
* Version: 2.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*   27. Mai 1997:   Methode definiert
*    1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(m_poData)
ASSERT(m_poData->m_sStrPtr)

  // if we have a pointer to a string-data-object
  if (isFilled())
  {
    // if the reference pointer
    if (isMultiUsed())
    {
      decReference();
    }
    else
    {
      // if there is something to free
      if (m_poData->m_ulBufLen)
      {
        delete [] m_poData->m_sStrPtr;
      } // if
      delete m_poData;
    } // if

    initInstance();
  } // if
}
/*E*/
void StringC::resizeBuffer(ULONG arg_ulSize)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: resizeBuffer()
*
* Klasse: StringC
*
* Funktion: Verändert die Größe des Buffers
*
* Zugriff: protected
*
* Eingabe-Parameter: 1
*   ULONG arg_ulSize:   Die neue Größe des Buffers
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   releaseBuffer()
*   initStringC()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  4. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  4. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  // the resize-size must be min 2 chars
  ULONG ulSize = SIFC_MAX(arg_ulSize, 2);

  // save the buffer-pointer
  char *sTemp = releaseBuffer();

  // now the old buffer can be freed if it is neccessary
  if (sTemp)
  {
    // allocate a new buffer with the right size, but the old string
    initStringC(sTemp, ulSize);
    delete [] sTemp;
  }
  else
  {
    // get the new buffer by giving just the new size
    initStringC(ulSize);
  } // if (sTemp)
}
/*E*/
ULONG StringC::getBufferSize(void) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: getBufferSize()
*
* Klasse: StringC
*
* Funktion: Ermittelt die Größe des Buffers
*
* Zugriff: protected
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: ULONG: Die Größe des Buffers
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*    1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())

return(m_poData->m_ulBufLen);
}
/*E*/

// public methods --------------------------------------------------
// Constructors & Destruktor
StringC::StringC()
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: StringC()
*
* Klasse: StringC
*
* Funktion: Konstruktor
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   initInstance()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. März 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den debug-infos berichtigt
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  initInstance();
}
/*E*/
StringC::StringC(const char *arg_sStrPtr)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: StringC()
*
* Klasse: StringC
*
* Funktion: Konstruktor mit const char-Pointer als Argument
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   arg_sStrPtr:  Zeiger auf eine Zeichenkette oder NULL
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   initString()
*   intiInstance()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. März 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den Debuginfos berichtigt
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  // if we got a non-zero-pointer
  if (arg_sStrPtr)
  {
    initStringC(arg_sStrPtr, strlen(arg_sStrPtr));
  }
  else
  {
    // otherwise default init
    initInstance();
  } // if
}
/*E*/
StringC::StringC(ULONG  arg_ulBufLen)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: StringC()
*
* Klasse: StringC
*
* Funktion: Konstruktor mit Bufferlängenangabe
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   arg_ulBufLen:   Gewünschte Länge des StringBuffers
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   initString()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. März 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den Debuginfos berichtigt
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  // if the buflen is non-zero
  if (arg_ulBufLen)
  {
    initStringC(arg_ulBufLen);
  }
  else
  {
    // otherwise default way
    initInstance();
  } // if
}
/*E*/
StringC::StringC(const char *arg_sStrPtr, ULONG arg_ulBufLen)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: StringC()
*
* Klasse: StringC
*
* Funktion: Konstruktor mit Zeichenketten- und Bufferlängenangabe
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   arg_sStrPtr: Zeiger auf den Init-string
*   arg_ulBufLen:   Gewünschte Länge des StringBuffers
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   initString()
*   initInstance()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. März 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den Debuginfos berichtigt
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  // if we got a non-zero string pointer at all
  if (arg_sStrPtr)
  {
    // ok - ready to init
    initStringC(arg_sStrPtr, arg_ulBufLen);
  }
  else
  {
    // but if we got a non-zero buflen
    if (arg_ulBufLen)
    {
      // init by buflen
      initStringC(arg_ulBufLen);
    }
    else
    {
      // init the object in a default way
      initInstance();
    } // if
  } // if
}
/*E*/
StringC::StringC(const StringC &arg_roSrcObj)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: StringC()
*
* Klasse: StringC
*
* Funktion: Kopier-Konstruktor
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   arg_roSrcObj:   Referenz auf ein Quell-objekt
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   initString()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. März 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den Debuginfos berichtigt
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(arg_roSrcObj.checkInstance());
  // copy the datapointer
  m_poData = arg_roSrcObj.m_poData;

  // and increase the reference counter
  incReference();
}
/*E*/
StringC::~StringC()
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: ~StringC()
*
* Klasse: StringC
*
* Funktion: Destruktor
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   freeBuffer()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 15. Oktober 1997
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  freeBuffer();
}
/*E*/
// CVI-Methods
BOOL StringC::checkInstance(void) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: checkInstance()
*
* Klasse: StringC
*
* Funktion: prüft, ob die Objekt-Instanz gültig ist
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: 1
*   global_sEmptyString: der globale EmptryString
*
* Benutzte Methoden: -
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*   11. Juni 1997:  Methode definiert
*    1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  // worst case at all:
  if (!m_poData)
  {
    printf("!m_poData\n");
    return FALSE;
  } // if

  // At no time, it is valid to have a zero-stringpointer
  if (!m_poData->m_sStrPtr)
  {
    printf("!m_poData->m_sStrPtr\n");
    return(FALSE);
  } // if (!m_sStrPtr)

  // our StrLen can't be greater than our BufLen
  if (m_poData->m_ulStrLen > m_poData->m_ulBufLen)
  {
    printf("m_poData->m_ulStrLen > m_poData->m_ulBufLen\n");
    return(FALSE);
  } // if (m_ulStrLen > m_ulBufLen)

  // if we got no BufLen, we can't have got a StrLen
  if (m_poData->m_ulStrLen && (!m_poData->m_ulBufLen))
  {
    printf("m_poData->m_ulStrLen && (!m_poData->m_ulBufLen)\n");
    return(FALSE);
  } // if (m_ulStrLen && (!m_ulBufLen))

  // if our string is not zero-byted
  if (m_poData->m_sStrPtr[m_poData->m_ulStrLen]!=0)
  {
    printf("m_poData->m_sStrPtr[m_poData->m_ulStrLen]!=0\n");
    return(FALSE);
  } // if (m_sStrPtr[m_ulStrLen]!=0)

// if we reached this point, we are valid
return(TRUE);
}
/*E*/
void StringC::validateInstance(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: validateInstance()
*
* Klasse: StringC
*
* Funktion: Überprüft die Objektinstanz und korrigiert es gegebenenfalls
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   initInstance()
*   string.h/strlen()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*   11. Juni 1997:  Methode definiert
*    1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  // if we have an invalid string pointer
  if (!m_poData->m_sStrPtr)
  {
    // initialize the object
    initInstance();
  }
  else
  {
    // if buf is valid and no empty string
    if (m_poData->m_ulBufLen)
    {
      // there has to be a zero-byte
      m_poData->m_sStrPtr[m_poData->m_ulBufLen]=0;
      // compute the real string-length
      m_poData->m_ulStrLen=strlen(m_poData->m_sStrPtr);
    } // if (m_ulBufLen)

    // if
    if (m_poData->m_lRefs < 1)
    {     
      m_poData->m_lRefs = 1;
    } // if
  } // if (!m_sStrPtr)
}
/*E*/
void StringC::initInstance(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: initInstance()
*
* Klasse: StringC
*
* Funktion: Initialisiert die StringC-Instanz
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: 1
*   global_sEmtpyString - Zeiger auf eine leere Zeichenkette
*
* Benutzte Methoden: -
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
*   27. Mai 1997:   Methode definiert
*    1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  // Assign the global empty string to the object
  m_poData = &glob_oEmptyStringData;
}
/*E*/

// static methods
void StringC::initStatic(StringC *arg_poString)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode:
*
* Klasse:
*
* Funktion:
*
* Zugriff:
*
* Eingabe-Parameter:
*
* Ausgabe-Parameter:
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden:
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 15. April 1998
*
* Letzte Änderungen/Neuerungen:
* 15. April 1998: Methode definiert
*
*************************************************************************/
/*E*/
{
  if (arg_poString)
  {
    arg_poString->m_poData = &glob_oEmptyStringData;
  } // if
}
/*E*/

// other public methods
BOOL StringC::isEmpty(void) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: isEmpty()
*
* Klasse: StringC
*
* Funktion: Prüft, ob das Objekt eine Leere Zeichenkette repräsentiert
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: BOOL: TRUE, wenn der String leer ist (Länge=0)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.2
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998:    Fehler in den Debuginfos berichtigt
*    1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
return m_poData->m_ulStrLen ? FALSE : TRUE;
}
/*E*/
void StringC::emptyString(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: emptyString()
*
* Klasse: StringC
*
* Funktion: Leert den String. D.h. setzt einen Leerstring.
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   freeBuffer()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. März 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den Debuginfos berichtigt
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  freeBuffer();
}
/*E*/
ULONG StringC::getLength(void) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: getLength()
*
* Klasse: StringC
*
* Funktion: Ermittelt die Länge des Strings
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: ULONG: Die Länge des Strings
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.2
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den Debuginfos berichtigt
*  1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance());

return m_poData->m_ulStrLen;
}
/*E*/
const char *StringC::getBuffer(void) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: getBuffer()
*
* Klasse: StringC
*
* Funktion: Ermittelt einen Zeiger auf den String als char *
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: const char *: Der Zeicher auf die Zeichenkette
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.2
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  1. April 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
* 28. Februar 1998: Fehler in der debug-info berichtigt.
*    1. April 1998: Speichermanagement für StringArrayC angepasst.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
return m_poData->m_sStrPtr;
}
/*E*/
void StringC::freeExtra(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: freeExtra()
*
* Klasse: StringC
*
* Funktion: Minimiert den Speicherverbrauch. (Aber: Fragmentierung!)
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   resizeBuffer()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. März 1998
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*  2. März 1998: Fehler in den Debuginfos berichtigt
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  // prepareModify() is not nessecary, because
  // releaseBuffer() called by resizeBuffer() will
  // do this for us.
  resizeBuffer(strlen(m_poData->m_sStrPtr));
}
/*E*/
char StringC::getAt(ULONG arg_ulIndex, BOOL arg_fResizeIfNeccessary /*=FALSE*/)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: getAt()
*
* Klasse: StringC
*
* Funktion: Ermittelt das n.te Zeichen des Strings
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   ULONG arg_ulIndex: Das wievielte Zeichen ermittelt werden soll
*   BOOL arg_fResizeIfNeccessary: (optional, def=FALSE) TRUE, wenn der Buffer
*     vergrößert werden soll, wenn außerhalb des Buffers zugegriffen wird
*
* Ausgabe-Parameter: char: Das an der n.ten Stelle stehende Zeichen
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   ObjectXC::ObjectXC()
*   getStringTableEntry()
*   resizeBuffer()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 29. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  4. Juni 1997:  Methode definiert
*   29. Juni 1997:  Wenn versucht wird auch außerhalb der String-Länge
*           zuzugreifen, wird lediglich eine NULL zurückgegeben.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_ulIndex < getBufferSize())

  // if the access is out of allocated range
  if (arg_ulIndex > getBufferSize())
  {
    // and if no Resizing is wanted
    if (!arg_fResizeIfNeccessary)
    {
      // we have to throw a stone, okay not really but nearly
      ASSERT(FALSE);
      arg_ulIndex = NULL;
    }
    else
    {
      // reallocate memory
      resizeBuffer(arg_ulIndex);
    } // if (!arg_fResizeIfNeccessary)
  } // if (arg_ulIndex >= m_ulBufLen)

  // if we try to access out of the string length
  if (arg_ulIndex >= m_poData->m_ulStrLen)
  {
    // just return zero
    return(NULL);
  } // if (arg_ulIndex >= m_ulStrLen)

return(m_poData->m_sStrPtr[arg_ulIndex]);
}
/*E*/
char *StringC::releaseBuffer(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: releaseBuffer()
*
* Klasse: StringC
*
* Funktion: gibt die Verwaltung des Buffers an andere frei
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: char *: Zeiger auf den Buffer
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   initInstance()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  4. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  4. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance());

  // safety - check
  if (!getBufferSize())
  {
     return(NULL);
  } // if (!m_ulBufLen)

  // den Buffermodus auf jeden fall jetzt umschalten
  prepareModify();

  // save pointer to the string
  char *sTemp = m_poData->m_sStrPtr;

  // re-init the object without freeing our mem (because we'll need it later)
  initInstance();

// return the pointer to the mem, now its left to the caller to free the mem
return(sTemp);
}
/*E*/
char StringC::setAt(ULONG arg_ulIndex, char arg_cChar, BOOL arg_fResizeIfNeccessary /*=FALSE*/)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: setAt()
*
* Klasse: StringC
*
* Funktion: setzt das n.te byte und gibt das alte zurück
*
* Zugriff: public
*
* Eingabe-Parameter: 3
*   ULONG arg_ulIndex: das wievielte byte bearbeitet werden soll
*   char arg_cChar: Dieses Byte wird an n.ter Stelle eingetragen
*   BOOL arg_fResizeIfNeccessary: (optional, def=FALSE) TRUE, wenn der Buffer
*     vergrößert werden soll, wenn außerhalb des Buffers zugegriffen wird
*
* Ausgabe-Parameter: char: das Zeichen, welches sich vorher an der stelle
*     befand
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   ObjectXC::ObjectXC()
*   getStringTableEntry()
*   resizeBuffer()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 29. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  4. Juni 1997:  Methode definiert
*   29. Juni 1997:  Zugriffe sind nur noch vor und am String-Ende erlaubt
*           Zugriffe hinter dem Zero-Byte werden ignoriert.
*           Wenn das Zero-Byte indiziert wird, so wird nach
*           der Schreiboperation die Stringlänge erhöht und
*           das Zero-Byte auf der nächsten Position gesetzt.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
// Access-Check (index should be smaller than buflen!)
ASSERT(arg_ulIndex < getBufferSize())

  char cOldChar = NULL;
  prepareModify();

  // if the access is out of allocated range
  if (arg_ulIndex >= getBufferSize())
  {
    // and if no resizing is wanted
    if (!arg_fResizeIfNeccessary)
    {
      ASSERT(FALSE);
      // we have to throw a stone
      throw STRINGC_XC;
    } // if (!arg_fResizeIfNeccessary)

    // reallocate memory
    resizeBuffer(arg_ulIndex);
  }

  // if the user accesses the "zero-byte"
  if (arg_ulIndex == getLength())
  {
    // if we do not write a zerobyte
    if (arg_cChar != NULL)
    {
      // set the new char
      m_poData->m_sStrPtr[arg_ulIndex] = arg_cChar;
      // increase the string length an guarantee the zero-byte exists
      m_poData->m_ulStrLen++;
      m_poData->m_sStrPtr[m_poData->m_ulStrLen] = '\0';
    } // if (arg_cChar != NULL)
  }
  else if (arg_ulIndex < getLength())
  {
    // otherwise we only allow accesses inner the string
    // outer-string accesses will be ignored

    // save the old char
    cOldChar = m_poData->m_sStrPtr[arg_ulIndex];
    // set the new char
    m_poData->m_sStrPtr[arg_ulIndex] = arg_cChar;

    // if we wrote a zerobyte
    if (arg_cChar == '\0')
    {
      // the given Index is the new string-length
      m_poData->m_ulStrLen = arg_ulIndex;
    } // if (arg_cChar == NULL)
  } // if (arg_ulIndex >= m_ulBufLen)


// return the old char
return(cOldChar);
}
/*E*/
void StringC::setString(const char *arg_sString)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: setString()
*
* Klasse: StringC
*
* Funktion: Zuweisungs-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   arg_sString:  Ein Zeiger auf den neuen String
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 4
*   initInstance()
*   string.h/strlen()
*   allocBuffer()
*   string.h/strncpy()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 10. Oktober 1997
*
* Letzte Änderungen/Neuerungen:
* 10. Oktober 1997: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  // if we have got a zeropointer
  if (!arg_sString)
  {
    // default values
    initInstance();
  }
  else
  {
    // calculate the string-length
    int iLen = strlen(arg_sString);

    // allocate the required buffer
    // (no need for prepareModify())
    allocBuffer(iLen);

    // set the new length appropriately
    m_poData->m_ulStrLen = iLen;

    // copy the string
    strncpy(m_poData->m_sStrPtr, arg_sString, iLen);

    // put the zerobyte
    m_poData->m_sStrPtr[iLen] = 0;
  } // if
}
/*E*/
LONG StringC::compareStringNoCase(StringC &arg_roCompObj)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: compareStringNoCase()
*
* Klasse: StringC
*
* Funktion: vergleicht den String mit einem anderem ohne Beachtung der
*       Groß- und Kleinschreibung
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   StringC &arg_roCompObj: eine Referenz auf ein StringC-Object mit dem
*     dieses Obj. verglichen werden soll.
*
* Ausgabe-Parameter: LONG: >0 wenn this>arg, <0 wenn this<s, 0 wenn this==arg
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 1
*   utility.library/Stricmp()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   20. November 1996:  Methode definiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exeptionhandling wieder ausgebaut weil es Probleme
*             gab, als NodeC Objekte mit NULL-Pointern als Namen
*             z.B. sortiert werden sollten. Es gilt nun:
*             beide Op gleich NULL, Ergebnis 0 (für "wahr")
*             beide Op ungleich NULL, es entscheidet Stricmp()
*             der 1. Op gleich NULL, Ergebnis -1 für "<"
*             der 2. Op gleich NULL, Ergebnis 1 für ">"
*   12. Juni 1997   :   Aus dem Berlin-Projekt übernommen und angepasst
*             Aufgrund der StringC-Implementierung können
*             NULL-Zeiger nicht auftreten.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance());
ASSERT(arg_roCompObj.checkInstance());

return(Stricmp(m_poData->m_sStrPtr, arg_roCompObj.m_poData->m_sStrPtr));
}
/*E*/
LONG StringC::compareStringNoCase(char *arg_sCompStr)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: compareStringNoCase()
*
* Klasse: StringC
*
* Funktion: Vergleicht den String mit einem anderem ohne Beachtung der
*       Groß- und Kleinschreibung
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char *arg_sCompStr: ein Zeiger auf ein String mit dem
*     dieses Obj. verglichen werden soll.
*
* Ausgabe-Parameter: LONG: >0 wenn this>arg, <0 wenn this<s, 0 wenn this==arg
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 1
*   utility.library/Stricmp()
*
* Version: 1.4
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   20. November 1996:  Methode definiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exeptionhandling wieder ausgebaut weil es Probleme
*             gab, als NodeC Objekte mit NULL-Pointern als Namen
*             z.B. sortiert werden sollten. Es gilt nun:
*             beide Op gleich NULL, Ergebnis 0 (für "wahr")
*             beide Op ungleich NULL, es entscheidet Stricmp()
*             der 1. Op gleich NULL, Ergebnis -1 für "<"
*             der 2. Op gleich NULL, Ergebnis 1 für ">"
*   12. Juni 1997   :   Aus dem Berlin-Projekt übernommen und angepasst
*             Aufgrund der StringC-Implementierung können
*             NULL-Zeiger nicht auftreten.
*   30. Juni 1997:    Komplett von der gleichnamigen Methode mit StringC&
*             als Parameter übernommen
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_sCompStr)

return(Stricmp(m_poData->m_sStrPtr, arg_sCompStr));
}
/*E*/
LONG StringC::compareStringLimited(StringC &arg_roCompObj, ULONG arg_ulLength)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: compareStringLimited()
*
* Klasse: StringC
*
* Funktion: Vergleicht den String mit einem Anderem mit Längenbegrenzung
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   StringC &arg_roCompObj: Eine Referenz eines StringC-Objektes mit dem verglichen
*         werden soll
*   ULONG arg_ulLength: Die maximale Anzahl der Bytes die beim Vergleich
*         berücksichtigt werden sollen.
*
* Ausgabe-Parameter: LONG: >0 wenn this>s, <0 wenn this<s, 0 wenn this==s
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 1
*   string.h/strncmp()
*
* Version: 1.4
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   20. November 1996:  Methode definiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exeptionhandling wieder ausgebaut weil es Probleme
*             gab, als NodeC Objekte mit NULL-Pointern als Namen
*             z.B. sortiert werden sollten. Es gilt nun:
*             beide Op gleich NULL, Ergebnis 0 (für "wahr")
*             beide Op ungleich NULL, es entscheidet Stricmp()
*             der 1. Op gleich NULL, Ergebnis -1 für "<"
*             der 2. Op gleich NULL, Ergebnis 1 für ">"
*   12. Juni 1997:    Aus dem Berlin-Projekt übernommen und angepasst
*             Aufgrund der StringC-Implementierung können
*             NULL-Pointer nicht auftreten. XC werden nur
*             bei Zugriff außerhalb der Range geworfen
*   30. Juni 1997:    Name des 2. Parameters berichtigt (l jetzt ul)
*             Es wird keine XC mehr geworfen, die Länge wird
*             automatisch auf die kleinere der beiden String-
*             Längen beschränkt.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_roCompObj.checkInstance())
  arg_ulLength = SIFC_MIN(arg_ulLength, getLength()+1);
  arg_ulLength = SIFC_MIN(arg_ulLength, arg_roCompObj.getLength()+1);

return(strncmp(m_poData->m_sStrPtr,arg_roCompObj.m_poData->m_sStrPtr, arg_ulLength));
}
/*E*/
LONG StringC::compareStringLimited(char *arg_sCompStr, ULONG arg_ulLength)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: compareStringLimited()
*
* Klasse: StringC
*
* Funktion: Vergleicht den String mit einem Anderem mit Längenbegrenzung
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   char *arg_sCompStr: Ein Zeiger auf einen String mit dem das Objekt
*        verglichen werden soll
*   ULONG arg_ulLength   : Die maximale Anzahl der Bytes die beim Vergleich
*         berücksichtigt werden sollen.
*
* Ausgabe-Parameter: LONG: >0 wenn this>s, <0 wenn this<s, 0 wenn this==s
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 1
*   string.h/strncmp()
*
* Version: 1.4
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   20. November 1996:  Methode definiert
*   29. November 1996:  Exceptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut weil es Probleme
*             gab, als NodeC Objekte mit NULL-Pointern als Namen
*             z.B. sortiert werden sollten. Es gilt nun:
*             beide Op gleich NULL, Ergebnis 0 (für "wahr")
*             beide Op ungleich NULL, es entscheidet Stricmp()
*             der 1. Op gleich NULL, Ergebnis -1 für "<"
*             der 2. Op gleich NULL, Ergebnis 1 für ">"
*   12. Juni 1997:    Aus dem Berlin-Projekt übernommen und angepasst
*             Aufgrund der StringC-Implementierung können
*             NULL-Pointer nicht auftreten. XC werden nur
*             bei Zugriff außerhalb der Range geworfen
*   30. Juni 1997:    Es wird keine XC mehr geworfen, die Länge wird
*             automatisch auf die String-Länge beschränkt
*             Die Methode wurde von der gleichnamigen Version
*             die jedoch StringC& als 1. Parameter nimmt über-
*             nommen.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_sCompStr)
  arg_ulLength=SIFC_MIN(arg_ulLength,getLength()+1);

return(strncmp(m_poData->m_sStrPtr,arg_sCompStr, arg_ulLength));
}
/*E*/
LONG StringC::compareStringLimitedNoCase(StringC &arg_roCompObj, ULONG arg_ulLength)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: compareStringLimitedNoCase()
*
* Klasse: StringC
*
* Funktion: Vergleicht den String mit einem anderen mit Längenbegrenzung
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   StringC &arg_roCompObj: eine Referenz eines StringC-Objektes mit dem
*         verglichen werden soll
*   ULONG arg_ulLength: Die maximale Anzahl der Bytes die beim Vergleich
*         berücksichtigt werden sollen.
*
* Ausgabe-Parameter: LONG: >0 wenn this>s, <0 wenn this<s, 0 wenn this==s
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 1
*   utility.library/Strnicmp()
*
* Version: 1.4
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   20. November 1996:  Methode definiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exeptionhandling wieder ausgebaut weil es Probleme
*             gab, als NodeC Objekte mit NULL-Pointern als Namen
*             z.B. sortiert werden sollten. Es gilt nun:
*             beide Op gleich NULL, Ergebnis 0 (für "wahr")
*             beide Op ungleich NULL, es entscheidet Stricmp()
*             der 1. Op gleich NULL, Ergebnis -1 für "<"
*             der 2. Op gleich NULL, Ergebnis 1 für ">"
*   12. Juni 1997:    Aus dem Berlin-Projekt übernommen und angepasst
*   30. Juni 1997:    Es wird keine XC mehr geworfen. Die Vergleichs-
*             länge wird automatisch auf die kleinere der
*             beiden String-Längen beschränkt.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_roCompObj.checkInstance())
  arg_ulLength=SIFC_MIN(arg_ulLength,getLength()+1);
  arg_ulLength=SIFC_MIN(arg_ulLength,arg_roCompObj.getLength()+1);

return(Strnicmp(m_poData->m_sStrPtr,arg_roCompObj.m_poData->m_sStrPtr, arg_ulLength));
}
/*E*/
LONG StringC::compareStringLimitedNoCase(char *arg_sCompStr, ULONG arg_ulLength)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: compareStringLimitedNoCase()
*
* Klasse: StringC
*
* Funktion: Vergleicht den String mit einem anderen mit Längenbegrenzung
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   StringC &arg_sCompStr: ein Zeiger auf den String mit dem verglichen
*         werden soll
*   ULONG arg_ulLength   : Die maximale Anzahl der Bytes die beim Vergleich
*         berücksichtigt werden sollen.
*
* Ausgabe-Parameter: LONG: >0 wenn this>s, <0 wenn this<s, 0 wenn this==s
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 1
*   utility.library/Strnicmp()
*
* Version: 1.4
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   20. November 1996:  Methode definiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exeptionhandling wieder ausgebaut weil es Probleme
*             gab, als NodeC Objekte mit NULL-Pointern als Namen
*             z.B. sortiert werden sollten. Es gilt nun:
*             beide Op gleich NULL, Ergebnis 0 (für "wahr")
*             beide Op ungleich NULL, es entscheidet Stricmp()
*             der 1. Op gleich NULL, Ergebnis -1 für "<"
*             der 2. Op gleich NULL, Ergebnis 1 für ">"
*   12. Juni 1997:    Aus dem Berlin-Projekt übernommen und angepasst
*   30. Juni 1997:    Es wird keine XC mehr geworfen. Die Vergleichs-
*             länge wird automatisch auf die kleinere der
*             beiden String-Längen beschränkt.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_sCompStr)
  arg_ulLength=SIFC_MIN(arg_ulLength,getLength()+1);

return(Strnicmp(m_poData->m_sStrPtr,arg_sCompStr, arg_ulLength));
}
/*E*/
StringC StringC::midString(ULONG arg_ulFirst, ULONG arg_ulCount) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: midString()
*
* Klasse: StringC
*
* Funktion: Pedant zur BASIC-Funktion MID$()
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   ULONG arg_ulFirst: 1. Zeichen das übernommen werden soll (index)
*   ULONG arg_ulCount: Anzahl der Zeichen
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   ObjectXC::ObjectXC()
*   getStringTableEntry()
*   StringC()
*
* Version: 1.2
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  6. August 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*   30. Juni 1997:  Die Methode prüft die Zugriffe jetzt stärker.
*           Bei einer Länge von NULL wird eine XC geworfen.
*           Die Länge muß kleiner oder gleich der restlichen
*           Bytes ab dem Index sein.
*   6. August 1997: Ist die Länge NULL, so wird keine XC mehr geworfen
*           Es wird nun ein leeres StringC-Objekt zurückgegeben.
*           was auch logischer ist. Außerdem wurde die Reihen-
*           folge der Prüfung verändert: Erst OutOfRange-Check
*           für das StartZeichen, dann Minimierung der Länge
*           Dann Prüfung auf Länge=NULL;
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_ulCount)
ASSERT(arg_ulFirst+arg_ulCount <= getLength())

  // if the first char is already out of range
  if (arg_ulFirst >= getLength())
  {
    // we got to throw a stone
    throw STRINGC_XC;
  } // if

  // Minimize the Size of the destination string
  arg_ulCount=SIFC_MIN(arg_ulCount, getLength()-arg_ulFirst);

  // if the wanted stringlength is zero,
  if (!arg_ulCount)
  {
    // we return a zero-lengthened string
    return(StringC());
  } // if

return(StringC(m_poData->m_sStrPtr+arg_ulFirst, arg_ulCount));
}
/*E*/
StringC StringC::midString(ULONG arg_ulFirst) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: midString()
*
* Klasse: StringC
*
* Funktion: Pedant zur BASIC-Funktion MID$()
*       Alles ab dem Index wird in einen neuen String übernommen
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   ULONG arg_ulFirst: 1. Zeichen das übernommen werden soll (index)
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   ObjectXC::ObjectXC()
*   getStringTableEntry()
*   StringC()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*   30. Juni 1997:  Die Methode kontrolliert den Zugriff schärfer
*           Für das Ergebnis wird ein sichererer Konstruktor ver-
*           wendet.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_ulFirst <= getLength())

  if (arg_ulFirst >= getLength())
  {
    throw STRINGC_XC;
  } // if
return(StringC(m_poData->m_sStrPtr+arg_ulFirst, getLength()-arg_ulFirst));
}
/*E*/
StringC StringC::leftString(ULONG arg_ulCount) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: leftString()
*
* Klasse: StringC
*
* Funktion: Pedant zur BASIC-Funktion LEFT$()
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   ULONG arg_ulCount:  Anzahl der Zeichen von links
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   ObjectXC::ObjectXC()
*   getStringTableEntry()
*   StringC()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*   30. Juni 1997:  Eine Länge von NULL wird mit einer Exception geahndet
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_ulCount <= getLength())

  if (!arg_ulCount || (arg_ulCount > getLength()))
  {
    throw STRINGC_XC;
  } // if
return(StringC(m_poData->m_sStrPtr, arg_ulCount));
}
/*E*/
StringC StringC::rightString(ULONG arg_ulCount) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: rightString()
*
* Klasse: StringC
*
* Funktion: Pedant zur BASIC-Funktion RIGHT$()
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   ULONG arg_ulCount: Anzahl der Zeichen von rechts
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   ObjectXC::ObjectXC()
*   getStringTableEntry()
*   StringC()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 30. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*   30. Juni 1997:  Eine Länge von NULL wird mit einer Exception geahndet
*           Außerdem wird ein sichererer Konstruktor verwendet.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_ulCount <= getLength())

  if (!arg_ulCount || (arg_ulCount > getLength()))
  {
    throw STRINGC_XC;
  } // if
return(StringC(m_poData->m_sStrPtr+getLength()-arg_ulCount, arg_ulCount));
}
/*E*/
LONG StringC::findChar(char arg_cSearchedChar) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findChar()
*
* Klasse: StringC
*
* Funktion: versucht ein Zeichen im String zu finden
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char arg_cSearchedChar: Das zu suchende Zeichen
*
* Ausgabe-Parameter: der Index des gefundenen Zeichens (-1 für nicht
*   gefunden)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 13. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())

  LONG lFoundIndex=-1;
  // try for every of our chars
  for (int i=0; i < getLength(); i++)
  {
    // if we found our char
    if (m_poData->m_sStrPtr[i]==arg_cSearchedChar)
    {
      lFoundIndex=i;
      break;
    } // if
  } // for
return(lFoundIndex);
}
/*E*/
LONG StringC::findCharNot(char arg_cSearchedChar) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findCharNot()
*
* Klasse: StringC
*
* Funktion: versucht ein anderes Zeichen als das angegebene zu finden
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char arg_cSearchedChar: Das nicht zu suchende Zeichen
*
* Ausgabe-Parameter: der Index des gefundenen Zeichens (-1 für nicht
*   gefunden)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  3. Juli 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*  3. Juli 1997:  von findChar() übernommen und angepasst
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  LONG lFoundIndex=-1;
  // try for every of our chars
  for (int i=0; i < getLength(); i++)
  {
    // if we found our char
    if (m_poData->m_sStrPtr[i]!=arg_cSearchedChar)
    {
      lFoundIndex=i;
      break;
    } // if
  } // for
return(lFoundIndex);
}
/*E*/
LONG StringC::findCharReverse(char arg_cSearchedChar) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findCharReverse()
*
* Klasse: StringC
*
* Funktion: versucht ein Zeichen im String zu finden (Start von hinten)
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char arg_cSearchedChar: Das zu suchende Zeichen
*
* Ausgabe-Parameter: der Index des gefundenen Zeichens (-1 für nicht
*   gefunden)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 13. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  LONG lFoundIndex=-1;
  // try for every of our chars
  for (int i = getLength()-1; i>=0 ; i--)
  {
    // if we found our char
    if (m_poData->m_sStrPtr[i]==arg_cSearchedChar)
    {
      lFoundIndex=i;
      break;
    } // if
  } // for
return(lFoundIndex);
}
/*E*/
LONG StringC::findCharNotReverse(char arg_cSearchedChar) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findCharReverseNot()
*
* Klasse: StringC
*
* Funktion: versucht ein anderes Zeichen als das angegebene zu finden
*     (Start von hinten)
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char arg_cSearchedChar: Das nicht zu suchende Zeichen
*
* Ausgabe-Parameter: der Index des gefundenen Zeichens (-1 für nicht
*   gefunden)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  3. Juli 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*  3. Juli 1997:  Von findCharNotReverse() übernommen und angepasst
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  LONG lFoundIndex=-1;
  // try for every of our chars
  for (int i = getLength()-1; i>=0 ; i--)
  {
    // if we found our char
    if (m_poData->m_sStrPtr[i] != arg_cSearchedChar)
    {
      lFoundIndex=i;
      break;
    } // if
  } // for
return(lFoundIndex);
}
/*E*/
LONG StringC::findString(char *arg_sSearchedString) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findString()
*
* Klasse: StringC
*
* Funktion: Sucht nach einem String innerhalb eines Strings
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char *arg_sSearchedString: Zeiger auf den zu suchenden String
*
* Ausgabe-Parameter: LONG: index an dem der string anfängt
*     (-1 = wenn nicht gefunden)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   string.h/strlen()
*   string.h/strncmp()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 14. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   14. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_sSearchedString)
  LONG lFoundIndex=-1;
  // if we have something to find at all
  if (arg_sSearchedString && getBufferSize())
  {
    // calculate the length of the argument-string
    ULONG ulSourceLen=strlen(arg_sSearchedString);
    // if the search-string is not empty and smaller than or same-sized as the object-string
    if (ulSourceLen && (ulSourceLen <= getLength()))
    {
      // try from left to right
      for (int i=0; i <= (getLength()-ulSourceLen); i++)
      {
        // compare this possibility
        if (0==strncmp(arg_sSearchedString, m_poData->m_sStrPtr+i, ulSourceLen))
        {
          // Ahh! We found the string
          lFoundIndex=i;
          break;
        } // if
      } // for
    } // if
  } // if
return(lFoundIndex);
}
/*E*/
LONG StringC::findString(const StringC &arg_roSearchedString) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findString()
*
* Klasse: StringC
*
* Funktion: Sucht nach einem String innerhalb eines Strings
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   StringC &arg_roSearchedString: Referenz auf das zu suchenden StringC-Obj
*
* Ausgabe-Parameter: LONG: Index an dem der String anfängt
*     -1 = wenn nicht gefunden
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   string.h/strncmp()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 14. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   14. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_roSearchedString.checkInstance())
  LONG lFoundIndex=-1;
  // if we have something to find at all
  if (arg_roSearchedString.getBufferSize() && getBufferSize())
  {
    ULONG ulSourceLen = arg_roSearchedString.getLength();
    // if the search-string is not empty and smaller than or same-sized as the object-string
    if (ulSourceLen && (ulSourceLen <= getBufferSize()))
    {
      // search from left to right
      for (int i=0; i <= (getLength()-ulSourceLen); i++)
      {
        // try this possibility
        if (0==strncmp(arg_roSearchedString, m_poData->m_sStrPtr+i, ulSourceLen))
        {
          // if we found the string
          lFoundIndex=i;
          break;
        } // if
      } // for
    } // if
  } // if
return(lFoundIndex);
}
/*E*/
LONG StringC::findStringNoCase(char *arg_sSearchedString) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findStringNoCase()
*
* Klasse: StringC
*
* Funktion: Sucht nach einem String innerhalb eines Strings ohne Beachtung
*   der Groß- und Kleinschreibung
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char *arg_sSearchedString: Zeiger auf den zu suchenden String
*
* Ausgabe-Parameter: LONG: index an dem der string anfängt (-1=nicht vorhanden)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   string.h/strlen()
*   utility.library/Strnicmp()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 14. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   14. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_sSearchedString)
  LONG lFoundIndex=-1;
  // if we have something to find at all
  if (arg_sSearchedString && getBufferSize())
  {
    ULONG ulSourceLen=strlen(arg_sSearchedString);
    // if the search-string is not empty and smaller than or same-sized as the object-string
    if (ulSourceLen && (ulSourceLen <= getLength()))
    {
      // search from left to right
      for (int i=0; i <= (getLength()-ulSourceLen); i++)
      {
        // try this possibility
        if (0==Strnicmp(arg_sSearchedString, m_poData->m_sStrPtr+i, ulSourceLen))
        {
          // if we found the string
          lFoundIndex=i;
          break;
        } // if
      } // for
    } // if
  } // if
return(lFoundIndex);
}
/*E*/
LONG StringC::findStringNoCase(const StringC &arg_roSearchedString) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findStringNoCase()
*
* Klasse: StringC
*
* Funktion: Sucht nach einem String innerhalb eines Strings ohne beachtung der
*   Groß- und Kleinschreibung
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   StringC &arg_roSearchedString: Referenz auf das zu suchenden StringC-Obj
*
* Ausgabe-Parameter: LONG: index an dem der string anfängt (-1=nicht vorhanden)
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   utility.library/Strnicmp()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 14. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   14. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_roSearchedString.checkInstance())
  LONG lFoundIndex=-1;
  // if we have something to find at all
  if (arg_roSearchedString.getBufferSize() && getBufferSize())
  {
    ULONG ulSourceLen=arg_roSearchedString.getLength();
    // if the search-string is not empty and smaller than or same-sized as the object-string
    if (ulSourceLen && (ulSourceLen <= getLength()))
    {
      // Search from left to right
      for (int i=0; i <= (getLength()-ulSourceLen); i++)
      {
        // try this possibility
        if (0==Strnicmp(arg_roSearchedString, m_poData->m_sStrPtr+i, ulSourceLen))
        {
          // if we found the string
          lFoundIndex=i;
          break;
        } // if
      } // for
    } // if
  } // if
return(lFoundIndex);
}
/*E*/
LONG StringC::findOneOf(char *arg_sCharSet) const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: findOneOf()
*
* Klasse: StringC
*
* Funktion: Sucht nach meheren Zeichen zugleich.
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   arg_sCharSet:   Zeichenkette, die die gesuchten Zeichen enthält
*
* Ausgabe-Parameter: LONG: Index, an dem das erste Zeichen vom Set gefun-
*   den wurde. -1 wenn nichts gefunden wurde
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   string.h/strlen()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 14. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   14. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_sCharSet)

  LONG lFoundIndex=-1;
  BOOL fFound=FALSE;

  // if we got something to find at all
  if (arg_sCharSet && getBufferSize())
  {
    // Calculate the length of the set
    ULONG ulCharSetLen=strlen(arg_sCharSet);

    // Search from left to right
    for (int i=0; i<getLength() && !fFound; i++)
    {
      // Try this index with every char in the set
      for (int j=0; j<ulCharSetLen && !fFound; j++)
      {
        // Try this combination
        if (m_poData->m_sStrPtr[i]==arg_sCharSet[j])
        {
          // if we found the char
          lFoundIndex=i;
          fFound=TRUE;
          break;
        } // if
      } // for
    } // for
  } // if
return(lFoundIndex);
}
/*E*/
void StringC::makeUpper(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: makeUpper()
*
* Klasse: StringC
*
* Funktion: Wandelt den String in Großbuchstaben
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   utility.library/ToUpper()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 13. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
ASSERT(checkInstance())
  prepareModify();
  for (int i=0; i<getLength(); i++)
  {
    m_poData->m_sStrPtr[i] = ToUpper(m_poData->m_sStrPtr[i]);
  } // for
}
/*E*/
void StringC::makeLower(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: makeLower()
*
* Klasse: StringC
*
* Funktion: Wandelt einen String in Kleinbuchstaben
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   utility.library/ToLower()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 13. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  prepareModify();
  for (int i=0; i<getLength(); i++)
  {
    m_poData->m_sStrPtr[i] = ToLower(m_poData->m_sStrPtr[i]);
  } // for
}
/*E*/
void StringC::makeReverse(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: makeReverse()
*
* Klasse: StringC
*
* Funktion: Tauscht die Groß- und Kleinschreibung eines Strings
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   utility.library/ToLower()
*   utility.library/ToUpper()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 13. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  prepareModify();
  for (int i=0; i<getLength(); i++)
  {
    // if the lower is the same
    if (m_poData->m_sStrPtr[i]==ToLower(m_poData->m_sStrPtr[i]))
    {
      // convert it to uppercase
      m_poData->m_sStrPtr[i]=ToUpper(m_poData->m_sStrPtr[i]);
    }
    else
    {
      // otherwise to lowercase
      m_poData->m_sStrPtr[i]=ToLower(m_poData->m_sStrPtr[i]);
    } // if
  } // for
}
/*E*/
void StringC::trimRight(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: trimRight()
*
* Klasse: StringC
*
* Funktion: Entfernt alle anhängenden Leerzeichen
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   freeBuffer()
*   prepareModify()
*   getBufferSize()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 25. Mai 1998
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*   25. Mai 1998:   Bug beseitigt, der durch falsche getLength()-Anwendung
*                     Assertions hervorrief
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())

  prepareModify();
  // if we got a buffer at all
  if (getBufferSize())
  {
    // As long as our length is not zero and the last byte is a space
    while(m_poData->m_ulStrLen && m_poData->m_sStrPtr[m_poData->m_ulStrLen-1]==' ')
    {
      // decrement our length counter
      m_poData->m_ulStrLen--;
    } // while

    // if we left no char
    if (!m_poData->m_ulStrLen)
    {
      freeBuffer();
    }
    else
    {
      // append a zero-byte
      m_poData->m_sStrPtr[m_poData->m_ulStrLen] = 0;
    } // if
  } // if
}
/*E*/
void StringC::trimLeft(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: trimLeft()
*
* Klasse: StringC
*
* Funktion: Entfernt alle voranstehenden Leerzeichen
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 4
*   freeBuffer()
*   string.h/memcpy()
*   prepareModify()
*   getBufferSize()
*
* Version: 1.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 25. Mai 1998
*
* Letzte Änderungen/Neuerungen:
*   13. Juni 1997:  Methode definiert
*   25. Mai 1998:   Bug beseitigt, der durch falsche getLength()-Anwendung
*                     Assertions hervorrief
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  prepareModify();
  // if we have a buffer at all
  if (getBufferSize())
  {
    ULONG ulIndex=0;
    while ((ulIndex < getLength()) && m_poData->m_sStrPtr[ulIndex]==' ') ulIndex++;

    // if we found at least one space
    if (ulIndex)
    {
      // calculate the new stringlength
      m_poData->m_ulStrLen-=ulIndex;

      // if our String length decreased to zero
      if (!m_poData->m_ulStrLen)
      {
        freeBuffer();
      }
      else
      {
        // otherwise move the string to beginning of the buffer
        memcpy(m_poData->m_sStrPtr, m_poData->m_sStrPtr+ulIndex, m_poData->m_ulStrLen);
        m_poData->m_sStrPtr[m_poData->m_ulStrLen]=0;
      } // if
    } // if
  } // if
}
/*E*/
void StringC::trimString(void)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: trimString()
*
* Klasse: StringC
*
* Funktion: Entfernt alle voranstehenden und hintanstehenden Leerzeichen
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: -
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden: 2
*   trimLeft();
*   trimRight();
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  2. Juli 1997
*
* Letzte Änderungen/Neuerungen:
*  2. Juli 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
  trimLeft();
  trimRight();
}
/*E*/
void StringC::formatString(char *arg_sFormat, ...)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: formatString()
*
* Klasse: StringC
*
* Funktion: Formatieren eines Strings
*
* Zugriff: public
*
* Eingabe-Parameter: 1+
*   char *arg_sFormat: Zeiger auf eine Zeichenkette mit Format angaben
*   ... Die variable Parameterliste entsprechend dem 1. Parameter
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 7
*   ObjectXC::ObjectXC()
*   stdio.h/vsprintf()
*   string.h/strlen()
*   validateInstance()
*   getStringTableEntry()
*   stdarg.h/va_start()
*   stdarg.h/va_end()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 14. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   14. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_sFormat)
  prepareModify();
  if (!getBufferSize())
  {
    throw STRINGC_XC;
  } // if

  if (!arg_sFormat)
  {
    throw STRINGC_XC;
  } // if

ASSERT(strlen(arg_sFormat)<=getBufferSize())

  va_list arg;
  va_start(arg,arg_sFormat);
  vsprintf(m_poData->m_sStrPtr, arg_sFormat, arg);
  va_end(arg);
  validateInstance();
}
/*E*/
void StringC::fillString(char arg_cFillByte)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: fillString()
*
* Klasse: StringC
*
* Funktion: Füllt den String mit einem bestimmten Zeichen
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   char arg_cFillByte: Das Zeichen mit dem der String gefüllt werden soll
*
* Ausgabe-Parameter: -
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 14. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   14. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  prepareModify();
  if (getBufferSize())
  {
    for (int i=0; i<getLength(); i++)
    {
      m_poData->m_sStrPtr[i]=arg_cFillByte;
    } // for
  } // if

  if (!arg_cFillByte)
  {
    m_poData->m_ulStrLen=0;
  } // if
}
/*E*/

// operator-overloading
char StringC::operator[](int arg_iIndex)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator[]
*
* Klasse: StringC
*
* Funktion: Ermittelt das n.te Zeichen des Buffers
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   int arg_iIndex: Das wievielte Zeichen angesprochen werden soll
*
* Ausgabe-Parameter: Das Zeichen, das am angegebenen Index steht
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   resizeBuffer()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  4. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  4. Juni 1997:  Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  // if the access is out of allocated range
  if (arg_iIndex >= getBufferSize())
  {
    // reallocate memory
    resizeBuffer(arg_iIndex);

  } // if (arg_iIndex >= m_ulBufLen)
return(m_poData->m_sStrPtr[arg_iIndex]);
}
/*E*/
StringC::operator char *() const
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator char *()
*
* Klasse: StringC
*
* Funktion: Cast-Operator für StringC -> char *
*
* Zugriff: public
*
* Eingabe-Parameter: -
*
* Ausgabe-Parameter: automatisch: char *: Zeiger auf die Zeichenkette
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: -
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 15. Oktober 1997
*
* Letzte Änderungen/Neuerungen:
* 15. Oktober 1997: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
return(m_poData->m_sStrPtr);
}
/*E*/
StringC &StringC::operator= (const char *arg_sString)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator =()
*
* Klasse: StringC
*
* Funktion: Zuweisungsoperator
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   arg_sString: Der neue String
*
* Ausgabe-Parameter: StringC &: Eine Referenz auf das StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 1
*   setString()
*
* Version: 1.0
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 10. Oktober 1997
*
* Letzte Änderungen/Neuerungen:
* 10. Oktober 1997: Methode definiert
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  setString(arg_sString);
return(*this);
}
/*E*/
StringC &StringC::operator= (const StringC &arg_roSrcObj)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator=()
*
* Klasse: StringC
*
* Funktion: Zuweisunsoperator
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   arg_roSrcObj:  Eine Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: Eine Referenz auf das behandelte StringC-Objekt
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 4
*   string.h/strncpy()
*   allocBuffer()
*   initInstance()
*   inherited::operator=()
*
* Version: 2.2
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 23. August 1997
*
* Letzte Änderungen/Neuerungen:
*   29. Dezember 1996:  Methode definiert
*  4. Juni 1997:    Übernommen und komplett überarbeitet vom
*             Berlin-Projekt
*   23. August 1997:  Die Basisklasse wird jetzt durch "inherited"
*             angesprochen
*   10. Oktober 1997: Leicht optimiert.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_roSrcObj.checkInstance())

  if (this != &arg_roSrcObj)
  {
    freeBuffer();
    m_poData = arg_roSrcObj.m_poData;
    incReference();
  } // if
return(*this);
}
/*E*/
StringC &StringC::operator += (const StringC &arg_roSummand)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +=()
*
* Klasse: StringC
*
* Funktion: Additions/Zuweisungs-Operator
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   const StringC &arg_roSummand:   Eine Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: Eine Referenz auf das behandelte neue StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   resizeBuffer()
*   string.h/strcat()
*
* Version: 2.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   11. Januar 1997:  Methode definiert
*   11. Juni 1997:    Übernommen aus dem Berlin-Projekt und angepasst
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
ASSERT(arg_roSummand.checkInstance())

  // Compute the required length to hold both strings
  ULONG ulNewLen = getLength() + arg_roSummand.getLength();

  // if this length is bigger than the existing length
  if (ulNewLen > getBufferSize())
  {
    // allocate the buffer in a appropriate size
    resizeBuffer(ulNewLen);
  } // if (ulNewLen > m_ulBufLen)
  prepareModify();

  // Concatenate the both strings
  strcat(m_poData->m_sStrPtr, arg_roSummand.m_poData->m_sStrPtr);
return(*this);
}
/*E*/
StringC &StringC::operator += (const char *arg_sSummand)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +=()
*
* Klasse: StringC
*
* Funktion: Additions/Zuweisungs-Operator
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   const char *arg_sSummand:   Ein Zeiger auf den anzuhängenden String
*
* Ausgabe-Parameter: Eine Referenz auf das behandelte neue StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 3
*   resizeBuffer()
*   string.h/strcat()
*   string.h/strlen()
*
* Version: 2.1
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   11. Januar 1997:  Methode definiert
*   11. Juni 1997:    Übernommen aus dem Berlin-Projekt / angepasst
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())

  // Compute the required length to hold both strings
  ULONG ulNewLen = getLength() + strlen(arg_sSummand);

  // if this length is bigger than the existing length
  if (ulNewLen > getBufferSize())
  {
    // allocate the buffer in a appropriate size
    resizeBuffer(ulNewLen);
  } // if (ulNewLen > m_ulBufLen)
  prepareModify();

  // conatenate the both strings
  strcat(m_poData->m_sStrPtr, arg_sSummand);
return(*this);
}
/*E*/
StringC &StringC::operator += (const char arg_cSummand)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +=()
*
* Klasse: StringC
*
* Funktion: Additions/Zuweisungs-Operator
*
* Zugriff: public
*
* Eingabe-Parameter: 1
*   const char arg_cSummand:   Ein hinzuzufügendes Zeichen
*
* Ausgabe-Parameter: Eine Referenz auf das behandelte neue StringC-Objekt
*
* Aufgerufen von: -
*
* Verwendung folgender globaler Variablen/Strukturen: -
*
* Benutzte Methoden: 2
*   resizeBuffer()
*   string.h/strlen()
*
* Version: 2.2
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   11. Januar 1997:  Methode definiert
*   11. Juni 1997:    Übernommen aus dem Berlin-Projekt / angepasst
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*             Es wird nun auch die neue Länge explizit berech-
*             net
*
*************************************************************************/
/*E*/
{
TRACEMETHOD
ASSERT(checkInstance())
  // Compute the required length to hold both strings
  ULONG ulNewLen = getLength() + sizeof(char);

  // if this length is bigger than the existing length
  if (ulNewLen > getBufferSize())
  {
    // allocate the buffer in a appropriate size
    resizeBuffer(ulNewLen);
  }
  prepareModify();

  // append the char
  m_poData->m_sStrPtr[ulNewLen-sizeof(char)]=arg_cSummand;
  m_poData->m_sStrPtr[ulNewLen]=0;

  // recalculate the new strlen explicitly
  m_poData->m_ulStrLen = strlen(m_poData->m_sStrPtr);
return(*this);
}
/*E*/
StringC operator+(const StringC &arg_roFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +
*
* Klasse: StringC
*
* Funktion: Aneinanderhängen zweier StringC-Object zu einem StringC-Object
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   zwei Referenzen von Objekten der Klasse StringC
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden: 8
*   ObjectXC::ObjectXC()
*   StringC() Direkt-Set-Konstruktor [private]
*   StringC() Einfacher Konstruktor
*   isEmpty()
*   string.h/strcpy()
*   string.h/strcat()
*   string.h/strlen()
*   getStringTableEntry()
*
* Version: 1.5
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  9. November 1996:  Methode implementiert
*   11. November 1996:  Sicherheit erhöht, durch Verwendung von getLen() und Existenz-Tests
*             wenn die Strings in den neuen kopiert werden.
*   12. Januar 1997:  Die Methode gibt nun einen Zeiger auf das neue Objekt, anstatt
*             eine Referenz darauf zurück.
*  6. Februar 1997:   Die Methode gibt keinen Zeiger mehr auf das neue Objekt zurück sondern
*             returniert ein komplett neues Objekt, weil vorher das mit new erzeugte
*             Return-Objekt nicht wieder gelöscht wurde. Für die Rückgabe wird der
*             Direktset-Konstruktor verwendet, so daß nur 1 temporäres Objekt auf dem
*             Stack erzeugt werden muß. Es scheint unmöglich für einen + operator ein
*             Temporäres Objekt zu vermeiden.
*             Desweiteren wurde die Länge jetzt richtig bemessen (vorher 1 Byte zuviel)
*   11-12. Juni 1997:   Methode aus dem Berlin-Projekt übernommen und angepasst
*             1 Bug wurde beseitigt (Semikolon in if-Zeile)
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  // Compute the buffersize required to hold both strings
  ULONG ulNewLen=arg_roFirst.getLength() + arg_roSecond.getLength();

  // a size of zero results in a zero-object
  if (!ulNewLen)
  {
    return(StringC());
  } // if

  // make the string divideable by 8
  ULONG ulNewBufLen=(ulNewLen+8) & (~0x7);

  // allocate the new buffer
  char *sNewPtr;
  if (!(sNewPtr = new char [ulNewBufLen]))
  {
    // if something went wrong (e.g. no memory)
    throw STRINGC_XC;
  } //if

  // fill the just allocated buffer
  if (!arg_roFirst.isEmpty())
  {
    strcpy(sNewPtr, arg_roFirst.m_poData->m_sStrPtr);
  } //if

  if (!arg_roSecond.isEmpty())
  {
    strcat(sNewPtr, arg_roSecond.m_poData->m_sStrPtr);
  } //if

// use a special direct-set-constructor to reduce the temporary objects
return(StringC(ulNewLen,ulNewBufLen-1, sNewPtr));
}
/*E*/
StringC operator+(const StringC &arg_roFirst, char arg_cSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +
*
* Klasse: StringC
*
* Funktion: Aneinanderhängen eines StringC-Objects mit einem char
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   Eine Referenz eines Objekten der Klasse StringC
*   ein char
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden: 6
*   ObjectXC()
*   StringC() Direkt-Set-Konstruktor [private]
*   StringC() Einfacher Konstruktor
*   isEmpty()
*   string.h/strcpy()
*   getStringTableEntry()
*
* Version: 1.5
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  9. November 1996:  Methode implementiert
*   11. November 1996:  Sicherheit erhöht, durch Verwendung von getLen() und Existenz-Tests
*             wenn die Strings in den neuen kopiert werden.
*   12. Januar 1997:  Die Methode gibt nun einen Zeiger auf das neue Objekt, anstatt
*             eine Referenz darauf zurück.
*  6. Februar 1997:   Die Methode gibt keinen Zeiger mehr auf das neue Objekt zurück sondern
*             returniert ein komplett neues Objekt, weil vorher das mit new erzeugte
*             Return-Objekt nicht wieder gelöscht wurde. Für die Rückgabe wird der
*             Direktset-Konstruktor verwendet, so daß nur 1 temporäres Objekt auf dem
*             Stack erzeugt werden muß. Es scheint unmöglich für einen + operator ein
*             Temporäres Objekt zu vermeiden.
*             Desweiteren wurde die Länge jetzt richtig bemessen (vorher 1 Byte zuviel)
*   11-12. Juni 1997:   Methode aus dem Berlin-Projekt übernommen und angepasst
*             1 Bug wurde beseitigt (Semikolon in if-Zeile)
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
  // Compute the buffersize required to hold both strings
  ULONG ulNewLen=arg_roFirst.getLength()+sizeof(char);

  // a size of zero results in a zero-object
  if (!ulNewLen)
  {
    return(StringC());
  } // if (!ulNewLen)

  // make the string divideable by 8
  ULONG ulNewBufLen=(ulNewLen+8) & (~0x7);

  // allocate the new buffer
  char *sNewPtr;
  if (!(sNewPtr = new char [ulNewBufLen]))
  {
    // if something went wrong (no mem)
    throw STRINGC_XC;
  } // if (m_sStrPtr = new char [(ULONG) arg_ulSize])

  // fill the just allocated buffer
  if (!arg_roFirst.isEmpty())
  {
    strcpy(sNewPtr, arg_roFirst.m_poData->m_sStrPtr);
  } //if (!arg_roFirst.isEmpty())

  sNewPtr[ulNewLen-sizeof(char)]=arg_cSecond;
  sNewPtr[ulNewLen]=0;

return(StringC(ulNewLen,ulNewBufLen-sizeof(char), sNewPtr));
}
/*E*/
StringC operator+(char arg_cFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +
*
* Klasse: StringC
*
* Funktion: Aneinanderhängen eines chars mit einem StringC-Object
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   ein char
*   Eine Referenz eines Objekten der Klasse StringC
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden: 6
*   ObjectXC()
*   StringC() Direkt-Set-Konstruktor [private]
*   StringC() Einfacher Konstruktor
*   isEmpty()
*   string.h/strcat()
*   getStringTableEntry()
*
* Version: 1.5
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  9. November 1996:  Methode implementiert
*   11. November 1996:  Sicherheit erhöht, durch Verwendung von getLen() und Existenz-Tests
*             wenn die Strings in den neuen kopiert werden.
*   12. Januar 1997:  Die Methode gibt nun einen Zeiger auf das neue Objekt, anstatt
*             eine Referenz darauf zurück.
*  6. Februar 1997:   Die Methode gibt keinen Zeiger mehr auf das neue Objekt zurück sondern
*             returniert ein komplett neues Objekt, weil vorher das mit new erzeugte
*             Return-Objekt nicht wieder gelöscht wurde. Für die Rückgabe wird der
*             Direktset-Konstruktor verwendet, so daß nur 1 temporäres Objekt auf dem
*             Stack erzeugt werden muß. Es scheint unmöglich für einen + operator ein
*             Temporäres Objekt zu vermeiden.
*             Desweiteren wurde die Länge jetzt richtig bemessen (vorher 1 Byte zuviel)
*   11-12. Juni 1997:   Methode aus dem Berlin-Projekt übernommen und angepasst
*             1 Bug wurde beseitigt (Semikolon in if-Zeile)
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*             Es wurde außerdem der Fall abgefangen, wenn der
*             char-Parameter==NULL ist
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  // Compute the buffersize required to hold both strings
  ULONG ulNewLen=arg_roSecond.getLength()+sizeof(char);

  // a size of zero results in a zero-object
  if (!ulNewLen)
  {
    return(StringC());
  } // if (!ulNewLen)

  // if the char is zero, just create a copy of the StringC-object
  if (!arg_cFirst)
  {
    return(StringC(arg_roSecond));
  }

  // make the string divideable by 8
  ULONG ulNewBufLen=(ulNewLen+8) & (~0x7);

  // allocate the new buffer
  char *sNewPtr;
  if (!(sNewPtr = new char [ulNewBufLen]))
  {
    // if something went wrong (no mem)
    throw STRINGC_XC;
  } // if (m_sStrPtr = new char [(ULONG) arg_ulSize])

  sNewPtr[0]=arg_cFirst;
  sNewPtr[sizeof(char)]=0;

  // fill the just allocated buffer
  if (!arg_roSecond.isEmpty())
  {
    strcat(sNewPtr, arg_roSecond.m_poData->m_sStrPtr);
  } //if (!arg_roFirst.isEmpty())

return(StringC(ulNewLen,ulNewBufLen-sizeof(char), sNewPtr));
}
/*E*/
StringC operator+(const StringC &arg_roFirst, const char *arg_sSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +
*
* Klasse: StringC
*
* Funktion: Aneinanderhängen eines StringC-Object mit einer Zeichenkette
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   Eine Referenz eines Objekten der Klasse StringC
*   eine Zeichenkette
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden: 7
*   ObjectXC()
*   StringC() Direkt-Set-Konstruktor [private]
*   StringC() Einfacher Konstruktor
*   isEmpty()
*   string.h/strcpy()
*   string.h/strcat()
*   getStringTableEntry()
*
* Version: 1.5
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum:  25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  9. November 1996:  Methode implementiert
*   11. November 1996:  Sicherheit erhöht, durch Verwendung von getLen() und Existenz-Tests
*             wenn die Strings in den neuen kopiert werden.
*   12. Januar 1997:  Die Methode gibt nun einen Zeiger auf das neue Objekt, anstatt
*             eine Referenz darauf zurück.
*  6. Februar 1997:   Die Methode gibt keinen Zeiger mehr auf das neue Objekt zurück sondern
*             returniert ein komplett neues Objekt, weil vorher das mit new erzeugte
*             Return-Objekt nicht wieder gelöscht wurde. Für die Rückgabe wird der
*             Direktset-Konstruktor verwendet, so daß nur 1 temporäres Objekt auf dem
*             Stack erzeugt werden muß. Es scheint unmöglich für einen + operator ein
*             Temporäres Objekt zu vermeiden.
*             Desweiteren wurde die Länge jetzt richtig bemessen (vorher 1 Byte zuviel)
*   11-12. Juni 1997:   Methode aus dem Berlin-Projekt übernommen und angepasst
*             1 Bug wurde beseitigt (Semikolon in if-Zeile)
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*             Die Methode wurde optimiert und weiter abgesichert
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
ASSERT(arg_sSecond)

  ULONG ulNewLen=0;

  // only count the length of the char-pointer if one is there
  if(arg_sSecond)
  {
    ulNewLen = strlen(arg_sSecond);
  } // if(arg_sSecond)

  // if the char-pointer is zero or has no length
  if (!ulNewLen)
  {
    // just return a copy of the StringC-object
    return(StringC(arg_roFirst));
  } // if (!ulNewLen)

  // Compute the buffersize required to hold both strings
  ulNewLen += arg_roFirst.getLength();

  // make the string divideable by 8
  ULONG ulNewBufLen=(ulNewLen+8) & (~0x7);

  // allocate the new buffer
  char *sNewPtr = new char [ulNewBufLen];
  if (!sNewPtr)
  {
    // if something went wrong (e.g. no memory)
    throw STRINGC_XC;
  } // if (m_sStrPtr = new char [(ULONG) arg_ulSize])

  // fill the just allocated buffer
  if (!arg_roFirst.isEmpty())
  {
    strcpy(sNewPtr, arg_roFirst.m_poData->m_sStrPtr);
  } // if (!arg_roFirst.isEmpty())

  // concatenate the two strings
  strcat(sNewPtr, arg_sSecond);

return(StringC(ulNewLen,ulNewBufLen-1, sNewPtr));
}
/*E*/
StringC operator+(const char *arg_sFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator +
*
* Klasse: StringC
*
* Funktion: Aneinanderhängen einer Zeichenkette mit einem StringC-Object
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   eine Zeichenkette
*   Eine Referenz eines Objekten der Klasse StringC
*
* Ausgabe-Parameter: Ein neues StringC-Objekt
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen:
*
* Benutzte Methoden: 7
*   ObjectXC()
*   StringC() Direkt-Set-Konstruktor [private]
*   StringC() Einfacher Konstruktor
*   isEmpty()
*   string.h/strcpy()
*   string.h/strcat()
*   getStringTableEntry()
*
* Version: 1.5
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 25. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*  9. November 1996:  Methode implementiert
*   11. November 1996:  Sicherheit erhöht, durch Verwendung von getLen() und Existenz-Tests
*             wenn die Strings in den neuen kopiert werden.
*   12. Januar 1997:  Die Methode gibt nun einen Zeiger auf das neue Objekt, anstatt
*             eine Referenz darauf zurück.
*  6. Februar 1997:   Die Methode gibt keinen Zeiger mehr auf das neue Objekt zurück sondern
*             returniert ein komplett neues Objekt, weil vorher das mit new erzeugte
*             Return-Objekt nicht wieder gelöscht wurde. Für die Rückgabe wird der
*             Direktset-Konstruktor verwendet, so daß nur 1 temporäres Objekt auf dem
*             Stack erzeugt werden muß. Es scheint unmöglich für einen + operator ein
*             Temporäres Objekt zu vermeiden.
*             Desweiteren wurde die Länge jetzt richtig bemessen (vorher 1 Byte zuviel)
*   11-12. Juni 1997:   Methode aus dem Berlin-Projekt übernommen und angepasst
*             1 Bug wurde beseitigt (Semikolon in if-Zeile)
*   25. Juni 1997:    GetLength() wird nicht mehr verwendet. Die Länge
*             der Teilstrings wird direkt ausgelesen.
*             Die Methode wurde darüberhinaus optimiert und
*             weiter abgesichert.
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
ASSERT(arg_sFirst)

  ULONG ulNewLen=0;

  // only count the length of the char-pointer if one is there
  if (arg_sFirst)
  {
    ulNewLen = strlen(arg_sFirst);
  } // if (arg_sFirst)

  // if the char-pointer is zero or the string has no length
  if (!ulNewLen)
  {
    // just return a copy of the StringC-object
    return(StringC(arg_roSecond));
  } // if (!ulNewLen)

  // Compute the buffersize required to hold both strings
  ulNewLen += arg_roSecond.getLength();

  // make the string divideable by 8
  ULONG ulNewBufLen=(ulNewLen+8) & (~0x7);

  // allocate the new buffer
  char *sNewPtr = new char [ulNewBufLen];
  if (!sNewPtr)
  {
    // if something went wrong (no mem)
    throw STRINGC_XC;
  } // if (m_sStrPtr = new char [(ULONG) arg_ulSize])

  // put a copy of the char-pointer-string into the new buffer
  strcpy(sNewPtr, arg_sFirst);

  // fill the just allocated buffer
  if (!arg_roSecond.isEmpty())
  {
    strcat(sNewPtr, arg_roSecond.m_poData->m_sStrPtr);
  } //if (!arg_roFirst.isEmpty())

return(StringC(ulNewLen,ulNewBufLen-1, sNewPtr));
}
/*E*/
BOOL operator==(const StringC &arg_roFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator ==
*
* Klasse: StringC
*
* Funktion: Vergleichsoperator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   2 Referenzen auf ein StringC-Objekte
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
ASSERT(arg_roSecond.checkInstance())

return(!strcmp(arg_roFirst.getBuffer(), arg_roSecond.getBuffer()));
}
/*E*/
BOOL operator==(const StringC &arg_roFirst, const char *arg_sSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator ==
*
* Klasse: StringC
*
* Funktion: Vergleichsoperator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 Referenz auf ein StringC-Objekt
*   1 char-pointer
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
  if (!arg_sSecond)
  {
    return(FALSE);
  } // if (!arg_sSecond)
return(!strcmp(arg_roFirst.getBuffer(),arg_sSecond));
}
/*E*/
BOOL operator==(const char *arg_sFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator ==
*
* Klasse: StringC
*
* Funktion: Vergleichsoperator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 char pointer
*   1 Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  if (!arg_sFirst)
  {
    return(FALSE);
  } // if (!arg_sFirst)

return(!strcmp(arg_sFirst,arg_roSecond.getBuffer()));
}
/*E*/
BOOL operator!=(const StringC &arg_roFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator !=
*
* Klasse: StringC
*
* Funktion: Ungleichheits-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   2 Referenzen auf ein StringC-Objekte
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
ASSERT(arg_roSecond.checkInstance())

return(strcmp(arg_roFirst.getBuffer(), arg_roSecond.getBuffer()));
}
/*E*/
BOOL operator!=(const StringC &arg_roFirst, const char *arg_sSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator 2=
*
* Klasse: StringC
*
* Funktion: Ungleichheits-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 Referenz auf ein StringC-Objekt
*   1 char-pointer
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
  if (!arg_sSecond)
  {
    return(TRUE);
  } // if (!arg_sSecond)
return(strcmp(arg_roFirst.getBuffer(),arg_sSecond));
}
/*E*/
BOOL operator!=(const char *arg_sFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator !=
*
* Klasse: StringC
*
* Funktion: Ungleichheits-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 char pointer
*   1 Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: TRUE wenn s1!=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  if (!arg_sFirst)
  {
    return(TRUE);
  } // if (!arg_sFirst)
return(strcmp(arg_sFirst,arg_roSecond.getBuffer()));
}
/*E*/
BOOL operator<(const StringC &arg_roFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator <
*
* Klasse: StringC
*
* Funktion: Kleiner-als-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   2 Referenzen auf ein StringC-Objekte
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
ASSERT(arg_roSecond.checkInstance())

return(strcmp(arg_roFirst.getBuffer(), arg_roSecond.getBuffer()) < 0);
}
/*E*/
BOOL operator<(const StringC &arg_roFirst, const char *arg_sSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator <
*
* Klasse: StringC
*
* Funktion: Kleiner-als-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 Referenz auf ein StringC-Objekt
*   1 char-pointer
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
  if (!arg_sSecond)
  {
    return(FALSE);
  } // if (!arg_sSecond)
return(strcmp(arg_roFirst.getBuffer(),arg_sSecond) < 0);
}
/*E*/
BOOL operator<(const char *arg_sFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator <
*
* Klasse: StringC
*
* Funktion: Kleiner-als-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 char pointer
*   1 Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  if (!arg_sFirst)
  {
    return(TRUE);
  } // if (!arg_sFirst)
return(strcmp(arg_sFirst,arg_roSecond.getBuffer()) < 0);
}
/*E*/
BOOL operator>(const StringC &arg_roFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator >
*
* Klasse: StringC
*
* Funktion: Größer-als-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   2 Referenzen auf ein StringC-Objekte
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
ASSERT(arg_roSecond.checkInstance())

return(strcmp(arg_roFirst.getBuffer(), arg_roSecond.getBuffer()) > 0);
}
/*E*/
BOOL operator>(const StringC &arg_roFirst, const char *arg_sSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator >
*
* Klasse: StringC
*
* Funktion: Größer-als-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 Referenz auf ein StringC-Objekt
*   1 char-pointer
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
  if (!arg_sSecond)
  {
    return(TRUE);
  } // if (!arg_sSecond)
return(strcmp(arg_roFirst.getBuffer(),arg_sSecond) > 0);
}
/*E*/
BOOL operator>(const char *arg_sFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator >
*
* Klasse: StringC
*
* Funktion: Größer-als-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 char pointer
*   1 Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  if (!arg_sFirst)
  {
    return(FALSE);
  } // if (!arg_sFirst)
return(strcmp(arg_sFirst,arg_roSecond.getBuffer()) > 0);
}
/*E*/
BOOL operator<=(const StringC &arg_roFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator <=
*
* Klasse: StringC
*
* Funktion: kleiner-gleich-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   2 Referenzen auf ein StringC-Objekte
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
ASSERT(arg_roSecond.checkInstance())

return(strcmp(arg_roFirst.getBuffer(), arg_roSecond.getBuffer()) <= 0);
}
/*E*/
BOOL operator<=(const StringC &arg_roFirst, const char *arg_sSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator <=
*
* Klasse: StringC
*
* Funktion: kleiner-gleich-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 Referenz auf ein StringC-Objekt
*   1 char-pointer
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
  if (!arg_sSecond)
  {
    return(FALSE);
  } // if (!arg_sSecond)
return(strcmp(arg_roFirst.getBuffer(),arg_sSecond) <= 0);
}
/*E*/
BOOL operator<=(const char *arg_sFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator <=
*
* Klasse: StringC
*
* Funktion: kleiner-gleich-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 char pointer
*   1 Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  if (!arg_sFirst)
  {
    return(TRUE);
  } // if (!arg_sFirst)
return(strcmp(arg_sFirst,arg_roSecond.getBuffer()) <= 0);
}
/*E*/
BOOL operator>=(const StringC &arg_roFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator >=
*
* Klasse: StringC
*
* Funktion: Größer-gleich-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   2 Referenzen auf ein StringC-Objekte
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
ASSERT(arg_roSecond.checkInstance())

return(strcmp(arg_roFirst.getBuffer(), arg_roSecond.getBuffer()) >= 0);
}
/*E*/
BOOL operator>=(const StringC &arg_roFirst, const char *arg_sSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator >=
*
* Klasse: StringC
*
* Funktion: Größer-gleich-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 Referenz auf ein StringC-Objekt
*   1 char-pointer
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roFirst.checkInstance())
  if (!arg_sSecond)
  {
    return(TRUE);
  } // if (!arg_sSecond)
return(strcmp(arg_roFirst.getBuffer(),arg_sSecond) >= 0);
}
/*E*/
BOOL operator>=(const char *arg_sFirst, const StringC &arg_roSecond)
/*S*/
/*S*/ /* Methoden-Rahmen */
/*************************************************************************
* Name der Methode: operator >=
*
* Klasse: StringC
*
* Funktion: Größer-gleich-operator
*
* Zugriff: public
*
* Eingabe-Parameter: 2
*   1 char pointer
*   1 Referenz auf ein StringC-Objekt
*
* Ausgabe-Parameter: TRUE wenn s1=s2; sonst FALSE
*
* Aufgerufen von:
*
* Verwendung folgender globaler Variablen/Strukturen: keine
*
* Benutzte Methoden: 2
*   string.h/strcmp()
*   StringC::getBuffer()
*
* Version: 1.3
*
* Autor: Christian Taulien of Strange Intelligence
*
* Datum: 12. Juni 1997
*
* Letzte Änderungen/Neuerungen:
*   12. November 1996:  Methode impelmentiert
*   29. November 1996:  Exeptionhandling eingebaut
*  5. Dezember 1996:  Exceptionhandling wieder ausgebaut, weil es zu ungewollten Exceptions käme
*            wenn z.B. NodeC-Objekte nach Namen sortiert werden sollten, von denen
*            einige auch NULL-Pointer haben.
*             s1 / s1.str  | s2 / s2.str  | Erg. beim Vergleich auf s1==s2
*             -------------+----------------+----------------------------------
*             0      | 0        | TRUE
*             0      | s2.str="..."   | FALSE
*             s1.str="..." | 0        | FALSE
*             s1.str="..." | s2.str="..."   | Abhängig vom Inhalt beider str
*   12. Juni 1997:    Methode aus dem Berlin-Project übernommen
*             Aufgrund der StringC-Implementierung kann es dort
*             keine NULL-Pointer geben
*
*************************************************************************/
/*E*/
{
ASSERT(arg_roSecond.checkInstance())
  if (!arg_sFirst)
  {
    return(FALSE);
  } // if (!arg_sFirst)
return(strcmp(arg_sFirst,arg_roSecond.getBuffer()) >= 0);
}
/*E*/

//#ifdef si_debug_x
//#undef si_debug_x
//#define si_debug
//#endif

