(**********************************************************************

:Program.    DynStr.mod
:Contens.    Ein Bibliotheksmodul für dynamische Strings.
:Author.     Bernd Braun
:Address.    Lippestr. 11, D-3300 Braunschweig
:Phone.      0531/845498
:Copyright.  Public Domain
:Language.   Modula-2
:Translator. M2Amiga A+L V4.096d
:History.    V1.0 3.Okt.1990 Erste lauffähige Version
:History.    V1.1 6.Jun.1991 An M2Amiga V4 angepasst.
:Update.     Dies ist ein Update zum Modul auf Amok#48.
***********************************************************************)

IMPLEMENTATION MODULE DynStr;

   FROM Arts IMPORT
      Assert;
   FROM ASCII IMPORT
      nul;
   FROM ExecL IMPORT
      CopyMem;
   FROM Storage IMPORT
      ALLOCATE, DEALLOCATE;
   FROM String IMPORT
      Length, Copy, Compare;
   FROM SYSTEM IMPORT
      ADR;

   CONST
      errmsg = 'DynStr: DynString ist NIL!';

   (* Erzeugt aus StatString einen DynString und reserviert für ihn
      Speicher. *)
   (*$ CopyDyn := FALSE *)
   PROCEDURE MakeDynString (     StatString : ARRAY OF CHAR;
                             VAR S          : DynString     );
      VAR
         AnzahlBytes : INTEGER;
   BEGIN
      AnzahlBytes := Length ( StatString );
      ALLOCATE ( S, AnzahlBytes + 1 );
      CopyMem ( ADR ( StatString ), S, AnzahlBytes );
      S ^ [ AnzahlBytes ] := nul;
   END MakeDynString;

   (* Copiert einen DynString in einen StatString. *)
   PROCEDURE MakeStatString ( VAR StatString : ARRAY OF CHAR;
                                  S          : DynString     );
   BEGIN
      Assert ( S # NIL, ADR ( errmsg ) );
      Copy ( StatString, S ^ );
   END MakeStatString;

   (* Löscht einen Dynstring. *)
   PROCEDURE ForgetDynString ( VAR S : DynString );
   BEGIN
      IF S # NIL THEN
         DEALLOCATE ( S, Length ( S ^ ) + 1 );
         S := NIL;
      END;
   END ForgetDynString;

   (* Vergleicht zwei DynStrings. *)
   (*$ CopyDyn := FALSE *)
   PROCEDURE DynStringCompare ( S1, S2 : DynString ) : INTEGER;
   BEGIN
      Assert ( S1 # NIL, ADR ( errmsg ) );
      Assert ( S2 # NIL, ADR ( errmsg ) );
      RETURN Compare ( S1 ^, S2 ^ );
   END DynStringCompare;

END DynStr.
