home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / obrn-a_1.5_src.lha / oberon-a / source3.lha / Source / OC / OC.mod < prev    next >
Encoding:
Text File  |  1995-01-26  |  17.6 KB  |  623 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: OC.mod $
  4.   Description: Main entry point for the Oberon-A compiler.
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 5.14 $
  8.       $Author: fjc $
  9.         $Date: 1995/01/26 00:17:17 $
  10.  
  11.   Copyright © 1993-1995, Frank Copeland
  12.   This module forms part of the OC program
  13.   See OC.doc for conditions of use and distribution
  14.  
  15.   Log entries are at the end of the file.
  16.  
  17. *************************************************************************)
  18.  
  19. <* STANDARD- *>
  20.  
  21. MODULE OC;
  22.  
  23. IMPORT
  24.  
  25.   SYS := SYSTEM, Kernel, Errors, e := Exec, ti := Timer, u := Utility,
  26.   d := Dos, du := DosUtil, Files, In, str := Strings, OCRev, OCStrings,
  27.   OCM, OCS, OCT, OCC, OCE, Compiler, wb := Workbench, i := Icon;
  28.  
  29. CONST
  30.  
  31.   CopyrightStr = "Copyright © 1993-95 Frank Copeland\n";
  32.  
  33. VAR
  34.  
  35.   file, batchFile : Files.File;
  36.   r : Files.Rider;
  37.   tr : ti.TimeRequestPtr;
  38.   returnError, returnWarn : BOOLEAN;
  39.   startDir : d.FileLockPtr;
  40.  
  41.  
  42. (* -- Command line template and parsing ------------------------------- *)
  43.  
  44. CONST
  45.  
  46.   template =
  47.     "NS=NEWSYMFILE/S,BATCH/S,"
  48.     "SETTINGS/K,SEARCH/K,"
  49.     "SYMPATH/K,OBJPATH/K,ERRPATH/K,"
  50.     "SYMEXT/K,OBJEXT/K,ERREXT/K,"
  51.     "VERBOSE/S,DEBUG/S,MAKEICONS/S,"
  52.     "QUIET/S,NODEBUG/S,NOICONS/S,"
  53.     "SET/K,CLEAR/K,FILES/M,"
  54.     (* These are temporary and will disappear eventually *)
  55.     "FORCE/S,TEXTERR/S,TRACE/S";
  56.  
  57.   template2 = "FILES/M";
  58.  
  59.   optNS        = 0;
  60.   optBATCH     = 1;
  61.   optSETTINGS  = 2;
  62.   optSEARCH    = 3;
  63.   optSYMPATH   = 4;
  64.   optOBJPATH   = 5;
  65.   optERRPATH   = 6;
  66.   optSYMEXT    = 7;
  67.   optOBJEXT    = 8;
  68.   optERREXT    = 9;
  69.   optVERBOSE   = 10;
  70.   optDEBUG     = 11;
  71.   optMAKEICONS = 12;
  72.   optQUIET     = 13;
  73.   optNODEBUG   = 14;
  74.   optNOICONS   = 15;
  75.   optSET       = 16;
  76.   optCLEAR     = 17;
  77.   optFILES     = 18;
  78.   optFORCE     = 19;
  79.   optTEXTERR   = 20;
  80.   optTRACE     = 21;
  81.   optCount     = 22;
  82.  
  83.   helpStr =
  84.     "\nSETTINGS/K        -- preferences file\n"
  85.     "NS=NEWSYMFILE/S   -- generate a new symbol file if necessary\n"
  86.     "BATCH/S           -- batch compile\n"
  87.     "SEARCH/K          -- search directories for symbol files\n"
  88.     "SYMPATH/K,OBJPATH/K,ERRPATH/K\n"
  89.     "                  -- destinations for symbol, object and error files\n"
  90.     "DEBUG/S|NODEBUG/S -- output symbol info for a debugger\n"
  91.     "SET/K,CLEAR/K     -- defaults for pragmas, options and selectors\n"
  92.     "FILES/M           -- source file(s)\n"
  93.     "See OC.doc for more details\n\n"
  94.     "Arguments ? ";
  95.  
  96. TYPE
  97.  
  98.   StringArray = POINTER [2] TO ARRAY MAX(INTEGER) OF e.LSTRPTR;
  99.  
  100. VAR
  101.  
  102.   rdArgs, rdArgs2 : d.RDArgsPtr;
  103.   args : ARRAY optCount OF SYS.LONGWORD;
  104.  
  105.   (* These are filled in by ParseArgs() *)
  106.  
  107.   files : StringArray;
  108.   newSymFile, batch : BOOLEAN;
  109.  
  110. (*------------------------------------*)
  111. PROCEDURE* Cleanup (VAR rc : LONGINT);
  112.  
  113.   VAR oldDir : d.FileLockPtr;
  114.  
  115. BEGIN (* Cleanup *)
  116.   IF file # NIL THEN Files.Close (file); file := NIL END;
  117.   IF batchFile # NIL THEN Files.Close (batchFile); batchFile := NIL END;
  118.   IF ti.base # NIL THEN e.CloseDevice (tr); ti.base := NIL END;
  119.   IF rdArgs # NIL THEN
  120.     d.FreeArgs (rdArgs);
  121.     d.FreeDosObject (d.rdArgs, rdArgs);
  122.     rdArgs := NIL
  123.   END;
  124.   IF rdArgs2 # NIL THEN
  125.     (* d.FreeArgs (rdArgs2); *)
  126.     d.FreeDosObject (d.rdArgs, rdArgs2);
  127.     rdArgs2 := NIL
  128.   END;
  129.   IF Kernel.fromWorkbench THEN oldDir := d.CurrentDir (startDir) END
  130. END Cleanup;
  131.  
  132. (*------------------------------------*)
  133. PROCEDURE Init ();
  134.  
  135. BEGIN (* Init *)
  136.   Kernel.SetCleanup (Cleanup);
  137.   returnError := FALSE; returnWarn := FALSE;
  138.  
  139.   NEW (tr);
  140.   Errors.Assert
  141.     ( e.OpenDevice (ti.timerName, ti.vBlank, tr, {}) = 0,
  142.       "OC -- failed to open timer.device" );
  143.   ti.base := tr.node.device;
  144.  
  145.   rdArgs := d.AllocDosObjectTags (d.rdArgs, u.end);
  146.   rdArgs2 := d.AllocDosObjectTags (d.rdArgs, u.end);
  147.   ASSERT ((rdArgs # NIL) & (rdArgs2 # NIL));
  148.   rdArgs.extHelp := SYS.ADR (helpStr);
  149. END Init;
  150.  
  151. (*------------------------------------*)
  152. PROCEDURE CloneStr ( oldStr : e.LSTRPTR ) : e.LSTRPTR;
  153.   VAR newStr : e.LSTRPTR;
  154. BEGIN (* CloneStr *)
  155.   SYS.NEW (newStr, str.Length (oldStr^) + 1);
  156.   COPY (oldStr^, newStr^);
  157.   RETURN newStr
  158. END CloneStr;
  159.  
  160. (*------------------------------------*)
  161. PROCEDURE ParseArgs ();
  162.  
  163.   VAR
  164.     string : e.LSTRPTR; strings : StringArray;
  165.     i : INTEGER; ignore : BOOLEAN; ch : CHAR;
  166.     args2 : ARRAY 1 OF SYS.LONGWORD;
  167.     verbose, quiet, debug, nodebug, makeicons, noicons : BOOLEAN;
  168.  
  169.   (*------------------------------------*)
  170.   PROCEDURE ParseString (s, msg : ARRAY OF CHAR);
  171.  
  172.     VAR len : LONGINT; buffer : e.LSTRPTR;
  173.  
  174.   <*$CopyArrays-*>
  175.   BEGIN (* ParseString *)
  176.     len := str.Length (s) + 2;
  177.     SYS.NEW (buffer, len);
  178.     COPY (s, buffer^);
  179.     buffer [len-2] := "\n"; buffer [len-1] := 0X;
  180.     rdArgs2.source.buffer := buffer;
  181.     rdArgs2.source.length := len - 1;
  182.     rdArgs2.source.curChr := 0;
  183.     rdArgs2.daList := 0; rdArgs2.buffer := NIL; rdArgs2.bufSiz := 0;
  184.     rdArgs2.extHelp := NIL; rdArgs2.flags := {};
  185.     args2 [0] := NIL;
  186.     IF d.OldReadArgs (template2, args2, rdArgs2) = NIL THEN
  187.       ignore := d.PrintFault (d.IoErr(), msg);
  188.       HALT (d.warn)
  189.     END
  190.   END ParseString;
  191.  
  192. BEGIN (* ParseArgs *)
  193.   newSymFile := (SYS.VAL (LONGINT, args [optNS]) # 0);
  194.   batch := (SYS.VAL (LONGINT, args [optBATCH]) # 0);
  195.  
  196.   string := SYS.VAL (e.LSTRPTR, args [optSETTINGS]);
  197.   IF string = NIL THEN
  198.     ignore := OCM.LoadPrefs ("OC.prefs")
  199.   ELSE
  200.     IF ~OCM.LoadPrefs (string^) THEN
  201.       OCM.OutStr1 (OCStrings.OC1, string^);
  202.       HALT (d.warn)
  203.     END
  204.   END;
  205.  
  206.   string := SYS.VAL (e.LSTRPTR, args [optSEARCH]);
  207.   IF string # NIL THEN
  208.     OCM.ClearSearchPaths();
  209.     ParseString (string^, " !! SYM");
  210.     strings := SYS.VAL (StringArray, args2 [0]);
  211.     IF strings # NIL THEN
  212.       i := 0;
  213.       WHILE strings [i] # NIL DO
  214.         OCM.AddSearchPath (CloneStr (strings [i]));
  215.         INC (i)
  216.       END;
  217.     END;
  218.     d.FreeArgs (rdArgs2)
  219.   END;
  220.   OCM.AddSearchPath (SYS.ADR ("OLIB:"));
  221.  
  222.   string := SYS.VAL (e.LSTRPTR, args [optSYMPATH]);
  223.   IF string # NIL THEN COPY (string^, OCM.SymPath) END;
  224.   string := SYS.VAL (e.LSTRPTR, args [optOBJPATH]);
  225.   IF string # NIL THEN COPY (string^, OCM.ObjPath) END;
  226.   string := SYS.VAL (e.LSTRPTR, args [optERRPATH]);
  227.   IF string # NIL THEN COPY (string^, OCM.ErrPath) END;
  228.  
  229.   string := SYS.VAL (e.LSTRPTR, args [optSYMEXT]);
  230.   IF string # NIL THEN COPY (string^, OCM.SymExt) END;
  231.   string := SYS.VAL (e.LSTRPTR, args [optOBJEXT]);
  232.   IF string # NIL THEN COPY (string^, OCM.ObjExt) END;
  233.   string := SYS.VAL (e.LSTRPTR, args [optERREXT]);
  234.   IF string # NIL THEN COPY (string^, OCM.ErrExt) END;
  235.  
  236.   verbose := (SYS.VAL (LONGINT, args [optVERBOSE]) # 0);
  237.   quiet := (SYS.VAL (LONGINT, args [optQUIET]) # 0);
  238.   IF verbose & quiet THEN OCM.OutStr0 (OCStrings.OC14); HALT (d.warn)
  239.   ELSIF verbose THEN OCM.Verbose := TRUE
  240.   ELSIF quiet THEN OCM.Verbose := FALSE
  241.   END;
  242.  
  243.   debug := (SYS.VAL (LONGINT, args [optDEBUG]) # 0);
  244.   nodebug := (SYS.VAL (LONGINT, args [optNODEBUG]) # 0);
  245.   IF debug & nodebug THEN OCM.OutStr0 (OCStrings.OC15); HALT (d.warn)
  246.   ELSIF debug THEN OCM.Debug := TRUE
  247.   ELSIF nodebug THEN OCM.Debug := FALSE
  248.   END;
  249.  
  250.   makeicons := (SYS.VAL (LONGINT, args [optMAKEICONS]) # 0);
  251.   noicons := (SYS.VAL (LONGINT, args [optNOICONS]) # 0);
  252.   IF makeicons & noicons THEN OCM.OutStr0 (OCStrings.OC16); HALT (d.warn)
  253.   ELSIF makeicons THEN OCM.MakeIcons := TRUE
  254.   ELSIF noicons THEN OCM.MakeIcons := FALSE
  255.   END;
  256.  
  257.   string := SYS.VAL (e.LSTRPTR, args [optSET]);
  258.   IF (string = NIL) & (OCM.SetNames # "") THEN
  259.     string := SYS.ADR (OCM.SetNames)
  260.   END;
  261.   IF string # NIL THEN
  262.     ParseString (string^, " !! SET");
  263.     strings := SYS.VAL (StringArray, args2 [0]);
  264.     IF strings # NIL THEN
  265.       i := 0;
  266.       WHILE strings [i] # NIL DO
  267.         OCS.Set (strings [i]^);
  268.         INC (i)
  269.       END;
  270.     END;
  271.     d.FreeArgs (rdArgs2)
  272.   END;
  273.  
  274.   string := SYS.VAL (e.LSTRPTR, args [optCLEAR]);
  275.   IF (string = NIL) & (OCM.ClearNames # "") THEN
  276.     string := SYS.ADR (OCM.ClearNames)
  277.   END;
  278.   IF string # NIL THEN
  279.     ParseString (string^, " !! CLEAR");
  280.     strings := SYS.VAL (StringArray, args2 [0]);
  281.     IF strings # NIL THEN
  282.       i := 0;
  283.       WHILE strings [i] # NIL DO
  284.         OCS.Clear (strings [i]^);
  285.         INC (i)
  286.       END;
  287.     END;
  288.     d.FreeArgs (rdArgs2)
  289.   END;
  290.  
  291.   files := SYS.VAL (StringArray, args [optFILES]);
  292.  
  293.   OCM.Force := (SYS.VAL (LONGINT, args [optFORCE]) # 0);
  294.   OCS.binErrFile := (SYS.VAL (LONGINT, args [optTEXTERR]) = 0);
  295.   IF SYS.VAL (LONGINT, args [optTRACE]) # 0 THEN OCM.StartTrace() END;
  296. END ParseArgs;
  297.  
  298. (*------------------------------------*)
  299. PROCEDURE ReportTime (VAR t1, t2 : ti.TimeVal);
  300.  
  301.   PROCEDURE Pair ( ch : CHAR; x : LONGINT );
  302.   BEGIN (* Pair *)
  303.     OCM.OutChar (ch);
  304.     OCM.OutChar (CHR (x DIV 10 + 30H));
  305.     OCM.OutChar (CHR (x MOD 10 + 30H))
  306.   END Pair;
  307.  
  308. BEGIN (* ReportTime *)
  309.   ti.SubTime (t2, t1);
  310.   OCM.OutStr ("    Elapsed time =");
  311.   Pair (" ", t2.secs DIV 60);
  312.   Pair (":", t2.secs MOD 60);
  313.   OCM.OutChar ("."); OCM.OutInt (t2.micro DIV 100000);
  314.   OCM.OutLn; OCM.OutLn
  315. END ReportTime;
  316.  
  317. (*------------------------------------*)
  318. PROCEDURE Compile (source : ARRAY OF CHAR);
  319.  
  320.   VAR
  321.     t1, t2 : ti.TimeVal;
  322.  
  323. <*$CopyArrays-*>
  324. BEGIN (* Compile *)
  325.   IF OCM.Verbose THEN ti.GetSysTime (t1) END;
  326.  
  327.   file := Files.Old (source);
  328.   IF file = NIL THEN
  329.     OCM.OutStr1 (OCStrings.OC6, source)
  330.   ELSE
  331.     OCM.OutStr1 (OCStrings.OC7, source);
  332.     Compiler.newSF := newSymFile;
  333.     Compiler.CompilationUnit (file);
  334.     IF OCS.scanerr THEN returnError := TRUE
  335.     ELSIF OCS.warned THEN returnWarn := TRUE
  336.     END;
  337.     Files.Close (file); file := NIL
  338.   END;
  339.  
  340.   IF OCM.Verbose THEN
  341.     ti.GetSysTime (t2);
  342.     ReportTime (t1, t2)
  343.   END
  344. END Compile;
  345.  
  346. (*------------------------------------*)
  347. PROCEDURE Reset ();
  348.  
  349.   VAR
  350.     t1, t2 : ti.TimeVal;
  351.  
  352. BEGIN (* Reset *)
  353.   IF OCM.Verbose THEN
  354.     OCM.OutStr0 (OCStrings.OC8);
  355.     ti.GetSysTime (t1);
  356.   END;
  357.  
  358.   OCC.Close (); OCT.Close ();
  359.   Kernel.GC;
  360.  
  361.   IF OCM.Verbose THEN
  362.     ti.GetSysTime (t2);
  363.     ReportTime (t1, t2)
  364.   END;
  365. END Reset;
  366.  
  367. (*------------------------------------*)
  368. PROCEDURE Interactive ();
  369.  
  370.   CONST prompt = "Source file ? : ";
  371.  
  372.   VAR nameBuffer : ARRAY 256 OF CHAR;
  373.  
  374. BEGIN (* Interactive *)
  375.   OCM.OutStr0 (OCStrings.OC9);
  376.   In.Open; In.Name (nameBuffer);
  377.   IF nameBuffer [0] # 0X THEN
  378.     Compile (nameBuffer);
  379.     LOOP
  380.       OCM.OutStr0 (OCStrings.OC9);
  381.       In.Open; In.Name (nameBuffer);
  382.       IF nameBuffer = "" THEN EXIT END;
  383.       Reset ();
  384.       Compile (nameBuffer)
  385.     END
  386.   END
  387. END Interactive;
  388.  
  389. (*------------------------------------*)
  390. PROCEDURE Batch (batchName : ARRAY OF CHAR);
  391.  
  392.   VAR
  393.     sourceName : ARRAY 256 OF CHAR;
  394.     i : INTEGER;
  395.     ch : CHAR;
  396.     t1, t2 : ti.TimeVal;
  397.  
  398. <*$CopyArrays-*>
  399. BEGIN (* Batch *)
  400.   batchFile := Files.Old (batchName);
  401.   IF batchFile # NIL THEN
  402.     IF OCM.Verbose THEN ti.GetSysTime (t1) END;
  403.  
  404.     Files.Set (r, batchFile, 0);
  405.     LOOP
  406.       Files.Read (r, ch);
  407.       IF r.eof THEN EXIT END;
  408.       WHILE ch <= " " DO (* Skip whitespace *)
  409.         Files.Read (r, ch);
  410.         IF r.eof THEN EXIT END
  411.       END;
  412.       i := 0;
  413.       REPEAT
  414.         sourceName [i] := ch; INC (i); Files.Read (r, ch)
  415.       UNTIL r.eof OR (ch = "\n");
  416.       sourceName [i] := 0X;
  417.       Compile (sourceName);
  418.       IF r.eof THEN EXIT END;
  419.       Reset ()
  420.     END;
  421.     Files.Set (r, NIL, 0); Files.Close (batchFile); batchFile := NIL;
  422.  
  423.     IF OCM.Verbose THEN
  424.       ti.GetSysTime (t2);
  425.       OCM.OutStr0 (OCStrings.OC10);
  426.       ReportTime (t1, t2)
  427.     END;
  428.   ELSE
  429.     OCM.OutStr1 (OCStrings.OC11, batchName)
  430.   END
  431. END Batch;
  432.  
  433. (*------------------------------------*)
  434. PROCEDURE Main ();
  435.  
  436.   (*------------------------------------*)
  437.   PROCEDURE WbArgs ();
  438.  
  439.     VAR
  440.       wbStartup : wb.WBStartupPtr;
  441.       oldDir    : d.FileLockPtr;
  442.       diskObj   : wb.DiskObjectPtr;
  443.       toolTypes : wb.ToolTypePtr;
  444.       string    : e.LSTRPTR;
  445.       arg       : INTEGER;
  446.  
  447.   BEGIN (* WbArgs *)
  448.     ASSERT (i.base # NIL, 100);
  449.  
  450.     wbStartup := SYS.VAL (wb.WBStartupPtr, Kernel.WBenchMsg);
  451.  
  452.     (* Attempt to load the icon *)
  453.     startDir := d.CurrentDir (wbStartup.argList[0].lock);
  454.     diskObj := i.GetDiskObject (wbStartup.argList[0].name^);
  455.     IF diskObj # NIL THEN
  456.       toolTypes := diskObj.toolTypes;
  457.       string := i.FindToolType (toolTypes, "NEWSYMFILE");
  458.       IF string # NIL THEN args [optNS] := TRUE END;
  459.       string := i.FindToolType (toolTypes, "BATCH");
  460.       IF string # NIL THEN args [optBATCH] := TRUE END;
  461.       string := i.FindToolType (toolTypes, "SETTINGS");
  462.       IF string # NIL THEN args [optSETTINGS] := CloneStr (string) END;
  463.       string := i.FindToolType (toolTypes, "SEARCH");
  464.       IF string # NIL THEN args [optSEARCH] := CloneStr (string) END;
  465.       string := i.FindToolType (toolTypes, "SYMPATH");
  466.       IF string # NIL THEN args [optSYMPATH] := CloneStr (string) END;
  467.       string := i.FindToolType (toolTypes, "OBJPATH");
  468.       IF string # NIL THEN args [optOBJPATH] := CloneStr (string) END;
  469.       string := i.FindToolType (toolTypes, "ERRPATH");
  470.       IF string # NIL THEN args [optERRPATH] := CloneStr (string) END;
  471.       string := i.FindToolType (toolTypes, "SYMEXT");
  472.       IF string # NIL THEN args [optSYMEXT] := CloneStr (string) END;
  473.       string := i.FindToolType (toolTypes, "OBJEXT");
  474.       IF string # NIL THEN args [optOBJEXT] := CloneStr (string) END;
  475.       string := i.FindToolType (toolTypes, "ERREXT");
  476.       IF string # NIL THEN args [optERREXT] := CloneStr (string) END;
  477.       string := i.FindToolType (toolTypes, "VERBOSE");
  478.       IF string # NIL THEN args [optVERBOSE] := TRUE END;
  479.       string := i.FindToolType (toolTypes, "QUIET");
  480.       IF string # NIL THEN args [optQUIET] := TRUE END;
  481.       string := i.FindToolType (toolTypes, "DEBUG");
  482.       IF string # NIL THEN args [optDEBUG] := TRUE END;
  483.       string := i.FindToolType (toolTypes, "NODEBUG");
  484.       IF string # NIL THEN args [optNODEBUG] := TRUE END;
  485.       string := i.FindToolType (toolTypes, "MAKEICONS");
  486.       IF string # NIL THEN args [optMAKEICONS] := TRUE END;
  487.       string := i.FindToolType (toolTypes, "NOICONS");
  488.       IF string # NIL THEN args [optNOICONS] := TRUE END;
  489.       string := i.FindToolType (toolTypes, "SET");
  490.       IF string # NIL THEN args [optSET] := CloneStr (string) END;
  491.       string := i.FindToolType (toolTypes, "CLEAR");
  492.       IF string # NIL THEN args [optCLEAR] := CloneStr (string) END;
  493.  
  494.       string := i.FindToolType (toolTypes, "FORCE");
  495.       IF string # NIL THEN args [optFORCE] := TRUE END;
  496.       string := i.FindToolType (toolTypes, "TEXTERR");
  497.       IF string # NIL THEN args [optTEXTERR] := TRUE END;
  498.       string := i.FindToolType (toolTypes, "TRACE");
  499.       IF string # NIL THEN args [optTRACE] := TRUE END;
  500.  
  501.       i.FreeDiskObject (diskObj)
  502.     END;
  503.     ParseArgs();
  504.     IF wbStartup.numArgs = 1 THEN
  505.       IF d.IsInteractive (d.Input()) THEN Interactive()
  506.       ELSE Errors.Abort ("OC -- No source files specified")
  507.       END
  508.     ELSE
  509.       FOR arg := 1 TO (wbStartup.numArgs - 1) DO
  510.         oldDir := d.CurrentDir (wbStartup.argList [arg].lock);
  511.         IF batch THEN Batch (wbStartup.argList [arg].name^)
  512.         ELSE Compile (wbStartup.argList [arg].name^)
  513.         END;
  514.       END
  515.     END
  516.   END WbArgs;
  517.  
  518.   (*------------------------------------*)
  519.   PROCEDURE CliArgs ();
  520.     VAR ignore : BOOLEAN; i : INTEGER;
  521.   BEGIN (* CliArgs *)
  522.     IF d.OldReadArgs (template, args, rdArgs) = NIL THEN
  523.       ignore := d.PrintFault (d.IoErr(), "ReadArgs");
  524.       HALT (d.warn)
  525.     END;
  526.     ParseArgs();
  527.     IF files = NIL THEN
  528.       IF d.IsInteractive (d.Input()) THEN Interactive()
  529.       ELSE Errors.Abort ("OC -- No source files specified")
  530.       END
  531.     ELSE
  532.       i := 0;
  533.       WHILE files [i] # NIL DO
  534.         IF batch THEN Batch (files [i]^)
  535.         ELSE Compile (files [i]^)
  536.         END;
  537.         INC (i)
  538.       END;
  539.     END;
  540.   END CliArgs;
  541.  
  542. BEGIN (* Main *)
  543.   IF Kernel.fromWorkbench THEN WbArgs()
  544.   ELSE CliArgs()
  545.   END
  546. END Main;
  547.  
  548. <*$ClearVars+*>
  549. BEGIN (* OC *)
  550.   ASSERT (e.SysBase.libNode.version >= 37);
  551.   Errors.Init;
  552.  
  553.   OCM.OutStr (OCRev.vString);
  554.   OCM.OutStr (CopyrightStr);
  555.   OCM.OutStr0 (OCStrings.OC13);
  556.   OCM.OutLn;
  557.  
  558.   Init();
  559.   Main();
  560.  
  561.   IF returnError THEN HALT (d.error)
  562.   ELSIF returnWarn THEN HALT (d.warn)
  563.   END
  564. END OC.
  565.  
  566. (***************************************************************************
  567.  
  568.   $Log: OC.mod $
  569.   Revision 5.14  1995/01/26  00:17:17  fjc
  570.   - Release 1.5
  571.  
  572.   Revision 5.13  1995/01/16  10:38:22  fjc
  573.   - Fixed bug where an attempt was made to Lock (NIL,...),
  574.     causing an Enforcer hit.
  575.  
  576.   Revision 5.12  1995/01/09  14:03:26  fjc
  577.   - Changed console output depending on OCM.Verbose.
  578.   - Removed command line arguments for icon names.
  579.   - Implemented Workbench arguments.
  580.  
  581.   Revision 5.11  1995/01/05  11:43:08  fjc
  582.   - Changed Compiler.forceCode to OCM.Force.
  583.   - Added QUIET, NODEBUG and NOICONS arguments, and fixed
  584.     handling of VERBOSE, DEBUG and MAKEICONS.
  585.  
  586.   Revision 5.10  1995/01/03  21:31:56  fjc
  587.   - Changed OCG to OCM.
  588.   - Changed to use catalogs:
  589.     - Uses OCM for console I/O instead of Out.
  590.     - Gets text from OCStrings instead of hard-coding it.
  591.   - Added support for preferences:
  592.     - Added preferences settings to command-line template.
  593.     - Added SETTINGS argument to load settings from a file.
  594.  
  595.   Revision 5.8  1994/12/16  17:49:00  fjc
  596.   - Added command-line options to specify file extensions.
  597.  
  598.   Revision 5.7  1994/11/13  11:44:09  fjc
  599.   - Fixed formatting of elapsed time reports.
  600.  
  601.   Revision 5.6  1994/10/23  16:37:22  fjc
  602.   - Replaced StdIO with In and Out for console IO.
  603.  
  604.   Revision 5.5  1994/09/25  18:17:32  fjc
  605.   - Changed CPOINTER declaration.
  606.  
  607.   Revision 5.4  1994/09/19  23:10:05  fjc
  608.   - Re-implemented Amiga library calls
  609.  
  610.   Revision 5.3  1994/09/16  18:13:12  fjc
  611.   - Now uses ReadArgs() to process arguments.
  612.   - Added SET and CLEAR arguments.
  613.  
  614.   Revision 5.2  1994/09/15  10:46:34  fjc
  615.   - Replaced switches with pragmas.
  616.   - Used Kernel instead of SYSTEM.
  617.   - No longer uses IntuiUtil.
  618.  
  619.   Revision 5.1  1994/09/03  19:29:08  fjc
  620.   - Bumped version number
  621.  
  622. ***************************************************************************)
  623.