(* ------------------------------------------------------------------------
   :Program.      PathHandler
   :Contents.     Proceduren zum Umgang mit Datei-Pfaden.
   :Author.       Klaus Hlawaty.
   :Address.      Waldhof
   :Address.      3579 Schrecksbach
   :History.      18.Nov.90 - v1.0: Geschrieben.
   :History.      16.Dec.90 - v1.1: Zusätzlich ExPostfix und ExPrefix.
   :History.      18.Nov.90 - v1.2: Oberon v2.13
   :Copyright.    PD
   :Language.     Oberon
   :Translator.   OBERON v2.13 / OLink v2.13d
------------------------------------------------------------------------ *)
MODULE PathHandler;

IMPORT
       Rq:Requests,
      Str:Strings;

(* $CopyArrays- *)
PROCEDURE Split * (Path : ARRAY OF CHAR; VAR Dir, File : ARRAY OF CHAR);
(* ------------------------------------------------------------------------
   :Input.     Path: kompletter Pfad
   :Output.    Dir, File : Zerlegte Bestandteile des Pfads
   :Semantic.  Zerlegt Pfad in seine Bestandteile
------------------------------------------------------------------------ *)
VAR
      Len,
      Pos,
      Pos2 : INTEGER;

BEGIN
   Len := Str.Length(Path);
   Pos := Str.Occurs(Path,":");
   IF(Str.OccursPos(Path,":",Pos+1) >= 0)THEN
      Rq.BreakPoint("Path mit zwei ':' ???");
   END;
   Pos2 := Pos;
   REPEAT
      Pos := Pos2;
      Pos2 := Str.OccursPos(Path,"/",Pos+1);
   UNTIL(Pos2 = -1);
   IF(Pos < 0)THEN
      Str.Cut(Path,0,Len,File);
   ELSE IF(Pos = Len)THEN
      Str.Cut(Path,0,Len,Dir);
   ELSE
      Str.Cut(Path,0,Pos+1,Dir);
      Str.Cut(Path,Pos+1,Len,File);
   END (* ELSE *); END (* ELSE IF *);
END Split;

PROCEDURE Prefix * (VAR Path:ARRAY OF CHAR;
                        Prefix:ARRAY OF CHAR):BOOLEAN;
(* ------------------------------------------------------------------------
  :Input.      Path   : kompletter Pfad
  :Input.      Prefix : Prefix für Dateinamen.
  :Output.     Path   : Pfad mit eingebautem Prefix.
  :Output.            : FALSE wird zurücküberreicht wenn Prefix eingebaut
  :Output.              werden mußte.
  :Semantic.   Überprüft Pfad auf Prefix und fügt diesen e.v. ein.
------------------------------------------------------------------------ *)
VAR
      PreU, FileU, (* U = Uppercase *)
      Dir,
      File : ARRAY 256 OF CHAR;
      Len  : INTEGER;

BEGIN
   Split(Path,Dir,File);
   FileU := File;
   Str.Upper(FileU);
   Str.Cut(Prefix,0,Str.Length(Prefix),PreU);
   Str.Upper(PreU);
   IF(Str.Occurs(FileU,PreU) = 0)THEN
      RETURN TRUE;                     (* Prefix gefunden *)
   ELSE
      Path := "";
      Str.Append(Path,Dir);
      Str.Append(Path,Prefix);
      Str.Append(Path,File);
      RETURN FALSE;                    (* Prefix eingebaut *)
   END;
END Prefix;

PROCEDURE ExPrefix * (VAR Path:ARRAY OF CHAR;
                          Prefix:ARRAY OF CHAR):BOOLEAN;
(* ------------------------------------------------------------------------
  :Input.      Path   : kompletter Pfad
  :Input.      Prefix : Prefix für Dateinamen.
  :Output.     Path   : Pfad mit ausgebautem Prefix.
  :Output.            : TRUE wird zurücküberreicht wenn Prefix ausgebaut
  :Output.              werden mußte.
  :Semantic.   Überprüft Pfad auf Prefix und entfernt diesen e.v.
------------------------------------------------------------------------ *)
VAR
      PreU, FileU, (* U = Uppercase *)
      Dir,
      File : ARRAY 256 OF CHAR;
      Len  : INTEGER;

BEGIN
   Split(Path,Dir,File);
   FileU := File;
   Str.Upper(FileU);
   Len := Str.Length(Prefix);
   Str.Cut(Prefix,0,Len,PreU);
   Str.Upper(PreU);
   IF(Str.Occurs(FileU,PreU) = 0)THEN
      Str.Cut(File,Len,Str.Length(File),FileU);
      Path := "";
      Str.Append(Path,Dir);
      Str.Append(Path,FileU);
      RETURN TRUE;                     (* Prefix ausgebaut *)
   ELSE
      RETURN FALSE;                    (* Prefix nicht gefunden *)
   END;
END ExPrefix;

PROCEDURE Postfix * (VAR Path:ARRAY OF CHAR;
                         Postfix:ARRAY OF CHAR):BOOLEAN;
(* ------------------------------------------------------------------------
  :Input.      Path    : kompletter Pfad
  :Input.      Postfix : Postfix für Dateinamen.
  :Output.     Path    : Pfad mit eingebautem Postfix.
  :Output.             : FALSE wird zurücküberreicht wenn Postfix
  :Output.               angehängt werden mußte.
  :Semantic.   Überprüft Pfad auf Postfix und fügt diesen e.v. an.
------------------------------------------------------------------------ *)
VAR
      PostU, FileU, (* U = Uppercase *)
      Dir,
      File : ARRAY 256 OF CHAR;
      LenD,                            (* Difference *)
      LenP  : INTEGER;

BEGIN
   Split(Path,Dir,File);
   FileU := File;
   Str.Upper(FileU);
   LenP := Str.Length(Postfix);
   LenD := (Str.Length(FileU) - LenP);
   Str.Cut(Postfix,0,LenP,PostU);
   Str.Upper(PostU);
   IF(Str.Occurs(FileU,PostU) = LenD)AND(LenD >= 0)THEN
      RETURN TRUE;                     (* Postfix gefunden *)
   ELSE
      Path := "";
      Str.Append(Path,Dir);
      Str.Append(Path,File);
      Str.Append(Path,Postfix);
      RETURN FALSE;                    (* Postfix eingebaut *)
   END;
END Postfix;

PROCEDURE ExPostfix * (VAR Path:ARRAY OF CHAR;
                           Postfix:ARRAY OF CHAR):BOOLEAN;
(* ------------------------------------------------------------------------
  :Input.      Path    : kompletter Pfad
  :Input.      Postfix : Postfix für Dateinamen.
  :Output.     Path    : Pfad mit ausgebautem Postfix.
  :Output.             : TRUE wird zurücküberreicht wenn Postfix
  :Output.               ausgebaut werden mußte.
  :Semantic.   Überprüft Pfad auf Postfix und entfernt diesen e.v.
------------------------------------------------------------------------ *)
VAR
      PostU, FileU, (* U = Uppercase *)
      Dir,
      File : ARRAY 256 OF CHAR;
      LenD,                            (* Difference *)
      LenP  : INTEGER;

BEGIN
   Split(Path,Dir,File);
   FileU := File;
   Str.Upper(FileU);
   LenP := Str.Length(Postfix);
   LenD := (Str.Length(FileU) - LenP);
   Str.Cut(Postfix,0,LenP,PostU);
   Str.Upper(PostU);
   IF(Str.Occurs(FileU,PostU) = LenD)AND(LenD >= 0)THEN
      Str.Cut(File,0,LenD,FileU);
      Path := "";
      Str.Append(Path,Dir);
      Str.Append(Path,FileU);
      RETURN TRUE;                     (* Postfix gefunden *)
   ELSE
      RETURN FALSE;                    (* Postfix nicht gefunden *)
   END;
END ExPostfix;

END PathHandler.
