(*-------------------------------------------------------------------------*)
(*                                                                         *)
(*  Amiga Oberon Library Module: Arguments            Date: 02-Nov-92      *)
(*                                                                         *)
(*   © 1992 by Fridtjof Siebert                                            *)
(*                                                                         *)
(*-------------------------------------------------------------------------*)

MODULE Arguments;

IMPORT d * := Dos,
       e   := Exec,
       wb  := Workbench,
       ol  := OberonLib,
       sys := SYSTEM;

TYPE
  CliPtr  = UNTRACED POINTER TO d.CommandLineInterface;
  CharPtr = UNTRACED POINTER TO CHAR;

CONST
  quote = '"';
  lf = 0AX;

VAR
  Me * : d.ProcessPtr;
  CommLine: CharPtr;
  MyCli: CliPtr;
  oldCurrentDir * : d.FileLockPtr;
  wbm: wb.WBStartupPtr;


PROCEDURE Move(i: LONGINT);
BEGIN
  CommLine := sys.VAL(CharPtr,sys.VAL(LONGINT,CommLine)+i);
END Move;

PROCEDURE Next;
BEGIN
  Move(1);
END Next;

PROCEDURE GetCLIArg(VAR str: ARRAY OF CHAR);

VAR l: INTEGER;

BEGIN
  WHILE CommLine^=20X DO Next END;
  l := 0;
  IF CommLine^=quote THEN
    Next;
    LOOP
      IF l=LEN(str) THEN l := 0 END;
      CASE CommLine^ OF
      quote: Next; EXIT |
      lf:          EXIT |
      ELSE
        str[l] := CommLine^;
        Next; INC(l);
      END;
    END;
  ELSE
    LOOP
      CASE CommLine^ OF
      20X,lf: EXIT |
      ELSE
        IF l<LEN(str) THEN str[l] := CommLine^ END;
        Next; INC(l)
      END;
    END;
  END;
  IF l<LEN(str) THEN str[l] := 0X END;
  WHILE CommLine^=20X DO Next END;
END GetCLIArg;


PROCEDURE NumArgs*(): INTEGER;

VAR
  cnt:INTEGER;
  s: ARRAY 80 OF CHAR;

BEGIN
  IF ol.wbStarted THEN
    RETURN SHORT(wbm.numArgs-1)
  ELSE
    cnt:=0; CommLine := ol.dosCmdBuf;
    WHILE CommLine^#lf DO
      GetCLIArg(s);
      INC(cnt);
    END;
    RETURN cnt;
  END
END NumArgs;


PROCEDURE GetArg*(arg: INTEGER; VAR argument: ARRAY OF CHAR);
VAR i: LONGINT;
BEGIN
  IF arg>NumArgs() THEN argument := ""; RETURN END;
  IF ol.wbStarted THEN
    CommLine := sys.VAL(e.APTR,wbm.argList[arg].name);
    i := 0;
    WHILE i<LEN(argument) DO
      argument[i] := CommLine^;
      Next; INC(i);
    END;
    IF d.CurrentDir(wbm.argList[arg].lock)=NIL THEN END;
  ELSE
    IF arg=0 THEN
      CommLine := sys.ADR(Me.cli.commandName^); i := ORD(CommLine^);
      IF i>=LEN(argument) THEN i := LEN(argument)
                          ELSE argument[i] := 0X END;

      Move(i);

      WHILE i>0 DO
        DEC(i);
        argument[i] := CommLine^;
        Move(-1);
      END;
    ELSE
      CommLine:=ol.dosCmdBuf;
      WHILE arg>0 DO
        DEC(arg);
        GetCLIArg(argument);
      END;
    END (* IF arg=0 *)
  END (* IF ol.wbstarted *)
END GetArg;


PROCEDURE GetLock * (num: INTEGER): d.FileLockPtr;
BEGIN
  IF ol.wbStarted & (num<wbm.numArgs) THEN
    RETURN wbm.argList[num].lock;
  ELSE
    RETURN oldCurrentDir;
  END;
END GetLock;


BEGIN

  Me := sys.VAL(d.ProcessPtr,ol.Me);
  oldCurrentDir := Me.currentDir;
  IF ol.wbStarted THEN
    wbm := ol.wbenchMsg;
    sys.SETREG(0,d.CurrentDir(wbm.argList[0].lock));
  END;

CLOSE

  IF d.CurrentDir(oldCurrentDir)=NIL THEN END;

END Arguments.



