home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 549b.lha / M2P_v1.0_sources / source.lzh / Args.mpp < prev    next >
Encoding:
Modula Implementation  |  1991-08-10  |  7.1 KB  |  243 lines

  1. IMPLEMENTATION MODULE Args;
  2.  
  3. IMPORT SYSTEM;
  4. IMPORT Strings,FStorage;
  5.  
  6. @IF    M2S THEN
  7.    IMPORT RunTime;
  8.    IMPORT Ports,Workbench;
  9.    IMPORT Libraries;
  10.    FROM Icon       IMPORT IconName,IconBase,GetDiskObject;
  11.    FROM DOS        IMPORT FileLock,CurrentDir;
  12.    FROM DOSProcess IMPORT ProcessPtr,CommandLineInterfacePtr;
  13. @ELSIF TDI THEN
  14.    IMPORT AMIGAX;
  15.    IMPORT Ports,Interrupts,Workbench;
  16.    IMPORT Libraries;
  17.    FROM IconLibrary   IMPORT IconName,IconBase,GetDiskObject;
  18.    FROM DOSLibrary    IMPORT DOSBase,DOSName;
  19.    FROM DOSFiles      IMPORT FileLock,CurrentDir;
  20.    FROM DOSExtensions IMPORT ProcessPtr,CommandLineInterfacePtr;
  21. @ELSE
  22.    (* insert machine specific imports here *)
  23. @END
  24.  
  25. @INCLUDE "MACROS"
  26.  
  27. (*----------------------------------------------------------------------*)
  28.  
  29. @IF AMIGA THEN
  30.    VAR WM:      POINTER TO Workbench.WBStartup;
  31.        process: ProcessPtr;
  32. @END
  33.  
  34. (*----------------------------------------------------------------------*)
  35.  
  36. @NoLongAddressing
  37. @NoCopyStrings
  38.  
  39. PROCEDURE AddArgs(string: ARRAY OF CHAR);
  40.  
  41. VAR buffer : ARRAY [0..MaxArgSize] OF CHAR;
  42.     len,i,j: CARDINAL;
  43.  
  44. BEGIN
  45.    i:=0;
  46.    j:=0;
  47.    len:=Strings.Length(string);
  48.  
  49.    WHILE (j<MaxArgSize) AND (i<=len) AND (argc<=MaxArg) DO
  50.       j:=0;
  51.       WHILE (string[i]=" ") OR (string[i]=11C) DO INC(i); END;
  52.  
  53.       IF string[i]<" " THEN RETURN; END;
  54.       
  55.       IF string[i]='"' THEN
  56.          INC(i);
  57.          WHILE (string[i]#'"') AND (j<MaxArgSize) AND (i<len) DO
  58.             IF (string[i] = CHR(92)) AND (string[i+1]='"') THEN
  59.                INC(i);
  60.             END;
  61.             buffer[j]:=string[i];
  62.             INC(j);
  63.             INC(i);
  64.          END;
  65.          IF string[i]='"' THEN INC(i); END;
  66.       ELSE
  67.          IF (string[i]>='!') AND (string[i]<='-') THEN
  68.             buffer[j]:=string[i];
  69.             INC(i);
  70.             INC(j);
  71.          ELSE
  72.             REPEAT
  73.                buffer[j]:=string[i];
  74.                INC(j);
  75.                INC(i);
  76.             UNTIL (string[i]<="-") OR (j>=MaxArgSize) OR (i>=len);
  77.          END;
  78.       END;
  79.       buffer[j]:=0C;
  80.       FStorage.ALLOCATE(argv[argc],LONGCARD(j+1));
  81.       Strings.Assign(buffer,argv[argc]^);
  82.       INC(argc);
  83.    END;
  84. END AddArgs;
  85.  
  86. (*----------------------------------------------------------------------*)
  87. (* Get the command name.  If this is not an Amiga, make an empty string *)
  88. (*----------------------------------------------------------------------*)
  89.  
  90. @NoLongAddressing
  91.  
  92. PROCEDURE AddCmdName;
  93.  
  94. VAR charptr  : POINTER TO CHAR;
  95.     stringptr: POINTER TO ARRAY [0..MaxArgSize] OF CHAR;
  96.     toolptr  : POINTER TO SYSTEM.ADDRESS;
  97.     buffer   : ARRAY [0..MaxArgSize] OF CHAR;
  98.     len,i    : CARDINAL;
  99.     @IF AMIGA THEN
  100.         cli    : CommandLineInterfacePtr;
  101.         numargs: INTEGER;
  102.         arglist: Workbench.WBArgPtr;
  103.         diskobj: Workbench.DiskObjectPtr;
  104.         lock:    FileLock;
  105.     @END
  106.     
  107. BEGIN
  108.    i:=0;
  109.    @IF AMIGA & (M2S|TDI) THEN
  110.       IF SYSTEM.ADDRESS(WM) = SYSTEM.ADDRESS(0) THEN            (* started from CLI *)
  111.          cli:=SYSTEM.ADDRESS(process^.prCLI)*4;
  112.          charptr:=SYSTEM.ADDRESS(cli^.cliCommandName)*4;
  113.          len:=ORD(charptr^);
  114.          WHILE (i<len) AND (i<MaxArgSize) DO
  115.             INC(charptr);
  116.             buffer[i]:=charptr^;
  117.             INC(i);
  118.          END;
  119.          buffer[i]:=0C;
  120.          FStorage.ALLOCATE(argv[argc],LONGCARD(i+1));
  121.          Strings.Assign(buffer,argv[argc]^);
  122.          INC(argc);
  123.       ELSE                                   (* started from WorkBench *)
  124.          numargs:=INTEGER(WM^.smNumArgs);
  125.          arglist:=WM^.smArgList;
  126.          stringptr:=NIL;
  127.          WHILE numargs>=1 DO
  128.             lock:=CurrentDir(arglist^.waLock);
  129.             argv[argc]:=SYSTEM.ADDRESS(arglist^.waName);
  130.             @IF   M2S THEN
  131.                diskobj:=GetDiskObject(SYSTEM.ADDRESS(arglist^.waName));
  132.             @ELSIF TDI THEN
  133.                diskobj:=GetDiskObject(arglist^.waName^);
  134.             @ELSE
  135.                         (* insert compiler dependency here *)
  136.             @END
  137.             INC(argc);
  138.             toolptr:=SYSTEM.ADDRESS(diskobj^.doToolTypes);
  139.             REPEAT
  140.                IF SYSTEM.ADDRESS(toolptr) # SYSTEM.ADDRESS(0) THEN
  141.                   stringptr:=SYSTEM.ADDRESS(toolptr^);
  142.                   AddArgs(stringptr^);
  143.                END;
  144.                toolptr:=SYSTEM.ADDRESS(toolptr)+SYSTEM.ADDRESS(4);
  145.             UNTIL (SYSTEM.ADDRESS(stringptr) = SYSTEM.ADDRESS(0)) OR 
  146.                    (stringptr=NIL);
  147.             DEC(numargs);
  148.             arglist:=SYSTEM.ADDRESS(arglist)+
  149.                      SYSTEM.ADDRESS(SYSTEM.TSIZE(Workbench.WBArg));
  150.          END;
  151.       END;
  152.    @ELSE
  153.       buffer[i]:=0C;
  154.       FStorage.ALLOCATE(argv[argc],LONGCARD(i+1));
  155.       Strings.Assign(buffer,argv[argc]^);
  156.       INC(argc);
  157.    @END
  158. END AddCmdName;
  159.  
  160. (*----------------------------------------------------------------------*)
  161. (* Add the command line arguments from the shell (or CLI)               *)
  162. (*----------------------------------------------------------------------*)
  163.  
  164. PROCEDURE AddCmdArgs;
  165.  
  166. VAR stringptr: POINTER TO ARRAY [0..MaxArgSize] OF CHAR;
  167.  
  168. BEGIN
  169.    @IF AMIGA THEN
  170.       IF SYSTEM.ADDRESS(WM) = SYSTEM.ADDRESS(0) THEN
  171.          @IF    M2S THEN
  172.             stringptr:=SYSTEM.ADDRESS(RunTime.CmdLinePtr);
  173.          @ELSIF TDI THEN
  174.             stringptr:=SYSTEM.ADDRESS(AMIGAX.CLinePtr);
  175.          @ELSE
  176.                 (* insert compiler dependent stuff here *)
  177.          @END
  178.          AddArgs(stringptr^);
  179.       END;
  180.    @ELSE
  181.              (* insert OS dependent stuff here *)
  182.    @END
  183. END AddCmdArgs;
  184.  
  185. (*----------------------------------------------------------------------*)
  186. (* Termination procedure, call this to clean things up.                 *)
  187. (*----------------------------------------------------------------------*)
  188.  
  189.  
  190. PROCEDURE TermProc;  
  191. BEGIN 
  192.    @IF AMIGA THEN
  193.       @IF    TDI THEN
  194.          IF SYSTEM.ADDRESS(WM) # SYSTEM.ADDRESS(0) THEN
  195.             Interrupts.Forbid;
  196.             Ports.ReplyMsg(SYSTEM.ADDRESS(WM));
  197.          END;
  198.       @END
  199.       Libraries.CloseLibrary(IconBase);
  200.    @END
  201. END TermProc;
  202.  
  203. (************************************************************************)
  204.  
  205. BEGIN
  206.    @IF AMIGA THEN
  207.       @IF    M2S THEN
  208.          process:=RunTime.CurrentProcess;
  209.       @ELSIF TDI THEN
  210.          process:=AMIGAX.ProcessPtr;
  211.       @ELSE
  212.            (* insert compiler dependent stuff here *)
  213.       @END
  214.  
  215.       IF SYSTEM.ADDRESS(process^.prCLI) = SYSTEM.ADDRESS(0) THEN
  216.          @IF    M2S THEN
  217.             WM:=RunTime.WBMsg;
  218.          @ELSIF TDI THEN
  219.             WM:=SYSTEM.ADDRESS(Ports.WaitPort(SYSTEM.ADR(process^.prMsgPort)));
  220.             WM:=SYSTEM.ADDRESS(Ports.GetMsg(SYSTEM.ADR(process^.prMsgPort)));
  221.          @ELSE
  222.             WM:=SYSTEM.ADDRESS(0);
  223.                 (* insert Workbench message initialization here *)
  224.          @END
  225.       END;
  226.  
  227.       @IF    M2S THEN
  228.          IconBase:=Libraries.OpenLibrary(SYSTEM.ADR(IconName),0);
  229.       @ELSIF TDI THEN
  230.          IconBase:=Libraries.OpenLibrary(IconName,0);
  231.          DOSBase :=Libraries.OpenLibrary(DOSName,0);
  232.       @ELSE
  233.          (* insert compiler dependent OpenLibrary here *)
  234.       @END
  235.    @END
  236.  
  237.    FOR argc:= 0 TO MaxArg DO argv[argc]:=NIL; END;
  238.    argc:=0;
  239.  
  240.    AddCmdName;
  241.    AddCmdArgs;
  242. END Args.
  243.