1 MODULE DswCompiler486Main;
3 IMPORT Kernel, HostFiles, Files, Console, Strings, DswDocuments,
4 DevCPM, DevCPT, DevCPB, DevCPP, DevCPE, DevCPV := DevCPV486, DevCPS,
8 (* compiler options: *)
9 checks = 0; allchecks = 1; assert = 2; obj = 3; ref = 4; allref = 5;
10 srcpos = 6; reallib = 7; signatures = 8;
11 (* pVarInd = 14; bigEnd = 15; *) ctime = 16;
12 mainprog = 20; include0 = 21;
13 hint = 29; oberon = 30; errorTrap = 31;
14 defopt = {checks, assert, obj, ref, allref, srcpos, signatures, ctime};
22 Elem = POINTER TO RECORD
23 dir, name, path: Files.Name;
24 outsym, outcode: Files.Name; (* dir *)
25 insym: DevCPM.Directory;
26 found: BOOLEAN; (* COM Aware *)
34 PROCEDURE GetPath (IN path: ARRAY OF CHAR; OUT dir, name: Files.Name);
35 VAR i, j, len: INTEGER;
39 WHILE (i >= 0) & (path[i] # '/') DO DEC(i) END;
41 FOR i := 0 TO i - 1 DO
56 PROCEDURE InitOptions;
60 insym, sym: DevCPM.Directory;
61 outsym, outcode: Files.Name;
68 IF i >= Kernel.argc THEN
69 Console.WriteStr("required more parameters for ");
70 Console.WriteStr(p); Console.WriteLn;
76 outsym := ""; outcode := "";
77 opts := defopt; opts2 := defopt2; found := FALSE;
78 h := NIL; t := NIL; insym := NIL;
80 WHILE i < Kernel.argc DO
81 IF Kernel.argv[i, 0] = "-" THEN
86 ELSIF p = "-outsym" THEN
88 outsym := Kernel.argv[i]$;
90 ELSIF p = "-outcode" THEN
92 outcode := Kernel.argv[i]$;
94 ELSIF p = "-symdir" THEN
98 insym.path := Kernel.argv[i]$;
99 insym.legacy := FALSE;
102 ELSIF p = "-legacysymdir" THEN
106 insym.path := Kernel.argv[i]$;
107 insym.legacy := TRUE;
110 ELSIF p = "-allchecks" THEN
111 INCL(opts, allchecks)
112 ELSIF p = "-no-allchecks" THEN
113 EXCL(opts, allchecks)
114 ELSIF p = "-srcpos" THEN
116 ELSIF p = "-no-srcpos" THEN
118 ELSIF p = "-structref" THEN
120 ELSIF p = "-no-structref" THEN
122 ELSIF p = "-ref" THEN
124 ELSIF p = "-no-ref" THEN
126 ELSIF p = "-obj" THEN
128 ELSIF p = "-no-obj" THEN
130 ELSIF p = "-assert" THEN
132 ELSIF p = "-no-assert" THEN
134 ELSIF p = "-checks" THEN
136 ELSIF p = "-no-checks" THEN
138 ELSIF p = "-hints" THEN
140 ELSIF p = "-no-hints" THEN
142 ELSIF p = "-trap" THEN
143 Kernel.intTrap := TRUE;
144 INCL(opts, errorTrap)
145 ELSIF p = "-no-trap" THEN
146 EXCL(opts, errorTrap)
147 ELSIF p = "-oberon" THEN
149 ELSIF p = "-no-oberon" THEN
151 ELSIF p = "-com-aware" THEN
153 ELSIF p = "-no-com-aware" THEN
155 ELSIF (p = "-v") OR (p = "-verbose") THEN
156 DevCPM.verbose := MIN(DevCPM.verbose + 1, 3);
157 ELSIF p = "-main" THEN
159 ELSIF p = "-no-main" THEN
161 ELSIF p = "-include0" THEN
163 ELSIF p = "-no-include0" THEN
165 ELSIF p = "-includedir" THEN
169 ELSIF p = "-long-calls" THEN
171 ELSIF p = "-no-long-calls" THEN
173 ELSIF p = "-version" THEN
174 Console.WriteStr(version); Console.WriteLn;
176 ELSIF p = "-use-time" THEN
178 ELSIF p = "-no-use-time" THEN
181 Console.WriteStr("unknown option ");
182 Console.WriteStr(p); Console.WriteLn;
186 IF h = NIL THEN NEW(h); t := h
187 ELSE NEW(t.next); t := t.next
189 t.path := Kernel.argv[i]$;
190 t.outcode := outcode;
196 GetPath(t.path, t.dir, t.name);
198 Console.WriteStr("specified path to directory"); Console.WriteLn;
207 PROCEDURE Module (source: POINTER TO ARRAY OF CHAR; m: Elem; OUT error: BOOLEAN);
208 VAR ext, new: BOOLEAN; p: DevCPT.Node;
211 DevCPM.symList := m.insym;
212 DevCPM.codePath := m.outcode;
213 DevCPM.symPath := m.outsym;
214 DevCPM.name := m.path;
215 IF m.found THEN INCL(DevCPM.options, DevCPM.comAware) END;
216 IF errorTrap IN m.opts THEN INCL(DevCPM.options, DevCPM.trap) END;
217 IF oberon IN m.opts THEN INCL(DevCPM.options, DevCPM.oberon) END;
219 DevCPB.typSize := DevCPV.TypeSize;
220 DevCPT.processor := DevCPV.processor;
223 IF DevCPT.libName # "" THEN EXCL(m.opts, obj) END;
224 DevCPV.Init(m.opts); DevCPV.Allocate; DevCPT.Export(ext, new);
225 IF DevCPM.noerr & (obj IN m.opts) THEN
226 IF emulong IN m.opts2 THEN
227 DevCPH.UseCalls(p, {DevCPH.longMop, DevCPH.longDop})
233 IF DevCPM.noerr & (new OR ext) THEN DevCPM.RegisterNewSym
234 ELSE DevCPM.DeleteNewSym
237 error := ~DevCPM.noerr;
240 IF DevCPM.verbose > 0 THEN DevCPM.LogWStr(" ") END;
241 IF DevCPM.errors = 1 THEN
242 DevCPM.LogWStr("one error detected")
244 DevCPM.LogWNum(DevCPM.errors, 0); DevCPM.LogWStr(" errors detected")
248 IF hint IN m.opts THEN DevCPM.InsertMarks END
255 PROCEDURE ReadText (s: Elem): POINTER TO ARRAY OF CHAR;
257 i, len, res: INTEGER;
258 text: DswDocuments.Text;
259 loc: Files.Locator; f: Files.File; r: Files.Reader;
260 ssrc: POINTER TO ARRAY OF SHORTCHAR;
261 src: POINTER TO ARRAY OF CHAR;
262 x: POINTER TO ARRAY OF BYTE;
263 num: ARRAY 32 OF CHAR;
266 loc := Files.dir.This(s.dir);
267 DswDocuments.Import(loc, s.name, text, res);
268 Strings.IntToString(res, num);
272 f := Files.dir.Old(loc, s.name, Files.shared);
275 r := f.NewReader(NIL);
277 r.ReadBytes(x, 0, len);
279 FOR i := 0 TO len - 1 DO
280 ssrc[i] := SHORT(CHR(x[i]))
285 Kernel.Utf8ToString(ssrc, src, res);
290 IF DevCPM.verbose > 0 THEN
291 Console.WriteStr("document error ");
292 Console.WriteStr(num);
297 Console.WriteStr("unable to open file ");
298 Console.WriteStr(s.path);
305 PROCEDURE CompileAll;
306 VAR loc: Files.Locator; m: Elem; error: BOOLEAN; src: POINTER TO ARRAY OF CHAR;
310 IF DevCPM.verbose > 0 THEN
311 Console.WriteStr("compiling "); Console.WriteStr(m.path); Console.WriteLn
314 Module(src, m, error);
315 IF error THEN Kernel.Quit(1) END;
322 IF Kernel.trapCount # 0 THEN Kernel.Quit(1) END;
323 HostFiles.SetRootDir(".");
330 Kernel.intTrap := FALSE;
332 END DswCompiler486Main.