DEADSOFTWARE

cpmake: fix preprocessor selector handling
[cpc.git] / src / generic / Dsw / Mod / CompilerCPfrontMain.cp
index 672ca76000539e89f455d36274e56d4db660599b..1043752445d50c7e03409a631a72ea42eb61c16e 100644 (file)
@@ -1,16 +1,20 @@
 MODULE DswCompilerCPfrontMain;
 
   IMPORT Kernel, HostFiles, Files, Console, Strings, DswDocuments,
-    DevCPM, DevCPT, DevCPB, DevCPP, DevCPE, DevCPH, DevCPV := CPfrontCPV, DevCPG := CPfrontCPG;
+    DevCPM, DevCPT, DevCPB, DevCPP, DevCPE, DevCPH, DevCPV := CPfrontCPV, DevCPG := CPfrontCPG,
+    DevCPR;
 
   CONST
     (* compiler options: *)
     checks = 0; allchecks = 1; assert = 2; obj = 3; ref = 4; allref = 5;
     srcpos = 6; reallib = 7; signatures = 8;
+    (* pVarInd = 14; bigEnd = 15; *) ctime = 16;
     mainprog = 20; include0 = 21;
     hint = 29; oberon = 30; errorTrap = 31;
-    (* defopt = {checks, assert, obj, ref, allref, srcpos, signatures}; *)
-    defopt = {checks, assert, obj};
+    (* defopt = {checks, assert, obj, ref, allref, srcpos, signatures, ctime}; *)
+    defopt = {checks, assert, obj, ctime};
+
+    version = "0.3";
 
     emulong = 0;
     defopt2 = {};
@@ -25,8 +29,15 @@ MODULE DswCompilerCPfrontMain;
       next: Elem
     END;
 
+    Def = POINTER TO RECORD
+      name: DevCPT.Name;
+      val: BOOLEAN;
+      next: Def
+    END;
+
   VAR
     u: Elem;
+    d: Def;
 
   PROCEDURE GetPath (IN path: ARRAY OF CHAR; OUT dir, name: Files.Name);
     VAR i, j, len: INTEGER;
@@ -69,6 +80,12 @@ MODULE DswCompilerCPfrontMain;
       END
     END Check;
 
+    PROCEDURE Define (IN name: DevCPT.Name; val: BOOLEAN);
+      VAR def: Def;
+    BEGIN
+      NEW(def); def.name := name$; def.val := val; def.next := d; d := def
+    END Define;
+
   BEGIN
     outsym := ""; outcode := "";
     opts := defopt; opts2 := defopt2; found := FALSE;
@@ -137,6 +154,7 @@ MODULE DswCompilerCPfrontMain;
         ELSIF p = "-no-hints" THEN
           EXCL(opts, hint)
         ELSIF p = "-trap" THEN
+          Kernel.intTrap := TRUE;
           INCL(opts, errorTrap)
         ELSIF p = "-no-trap" THEN
           EXCL(opts, errorTrap)
@@ -166,6 +184,17 @@ MODULE DswCompilerCPfrontMain;
           INCL(opts2, emulong)
         ELSIF p = "-no-long-calls" THEN
           EXCL(opts2, emulong)
+        ELSIF p = "-version" THEN
+          Console.WriteStr(version); Console.WriteLn;
+          Kernel.Quit(0)
+        ELSIF p = "-use-time" THEN
+          INCL(opts, ctime)
+        ELSIF p = "-no-use-time" THEN
+          EXCL(opts, ctime)
+        ELSIF p = "-define+" THEN
+          Check; Define(Kernel.argv[i]$, TRUE); INC(i)
+        ELSIF p = "-define-" THEN
+          Check; Define(Kernel.argv[i]$, FALSE); INC(i)
         ELSE
           Console.WriteStr("unknown option ");
           Console.WriteStr(p); Console.WriteLn;
@@ -194,7 +223,7 @@ MODULE DswCompilerCPfrontMain;
   END InitOptions;
 
   PROCEDURE Module (source: POINTER TO ARRAY OF CHAR; m: Elem; OUT error: BOOLEAN);
-    VAR ext, new: BOOLEAN; p: DevCPT.Node;
+    VAR ext, new: BOOLEAN; p: DevCPT.Node; def: Def;
   BEGIN
     DevCPG.opt := {}; (* !!! *)
     DevCPM.Init(source);
@@ -210,11 +239,19 @@ MODULE DswCompilerCPfrontMain;
     IF oberon IN m.opts THEN INCL(DevCPM.options, DevCPM.oberon) END;
     IF mainprog IN m.opts THEN INCL(DevCPG.opt, DevCPG.mainprog) END;
     IF include0 IN m.opts THEN INCL(DevCPG.opt, DevCPG.include0) END;
+    IF ctime IN m.opts THEN INCL(DevCPG.opt, DevCPG.ctime) END;
     DevCPT.Init(m.opts);
     (* DevCPB.typSize := DevCPV.TypeSize; *)
     DevCPB.typSize := DevCPV.TypSize;
     DevCPT.processor := DevCPV.processor;
+    DevCPR.Init;
+    def := d;
+    WHILE def # NIL DO
+      DevCPR.Set(def.name, def.val);
+      def := def.next
+    END;
     DevCPP.Module(p);
+    DevCPR.Check;
     IF DevCPM.noerr THEN
       IF DevCPT.libName # "" THEN EXCL(m.opts, obj) END;
       DevCPV.Init(m.opts); DevCPV.AdrAndSize(DevCPT.topScope); DevCPT.Export(ext, new);
@@ -240,6 +277,7 @@ MODULE DswCompilerCPfrontMain;
     IF obj IN m.opts THEN
       DevCPG.CloseFiles
     END;
+    DevCPR.Close;
     DevCPT.Close;
     error := ~DevCPM.noerr;
     IF error THEN
@@ -261,44 +299,28 @@ MODULE DswCompilerCPfrontMain;
 
   PROCEDURE ReadText (s: Elem): POINTER TO ARRAY OF CHAR;
     VAR
-      i, len, res: INTEGER;
-      text: DswDocuments.Text;
-      loc: Files.Locator; f: Files.File; r: Files.Reader;
-      ssrc: POINTER TO ARRAY OF SHORTCHAR;
+      i, res: INTEGER;
+      m: DswDocuments.Model;
+      r: DswDocuments.Reader;
+      loc: Files.Locator;
       src: POINTER TO ARRAY OF CHAR;
-      x: POINTER TO ARRAY OF BYTE;
       num: ARRAY 32 OF CHAR;
   BEGIN
-    src := NIL;
     loc := Files.dir.This(s.dir);
-    DswDocuments.Import(loc, s.name, text, res);
-    Strings.IntToString(res, num);
-    IF res = 0 THEN
-      src := text.t
-    ELSIF res = 2 THEN
-      f := Files.dir.Old(loc, s.name, Files.shared);
-      IF f # NIL THEN
-        len := f.Length();
-        r := f.NewReader(NIL);
-        NEW(x, len + 1);
-        r.ReadBytes(x, 0, len);
-        NEW(ssrc, len + 1);
-        FOR i := 0 TO len - 1 DO
-          ssrc[i] := SHORT(CHR(x[i]))
-        END;
-        ssrc[i] := 0X;
-        x := NIL;
-        NEW(src, len + 1);
-        Kernel.Utf8ToString(ssrc, src, res);
-        ssrc := NIL;
-        f.Close
-      END
-    ELSE
-      IF DevCPM.verbose > 0 THEN
-        Console.WriteStr("document error ");
-        Console.WriteStr(num);
-        Console.WriteLn
+    DswDocuments.Open(loc, s.name, m, res);
+    IF m # NIL THEN
+      r := m.NewReader(NIL);
+      NEW(src, m.Length() + 1);
+      IF src # NIL THEN
+        FOR i := 0 TO m.Length() - 1 DO
+          r.Read; src[i] := r.char
+        END
       END
+    ELSIF DevCPM.verbose > 0 THEN
+      Strings.IntToString(res, num);
+      Console.WriteStr("document error ");
+      Console.WriteStr(num);
+      Console.WriteLn
     END;
     IF src = NIL THEN
       Console.WriteStr("unable to open file ");
@@ -334,5 +356,6 @@ MODULE DswCompilerCPfrontMain;
   END Init;
 
 BEGIN
+  Kernel.intTrap := FALSE;
   Kernel.Start(Init)
 END DswCompilerCPfrontMain.