home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* *)
- (* 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.
-
-
-
-