(* ------------------------------------------------------------------------
  :Program.     STRING.mod
  :Contents.    Interface-Modul für STRING.asm
  :Author.      Uwe Zaeh
  :Address.     Steiner Str. 17
  :Address.     D-(W)8543 Hilpoltstein
  :History.     10.10.91, V1.0
  :Copyright.   PD, siehe auch Dokumentation
  :Language.    Oberon
  :Translator.  Amiga-Oberon V2.0
  :Remark.      muß mit STRING.o (assembliertes STRING.asm) gejoint werden;
  :Remark.      siehe Oberon-Handbuch.
------------------------------------------------------------------------ *)

MODULE STRING;

TYPE STRING* = POINTER TO CHAR; (* nur intern *)

CONST  nul = 0X;

PROCEDURE Create*{"_Create"}(size{0}: INTEGER): STRING;
PROCEDURE Forget*{"_Forget"}(string{8}: STRING);
PROCEDURE Enter*{"_Enter"}(string{8}: STRING; stelle{0}: INTEGER; zeichen{1}: CHAR);
PROCEDURE Entry*{"_Entry"}(string{8}: STRING; stelle{0}: INTEGER): CHAR;
PROCEDURE Copy*{"_Copy"}(tostring{8}, fromstring{9}: STRING);
PROCEDURE Compare*{"_Compare"}(string1{8}, string2{9}: STRING): INTEGER;
PROCEDURE Length*{"_Length"}(string{8}: STRING): INTEGER;
PROCEDURE MaxLen*{"_MaxLen"}(string{8}: STRING): INTEGER;
PROCEDURE Erase*{"_Erase"}(string{8}: STRING);
PROCEDURE Append*{"_Append"}(targetstring{8}, fromstring{9}: STRING);
PROCEDURE Prepend*{"_Prepend"}(targetstring{8}, fromstring{9}: STRING);
PROCEDURE AppendChar*{"_AppendChar"}(targetstring{8}: STRING; char{0}: CHAR);
PROCEDURE PrependChar*{"_PrependChar"}(targetstring{8}: STRING;  char{0}: CHAR);


PROCEDURE STRINGToAOC*(string: STRING; VAR aoc: ARRAY OF CHAR);
(* Semantik: kopiert eine STRING-Zeichenkette in ein Oberon-CHAR-Array
*)
VAR pos, max:INTEGER;
BEGIN
 max:=MaxLen(string);  (*  Enter(string  dann auf 'nul' stehen *)
 IF (LEN(aoc)-1) < max THEN (* aoc[LEN(aoc)-1] ist 'nul' oder letzter Buchstabe, *)
  max:=LEN(aoc)-1;          (* falls aoc "voll" ist *)
 END;

 pos := -1;
 REPEAT (* Nullbyte kann auf jeden Fall kopiert werden *)
  INC(pos);
  aoc[pos] := Entry(string, pos);
 UNTIL (aoc[pos] = nul) OR (pos = max);
END STRINGToAOC;


PROCEDURE AOCToSTRING*(aoc: ARRAY OF CHAR; string: STRING);
(* Semantik: kopiert eine Oberon-Zeichenkette in eine STRING-Zeichenkette.
*)
VAR pos, max: INTEGER;
BEGIN
 max := LEN(aoc)-1;
 IF MaxLen(string) < max THEN
  max := MaxLen(string);
 END;

 pos := -1;
 REPEAT
  INC(pos);
  Enter(string, pos, aoc[pos]);
 UNTIL (aoc[pos] = nul) OR (pos = max);

 IF pos = MaxLen(string) THEN
  Enter(string, pos, nul);
 ELSE (* pos < MaxLen(string) *)
  Enter(string, pos+1, nul);
 END;
END AOCToSTRING;

END STRING.
