home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1991-08-10 | 7.1 KB | 243 lines |
- IMPLEMENTATION MODULE Args;
-
- IMPORT SYSTEM;
- IMPORT Strings,FStorage;
-
- @IF M2S THEN
- IMPORT RunTime;
- IMPORT Ports,Workbench;
- IMPORT Libraries;
- FROM Icon IMPORT IconName,IconBase,GetDiskObject;
- FROM DOS IMPORT FileLock,CurrentDir;
- FROM DOSProcess IMPORT ProcessPtr,CommandLineInterfacePtr;
- @ELSIF TDI THEN
- IMPORT AMIGAX;
- IMPORT Ports,Interrupts,Workbench;
- IMPORT Libraries;
- FROM IconLibrary IMPORT IconName,IconBase,GetDiskObject;
- FROM DOSLibrary IMPORT DOSBase,DOSName;
- FROM DOSFiles IMPORT FileLock,CurrentDir;
- FROM DOSExtensions IMPORT ProcessPtr,CommandLineInterfacePtr;
- @ELSE
- (* insert machine specific imports here *)
- @END
-
- @INCLUDE "MACROS"
-
- (*----------------------------------------------------------------------*)
-
- @IF AMIGA THEN
- VAR WM: POINTER TO Workbench.WBStartup;
- process: ProcessPtr;
- @END
-
- (*----------------------------------------------------------------------*)
-
- @NoLongAddressing
- @NoCopyStrings
-
- PROCEDURE AddArgs(string: ARRAY OF CHAR);
-
- VAR buffer : ARRAY [0..MaxArgSize] OF CHAR;
- len,i,j: CARDINAL;
-
- BEGIN
- i:=0;
- j:=0;
- len:=Strings.Length(string);
-
- WHILE (j<MaxArgSize) AND (i<=len) AND (argc<=MaxArg) DO
- j:=0;
- WHILE (string[i]=" ") OR (string[i]=11C) DO INC(i); END;
-
- IF string[i]<" " THEN RETURN; END;
-
- IF string[i]='"' THEN
- INC(i);
- WHILE (string[i]#'"') AND (j<MaxArgSize) AND (i<len) DO
- IF (string[i] = CHR(92)) AND (string[i+1]='"') THEN
- INC(i);
- END;
- buffer[j]:=string[i];
- INC(j);
- INC(i);
- END;
- IF string[i]='"' THEN INC(i); END;
- ELSE
- IF (string[i]>='!') AND (string[i]<='-') THEN
- buffer[j]:=string[i];
- INC(i);
- INC(j);
- ELSE
- REPEAT
- buffer[j]:=string[i];
- INC(j);
- INC(i);
- UNTIL (string[i]<="-") OR (j>=MaxArgSize) OR (i>=len);
- END;
- END;
- buffer[j]:=0C;
- FStorage.ALLOCATE(argv[argc],LONGCARD(j+1));
- Strings.Assign(buffer,argv[argc]^);
- INC(argc);
- END;
- END AddArgs;
-
- (*----------------------------------------------------------------------*)
- (* Get the command name. If this is not an Amiga, make an empty string *)
- (*----------------------------------------------------------------------*)
-
- @NoLongAddressing
-
- PROCEDURE AddCmdName;
-
- VAR charptr : POINTER TO CHAR;
- stringptr: POINTER TO ARRAY [0..MaxArgSize] OF CHAR;
- toolptr : POINTER TO SYSTEM.ADDRESS;
- buffer : ARRAY [0..MaxArgSize] OF CHAR;
- len,i : CARDINAL;
- @IF AMIGA THEN
- cli : CommandLineInterfacePtr;
- numargs: INTEGER;
- arglist: Workbench.WBArgPtr;
- diskobj: Workbench.DiskObjectPtr;
- lock: FileLock;
- @END
-
- BEGIN
- i:=0;
- @IF AMIGA & (M2S|TDI) THEN
- IF SYSTEM.ADDRESS(WM) = SYSTEM.ADDRESS(0) THEN (* started from CLI *)
- cli:=SYSTEM.ADDRESS(process^.prCLI)*4;
- charptr:=SYSTEM.ADDRESS(cli^.cliCommandName)*4;
- len:=ORD(charptr^);
- WHILE (i<len) AND (i<MaxArgSize) DO
- INC(charptr);
- buffer[i]:=charptr^;
- INC(i);
- END;
- buffer[i]:=0C;
- FStorage.ALLOCATE(argv[argc],LONGCARD(i+1));
- Strings.Assign(buffer,argv[argc]^);
- INC(argc);
- ELSE (* started from WorkBench *)
- numargs:=INTEGER(WM^.smNumArgs);
- arglist:=WM^.smArgList;
- stringptr:=NIL;
- WHILE numargs>=1 DO
- lock:=CurrentDir(arglist^.waLock);
- argv[argc]:=SYSTEM.ADDRESS(arglist^.waName);
- @IF M2S THEN
- diskobj:=GetDiskObject(SYSTEM.ADDRESS(arglist^.waName));
- @ELSIF TDI THEN
- diskobj:=GetDiskObject(arglist^.waName^);
- @ELSE
- (* insert compiler dependency here *)
- @END
- INC(argc);
- toolptr:=SYSTEM.ADDRESS(diskobj^.doToolTypes);
- REPEAT
- IF SYSTEM.ADDRESS(toolptr) # SYSTEM.ADDRESS(0) THEN
- stringptr:=SYSTEM.ADDRESS(toolptr^);
- AddArgs(stringptr^);
- END;
- toolptr:=SYSTEM.ADDRESS(toolptr)+SYSTEM.ADDRESS(4);
- UNTIL (SYSTEM.ADDRESS(stringptr) = SYSTEM.ADDRESS(0)) OR
- (stringptr=NIL);
- DEC(numargs);
- arglist:=SYSTEM.ADDRESS(arglist)+
- SYSTEM.ADDRESS(SYSTEM.TSIZE(Workbench.WBArg));
- END;
- END;
- @ELSE
- buffer[i]:=0C;
- FStorage.ALLOCATE(argv[argc],LONGCARD(i+1));
- Strings.Assign(buffer,argv[argc]^);
- INC(argc);
- @END
- END AddCmdName;
-
- (*----------------------------------------------------------------------*)
- (* Add the command line arguments from the shell (or CLI) *)
- (*----------------------------------------------------------------------*)
-
- PROCEDURE AddCmdArgs;
-
- VAR stringptr: POINTER TO ARRAY [0..MaxArgSize] OF CHAR;
-
- BEGIN
- @IF AMIGA THEN
- IF SYSTEM.ADDRESS(WM) = SYSTEM.ADDRESS(0) THEN
- @IF M2S THEN
- stringptr:=SYSTEM.ADDRESS(RunTime.CmdLinePtr);
- @ELSIF TDI THEN
- stringptr:=SYSTEM.ADDRESS(AMIGAX.CLinePtr);
- @ELSE
- (* insert compiler dependent stuff here *)
- @END
- AddArgs(stringptr^);
- END;
- @ELSE
- (* insert OS dependent stuff here *)
- @END
- END AddCmdArgs;
-
- (*----------------------------------------------------------------------*)
- (* Termination procedure, call this to clean things up. *)
- (*----------------------------------------------------------------------*)
-
-
- PROCEDURE TermProc;
- BEGIN
- @IF AMIGA THEN
- @IF TDI THEN
- IF SYSTEM.ADDRESS(WM) # SYSTEM.ADDRESS(0) THEN
- Interrupts.Forbid;
- Ports.ReplyMsg(SYSTEM.ADDRESS(WM));
- END;
- @END
- Libraries.CloseLibrary(IconBase);
- @END
- END TermProc;
-
- (************************************************************************)
-
- BEGIN
- @IF AMIGA THEN
- @IF M2S THEN
- process:=RunTime.CurrentProcess;
- @ELSIF TDI THEN
- process:=AMIGAX.ProcessPtr;
- @ELSE
- (* insert compiler dependent stuff here *)
- @END
-
- IF SYSTEM.ADDRESS(process^.prCLI) = SYSTEM.ADDRESS(0) THEN
- @IF M2S THEN
- WM:=RunTime.WBMsg;
- @ELSIF TDI THEN
- WM:=SYSTEM.ADDRESS(Ports.WaitPort(SYSTEM.ADR(process^.prMsgPort)));
- WM:=SYSTEM.ADDRESS(Ports.GetMsg(SYSTEM.ADR(process^.prMsgPort)));
- @ELSE
- WM:=SYSTEM.ADDRESS(0);
- (* insert Workbench message initialization here *)
- @END
- END;
-
- @IF M2S THEN
- IconBase:=Libraries.OpenLibrary(SYSTEM.ADR(IconName),0);
- @ELSIF TDI THEN
- IconBase:=Libraries.OpenLibrary(IconName,0);
- DOSBase :=Libraries.OpenLibrary(DOSName,0);
- @ELSE
- (* insert compiler dependent OpenLibrary here *)
- @END
- @END
-
- FOR argc:= 0 TO MaxArg DO argv[argc]:=NIL; END;
- argc:=0;
-
- AddCmdName;
- AddCmdArgs;
- END Args.
-