PACKET disk manager DEFINES                 (* Copyright (C) 1986 *)
                                            (* Frank Klapper      *)
  disk fetch,                               (* 07.05.86           *)
  disk check,
  disk save first phase,
  disk save second phase,
  disk clear,
  disk format,
  disk erase,
  disk exists,
  disk list,
  disk all,
  disk reserve,
  disk free:

LET ascii        = 1,
    ascii german = 2,
    transparent  = 3,
    ebcdic       = 4,
    row text     = 5,
    ds           = 6,
    atari st     = 10;

TEXT VAR file name;

INT VAR mode := 0;
TEXT VAR mode extension;

REAL VAR last access time := 0.0;

PROC disk fetch (TEXT CONST name, DATASPACE VAR file ds):
  enable stop;
  access disk;
  file name  := adapted name (name, TRUE);
  IF dir contains (file name)
    THEN do fetch
    ELSE errorstop ("die Datei """ + file name + """ gibt es nicht")
  FI;
  last access time := clock (1).

do fetch:
  SELECT mode OF 
    CASE ascii, ascii german, atari st, ebcdic, transparent: fetch filemode (file ds, filename, mode)
    CASE row text   : fetch row textmode (file ds, filename)
    CASE ds         : fetch dsmode       (file ds, filename)
    OTHERWISE error stop ("Unzul�ssige Betriebsart")
  END SELECT.

END PROC disk fetch;

PROC disk check (TEXT CONST name):
  enable stop;
  access disk;
  file name := adapted name (name, TRUE);
  IF dir contains (file name)
    THEN disable stop;
         check file (file name);
         IF is error
           THEN clear error;
                error stop ("Fehler beim Pr�flesen der Datei """ + file name + """")
         FI;
    ELSE error stop ("""" + file name + """ gibt es nicht")
  FI;
  last access time := clock (1).

END PROC disk check;

PROC disk save first phase (TEXT CONST name, BOOL VAR overwrite question):
  enable stop;
  overwrite question := FALSE;
  access disk;
  file name := adapted name (name, FALSE); 
  IF dir contains (file name)
     THEN overwrite question := TRUE
  FI;
  last access time := clock (1).

END PROC disk save first phase;

PROC disk save second phase (DATASPACE CONST file ds): 
  enable stop;
  access disk;
  erase file if necessary;
  do save;
  last access time := clock (1).

erase file if necessary:
  IF dir contains (file name)
    THEN erase table entrys (file name)
  FI.

do save:
  SELECT mode OF 
    CASE ascii, ascii german,atari st, ebcdic, transparent: save filemode (file ds, filename, mode)
    CASE row text   : save row textmode (file ds, filename)
    CASE ds         : save dsmode       (file ds, filename)
    OTHERWISE error stop ("Unzul�ssige Betriebsart")
  END SELECT.

END PROC disk save second phase;

(* DOS bekommt die Tabellenparameter von der Diskette
   CPM bekommt die Tabellenparameter �ber 'reserve'   *)

PROC disk clear:
  enable stop;
(*COND DOS*)
  access disk;
(*ENDCOND*)
(*COND CPM
  open eu disk;
  open action;
ENDCOND*)
  format disk;
  last access time := clock (1).

END PROC disk clear;

PROC disk erase (TEXT CONST name):
  enable stop;
  access disk;
  file name := adapted name (name, TRUE); 
  IF NOT dir contains (file name)
    THEN errorstop ("die Datei """ + file name + """ gibt es nicht")
    ELSE erase table entrys (file name);
  FI;
  last access time := clock (1).

END PROC disk erase;
 
BOOL PROC disk exists (TEXT CONST name):
  enable stop;
  access disk;
  last access time := clock (1);
  dir contains (adapted name (name, TRUE)).

END PROC disk exists;

PROC disk list (DATASPACE VAR list ds):
  enable stop;
  access disk;
  dir list (list ds);
  last access time := clock (1).

END PROC disk list;

THESAURUS PROC disk all:
  enable stop;
  access disk;
  last access time := clock (1);
  dir all.

END PROC disk all;

PROC disk format:

(*COND DOS*)
  error stop ("nicht implementiert")
(*ENDCOND*)

(*COND CPM
  enable stop;
  open eu disk;
  open action;
  format archive (eu disk format no);
  format disk;
  last access time := clock (1).
ENDCOND*)

END PROC disk format;

PROC disk reserve (TEXT CONST reserve string):
  enable stop;
  close action;
  last access time := clock (1);
  get mode.
 
get mode:
  TEXT VAR mode text;
  IF pos (reserve string, ":") = 0
    THEN mode text := reserve string;
         mode extension := ""
    ELSE mode text := subtext (reserve string, 1, pos (reserve string, ":") - 1);
         mode extension := subtext (reserve string, pos (reserve string, ":") + 1)
  FI;
  prepare modetext;
  IF mode text = "FILEASCII"
    THEN mode := ascii
  ELIF mode text = "FILEASCIIGERMAN"
    THEN mode := asciigerman
  ELIF mode text = "FILEATARIST"
    THEN mode := atari st
  ELIF modetext = "FILEEBCDIC"
    THEN mode := ebcdic
  ELIF modetext = "FILETRANSPARENT"
    THEN mode := transparent
  ELIF mode text = "ROWTEXT"
    THEN mode := row text
  ELIF mode text = "DS"
    THEN mode := ds
   ELSE error stop ("Unzul�ssige Betriebsart")
  FI.

prepare modetext:
  change all (mode text, " ", "");
  INT VAR i;
  FOR i FROM 1 UPTO LENGTH mode text REP
    IF is lower case
      THEN replace (mode text, i, upper case char)
    FI
  PER.

is lower case:
  code (mode text SUB i) > 96 AND code (mode text SUB i) < 123.

upper case char:
  code (code (mode text SUB i) - 32).

END PROC disk reserve;

PROC disk free:
  disable stop;
  close action;
  close disk;
  reduce cluster buffer.

END PROC disk free;

PROC access disk:
  IF action closed COR (last access more than two seconds ago CAND disk changed)
    THEN open disk archive
  FI.

open disk archive:
  close action;
  open eu disk;
  open disk (mode extension);
  open action.

last access more than two seconds ago:
  abs (clock (1) - last access time) > 2.0.

END PROC access disk;

END PACKET disk manager;