(*
  .name       EArgs
  .task       Argument/Tooltype parsing
  .release    1.0
  .language   Oberon-2
  .translator Amiga Oberon 3.11
  .system     AmigaOS 2.04/2.1/3.0
  .author     Joachim Barheine
  .address    Hochgrevestraße 3, D-38640 Goslar
  .copyright  (c) 1994 by Joachim Barheine
*)

(* .info: 30/04/94, 14:19:58, version 11 *)

MODULE EArgs;

IMPORT
  Exec,
  Dos,
  Icon,
  K:= Kernel,
  OLib:= OberonLib,
  Util:= Utility,
  Wb:= Workbench;

CONST
  template = "FROM/M,WITH/K,PUBSCREEN/K";
(* $IF M2Amiga THEN *)
  defEdtName = "M2Edt";
(* $ELSE *)
  defEdtName = "Edt";
(* $END *)

VAR
  old, currDir: Dos.FileLockPtr;
  wbMsg: Wb.WBStartupPtr;
  rdArgs: Dos.RDArgsPtr;
  args  : STRUCT (dummy: Dos.ArgsStruct)
            from: Dos.ArgStringArray;
            startup: Dos.ArgString;
            pubScreen: Dos.ArgString;
          END;
  from- : ARRAY 256 OF Exec.STRPTR;
  pubScreen- : Exec.STRING;  (* name of public screen *)
  startup- : Exec.STRING;  (* name of startup file *)
  edt- : Exec.STRING;  (* filename of Edt *)
  numArgs- : INTEGER;

PROCEDURE WBGetFilename* (VAR filename: ARRAY OF CHAR; dir: Dos.FileLockPtr; name: Exec.LSTRPTR): BOOLEAN;

VAR
  oldCurr, lock: Dos.FileLockPtr;

(* $CopyArrays- *)

BEGIN
  oldCurr:= Dos.CurrentDir(dir);
  lock:= Dos.Lock(name^, Dos.sharedLock);
  IF lock # NIL THEN
    IF ~Dos.NameFromLock(lock, filename, LEN(filename)) THEN
      filename:= "";
    END;
    Dos.UnLock(lock);
  END;
  dir:= Dos.CurrentDir(oldCurr);
  RETURN filename # "";
END WBGetFilename;

PROCEDURE WBParseArgs;

VAR
  i, fi: INTEGER;
  diskObj: Wb.DiskObjectPtr;
  s: Exec.LSTRPTR;

BEGIN
  fi:= 0;
  FOR i:= 1 TO SHORT(wbMsg.numArgs) - 1 DO
    NEW(from[fi]);
    IF WBGetFilename(from[fi]^, wbMsg.argList[i].lock, wbMsg.argList[i].name) THEN
      INC(fi);
    ELSE
      DISPOSE(from[fi]);
    END;
  END;
  from[fi]:= NIL;
  numArgs:= fi;

  diskObj:= Icon.GetDiskObject(edt);
  IF diskObj # NIL THEN
    s:= Icon.FindToolType(diskObj.toolTypes, "PUBSCREEN");
    IF s # NIL THEN COPY(s^, pubScreen) END;
    s:= Icon.FindToolType(diskObj.toolTypes, "WITH");
    IF s # NIL THEN COPY(s^, startup) END;
    Icon.FreeDiskObject(diskObj);
  END;
END WBParseArgs;

PROCEDURE CLIParseArgs;

VAR
  i, fi: INTEGER;
  lock: Dos.FileLockPtr;

BEGIN
  i:= 0; fi:= 0;
  IF args.from # NIL THEN
    REPEAT
      lock:= Dos.Lock(args.from[i]^, Dos.sharedLock);
      IF lock # NIL THEN
        NEW(from[fi]);
        IF Dos.NameFromLock(lock, from[fi]^, SIZE(from[fi]^)) THEN
          INC(fi);
        ELSE
          DISPOSE(from[fi]);
        END;
        Dos.UnLock(lock);
      END;
      INC(i);
    UNTIL args.from[i] = NIL;
  END;
  from[fi]:= NIL;
  numArgs:= fi;
  IF args.pubScreen # NIL THEN COPY(args.pubScreen^, pubScreen) END;
  IF args.startup # NIL THEN COPY(args.startup^, startup) END;
END CLIParseArgs;

BEGIN
  old:= NIL;
  rdArgs:= NIL;
  numArgs:= 0;
  from[0]:= NIL;
  startup:= "";
  pubScreen:= "";
  IF OLib.wbStarted THEN
    wbMsg:= OLib.wbenchMsg;
    currDir:= wbMsg.argList[0].lock;
    old:= Dos.CurrentDir(currDir);
    IF ~WBGetFilename(edt, currDir, wbMsg.argList[0].name) THEN edt:= defEdtName END;
    WBParseArgs;
  ELSE
    IF ~Dos.GetProgramName(edt, SIZE(edt)) THEN edt:= defEdtName END;
    rdArgs:= Dos.ReadArgs(template, args, NIL);
    IF rdArgs # NIL THEN
      CLIParseArgs;
      Dos.FreeArgs(rdArgs);
    END;
  END;
CLOSE
  IF old # NIL THEN currDir:= Dos.CurrentDir(old) END;
END EArgs.