|
|
@@ -320,12 +320,28 @@ MODULE -->Grammar;
|
|
|
uname, iname, gname: GName;
|
|
|
gpath: GPath;
|
|
|
isDef: BOOLEAN;
|
|
|
+ (* -I interface search + transitive .def resolution for M2 -c *)
|
|
|
+ incDirs: ARRAY [0 .. 15] OF ARRAY [0 .. 255] OF CHAR;
|
|
|
+ nIncDirs: CARDINAL;
|
|
|
+ scanMods: ARRAY [0 .. 127] OF GName;
|
|
|
+ nScanMods: CARDINAL;
|
|
|
+ sepNames: ARRAY [0 .. 127] OF GName;
|
|
|
+ sepPaths: ARRAY [0 .. 127] OF ARRAY [0 .. 255] OF CHAR;
|
|
|
+ sepState: ARRAY [0 .. 127] OF INTEGER;
|
|
|
+ sepOrder: ARRAY [0 .. 127] OF CARDINAL;
|
|
|
+ nSep, nSepOrder: CARDINAL;
|
|
|
+ scanBuf: ARRAY [0 .. 65535] OF CHAR;
|
|
|
+ scanPath, scanDir: ARRAY [0 .. 255] OF CHAR;
|
|
|
+ scanWantFrom, scanFromSeen, scanImporting: BOOLEAN;
|
|
|
|
|
|
PROCEDURE EqNm (a, b: ARRAY OF CHAR): BOOLEAN;
|
|
|
+ (* NUL comparison. Do not use HIGH on the right-hand string literal:
|
|
|
+ V3 literal descriptors use the literal length, so HIGH would stop
|
|
|
+ before the NUL terminator in a separately compiled compiler. *)
|
|
|
VAR i: CARDINAL;
|
|
|
BEGIN
|
|
|
i := 0;
|
|
|
- WHILE (i <= HIGH(a)) AND (i <= HIGH(b)) DO
|
|
|
+ WHILE i < 256 DO
|
|
|
IF a[i] # b[i] THEN RETURN FALSE END;
|
|
|
IF a[i] = CHR(0) THEN RETURN TRUE END;
|
|
|
INC(i)
|
|
|
@@ -339,7 +355,7 @@ MODULE -->Grammar;
|
|
|
VAR i: CARDINAL; ca, cb: CHAR;
|
|
|
BEGIN
|
|
|
i := 0;
|
|
|
- WHILE (i <= HIGH(a)) AND (i <= HIGH(b)) DO
|
|
|
+ WHILE i < 64 DO
|
|
|
ca := a[i]; cb := b[i];
|
|
|
IF (ca >= "A") AND (ca <= "Z") THEN ca := CHR(ORD(ca) + 32) END;
|
|
|
IF (cb >= "A") AND (cb <= "Z") THEN cb := CHR(ORD(cb) + 32) END;
|
|
|
@@ -350,6 +366,333 @@ MODULE -->Grammar;
|
|
|
RETURN FALSE
|
|
|
END EqNmCI;
|
|
|
|
|
|
+ PROCEDURE IsOpt (s, opt: ARRAY OF CHAR): BOOLEAN;
|
|
|
+ (* Option comparison without relying on HIGH of a string literal:
|
|
|
+ V3 string-literal descriptors use the literal length, while the
|
|
|
+ caller's fixed buffer is NUL-padded. *)
|
|
|
+ VAR i: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ i := 0;
|
|
|
+ WHILE i < 64 DO
|
|
|
+ IF s[i] # opt[i] THEN RETURN FALSE END;
|
|
|
+ IF s[i] = CHR(0) THEN RETURN TRUE END;
|
|
|
+ INC(i)
|
|
|
+ END;
|
|
|
+ RETURN FALSE
|
|
|
+ END IsOpt;
|
|
|
+
|
|
|
+ PROCEDURE CopySlice (src: ARRAY OF CHAR; start, count: CARDINAL;
|
|
|
+ VAR dst: ARRAY OF CHAR);
|
|
|
+ VAR i: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ i := 0;
|
|
|
+ WHILE (i < count) AND (start + i <= HIGH(src)) AND (i <= HIGH(dst)) DO
|
|
|
+ dst[i] := src[start + i]; INC(i)
|
|
|
+ END;
|
|
|
+ IF i <= HIGH(dst) THEN dst[i] := CHR(0) END
|
|
|
+ END CopySlice;
|
|
|
+
|
|
|
+ PROCEDURE StrCopy (src: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR);
|
|
|
+ VAR i: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ i := 0;
|
|
|
+ WHILE (i <= HIGH(src)) AND (i <= HIGH(dst)) AND (src[i] # CHR(0)) DO
|
|
|
+ dst[i] := src[i]; INC(i)
|
|
|
+ END;
|
|
|
+ IF i <= HIGH(dst) THEN dst[i] := CHR(0) END
|
|
|
+ END StrCopy;
|
|
|
+
|
|
|
+ PROCEDURE StrCat (a, b: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR);
|
|
|
+ VAR i, j: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ i := 0;
|
|
|
+ WHILE (i <= HIGH(a)) AND (i <= HIGH(dst)) AND (a[i] # CHR(0)) DO
|
|
|
+ dst[i] := a[i]; INC(i)
|
|
|
+ END;
|
|
|
+ j := 0;
|
|
|
+ WHILE (j <= HIGH(b)) AND (i <= HIGH(dst)) AND (b[j] # CHR(0)) DO
|
|
|
+ dst[i] := b[j]; INC(i); INC(j)
|
|
|
+ END;
|
|
|
+ IF i <= HIGH(dst) THEN dst[i] := CHR(0) END
|
|
|
+ END StrCat;
|
|
|
+
|
|
|
+ PROCEDURE LowerCopy (src: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR);
|
|
|
+ VAR i: CARDINAL; ch: CHAR;
|
|
|
+ BEGIN
|
|
|
+ i := 0;
|
|
|
+ WHILE (i <= HIGH(src)) AND (i <= HIGH(dst)) AND (src[i] # CHR(0)) DO
|
|
|
+ ch := src[i];
|
|
|
+ IF (ch >= "A") AND (ch <= "Z") THEN
|
|
|
+ ch := CHR(ORD(ch) + ORD("a") - ORD("A"))
|
|
|
+ END;
|
|
|
+ dst[i] := ch; INC(i)
|
|
|
+ END;
|
|
|
+ IF i <= HIGH(dst) THEN dst[i] := CHR(0) END
|
|
|
+ END LowerCopy;
|
|
|
+
|
|
|
+ PROCEDURE DirOfPath (path: ARRAY OF CHAR; VAR dir: ARRAY OF CHAR);
|
|
|
+ VAR i, k: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ dir[0] := CHR(0); k := 0; i := 0;
|
|
|
+ WHILE (i <= HIGH(path)) AND (path[i] # CHR(0)) DO
|
|
|
+ IF (path[i] = "/") OR (path[i] = CHR(92)) THEN k := i + 1 END;
|
|
|
+ INC(i)
|
|
|
+ END;
|
|
|
+ i := 0;
|
|
|
+ WHILE i < k DO dir[i] := path[i]; INC(i) END;
|
|
|
+ dir[i] := CHR(0)
|
|
|
+ END DirOfPath;
|
|
|
+
|
|
|
+ PROCEDURE TryDef (dir, name, ext: ARRAY OF CHAR;
|
|
|
+ VAR path: ARRAY OF CHAR): BOOLEAN;
|
|
|
+ VAR n: CARDINAL; i: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ path[0] := CHR(0);
|
|
|
+ n := 0;
|
|
|
+ i := 0;
|
|
|
+ WHILE (i <= HIGH(dir)) AND (dir[i] # CHR(0)) DO
|
|
|
+ IF n <= HIGH(path) THEN path[n] := dir[i] END;
|
|
|
+ INC(n); INC(i)
|
|
|
+ END;
|
|
|
+ IF (n > 0) AND (path[n - 1] # "/") THEN
|
|
|
+ IF n <= HIGH(path) THEN path[n] := "/" END;
|
|
|
+ INC(n)
|
|
|
+ END;
|
|
|
+ i := 0;
|
|
|
+ WHILE (i <= HIGH(name)) AND (name[i] # CHR(0)) DO
|
|
|
+ IF n <= HIGH(path) THEN path[n] := name[i] END;
|
|
|
+ INC(n); INC(i)
|
|
|
+ END;
|
|
|
+ i := 0;
|
|
|
+ WHILE (i <= HIGH(ext)) AND (ext[i] # CHR(0)) DO
|
|
|
+ IF n <= HIGH(path) THEN path[n] := ext[i] END;
|
|
|
+ INC(n); INC(i)
|
|
|
+ END;
|
|
|
+ IF n <= HIGH(path) THEN path[n] := CHR(0) END;
|
|
|
+ RETURN FileExists(path)
|
|
|
+ END TryDef;
|
|
|
+
|
|
|
+ PROCEDURE FindDef (name, targetDir: ARRAY OF CHAR;
|
|
|
+ VAR path: ARRAY OF CHAR): BOOLEAN;
|
|
|
+ VAR i: CARDINAL; low: GName; d: ARRAY [0 .. 255] OF CHAR;
|
|
|
+ BEGIN
|
|
|
+ path[0] := CHR(0);
|
|
|
+ LowerCopy(name, low);
|
|
|
+ (* -I directories take precedence; the target's own directory is a
|
|
|
+ fallback (important when a runtime and a host copy share a name). *)
|
|
|
+ i := 0;
|
|
|
+ WHILE i < nIncDirs DO
|
|
|
+ StrCopy(incDirs[i], d);
|
|
|
+ IF TryDef(d, name, ".def", path) THEN RETURN TRUE END;
|
|
|
+ IF TryDef(d, name, ".DEF", path) THEN RETURN TRUE END;
|
|
|
+ IF TryDef(d, low, ".def", path) THEN RETURN TRUE END;
|
|
|
+ IF TryDef(d, low, ".DEF", path) THEN RETURN TRUE END;
|
|
|
+ INC(i)
|
|
|
+ END;
|
|
|
+ IF TryDef(targetDir, name, ".def", path) THEN RETURN TRUE END;
|
|
|
+ IF TryDef(targetDir, name, ".DEF", path) THEN RETURN TRUE END;
|
|
|
+ IF TryDef(targetDir, low, ".def", path) THEN RETURN TRUE END;
|
|
|
+ IF TryDef(targetDir, low, ".DEF", path) THEN RETURN TRUE END;
|
|
|
+ RETURN FALSE
|
|
|
+ END FindDef;
|
|
|
+
|
|
|
+ PROCEDURE IsNameChar (ch: CHAR): BOOLEAN;
|
|
|
+ BEGIN
|
|
|
+ RETURN ((ch >= "A") AND (ch <= "Z"))
|
|
|
+ OR ((ch >= "a") AND (ch <= "z"))
|
|
|
+ OR ((ch >= "0") AND (ch <= "9"))
|
|
|
+ OR (ch = "_")
|
|
|
+ END IsNameChar;
|
|
|
+
|
|
|
+ PROCEDURE AddScanMod (name: ARRAY OF CHAR);
|
|
|
+ VAR i: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ i := 0;
|
|
|
+ WHILE i < nScanMods DO
|
|
|
+ IF EqNm(scanMods[i], name) THEN RETURN END;
|
|
|
+ INC(i)
|
|
|
+ END;
|
|
|
+ IF nScanMods <= HIGH(scanMods) THEN
|
|
|
+ StrCopy(name, scanMods[nScanMods]); INC(nScanMods)
|
|
|
+ END
|
|
|
+ END AddScanMod;
|
|
|
+
|
|
|
+ PROCEDURE HandleScanTok (tok: GName);
|
|
|
+ VAR wantFrom, fromSeen, importing: BOOLEAN;
|
|
|
+ BEGIN
|
|
|
+ (* These flags live in ScanFileImports's caller-visible globals. *)
|
|
|
+ IF EqNmCI(tok, "FROM") THEN
|
|
|
+ scanWantFrom := TRUE; scanFromSeen := FALSE; scanImporting := FALSE
|
|
|
+ ELSIF EqNmCI(tok, "IMPORT") THEN
|
|
|
+ IF scanFromSeen THEN scanImporting := FALSE
|
|
|
+ ELSE scanImporting := TRUE
|
|
|
+ END;
|
|
|
+ scanWantFrom := FALSE
|
|
|
+ ELSIF scanWantFrom THEN
|
|
|
+ AddScanMod(tok);
|
|
|
+ scanWantFrom := FALSE; scanFromSeen := TRUE
|
|
|
+ ELSIF scanImporting THEN
|
|
|
+ AddScanMod(tok)
|
|
|
+ END
|
|
|
+ END HandleScanTok;
|
|
|
+
|
|
|
+ PROCEDURE ScanFileImports (path: ARRAY OF CHAR);
|
|
|
+ VAR f: FileIO.File; nRead, i, start: CARDINAL;
|
|
|
+ ch, quote: CHAR; cmt: CARDINAL; tok: GName;
|
|
|
+ BEGIN
|
|
|
+ nScanMods := 0;
|
|
|
+ FileIO.Open(f, path, FALSE);
|
|
|
+ IF NOT FileIO.Okay THEN RETURN END;
|
|
|
+ nRead := HIGH(scanBuf) + 1;
|
|
|
+ FileIO.ReadBytes(f, scanBuf, nRead);
|
|
|
+ FileIO.Close(f);
|
|
|
+ cmt := 0; quote := CHR(0);
|
|
|
+ scanWantFrom := FALSE; scanFromSeen := FALSE; scanImporting := FALSE;
|
|
|
+ i := 0;
|
|
|
+ WHILE i < nRead DO
|
|
|
+ ch := scanBuf[i];
|
|
|
+ IF cmt > 0 THEN
|
|
|
+ IF (ch = "(") AND (i + 1 < nRead) AND (scanBuf[i + 1] = "*") THEN
|
|
|
+ INC(cmt); INC(i, 2)
|
|
|
+ ELSIF (ch = "*") AND (i + 1 < nRead) AND (scanBuf[i + 1] = ")") THEN
|
|
|
+ DEC(cmt); INC(i, 2)
|
|
|
+ ELSE INC(i)
|
|
|
+ END
|
|
|
+ ELSIF quote # CHR(0) THEN
|
|
|
+ IF ch = quote THEN
|
|
|
+ IF (i + 1 < nRead) AND (scanBuf[i + 1] = quote) THEN INC(i, 2)
|
|
|
+ ELSE quote := CHR(0); INC(i)
|
|
|
+ END
|
|
|
+ ELSE INC(i)
|
|
|
+ END
|
|
|
+ ELSIF (ch = "(") AND (i + 1 < nRead) AND (scanBuf[i + 1] = "*") THEN
|
|
|
+ cmt := 1; INC(i, 2)
|
|
|
+ ELSIF (ch = "/") AND (i + 1 < nRead) AND (scanBuf[i + 1] = "/") THEN
|
|
|
+ WHILE (i < nRead) AND (scanBuf[i] # CHR(10)) DO INC(i) END
|
|
|
+ ELSIF (ch = "'") OR (ch = '"') THEN
|
|
|
+ quote := ch; INC(i)
|
|
|
+ ELSIF (ch = ";") THEN
|
|
|
+ scanWantFrom := FALSE; scanFromSeen := FALSE; scanImporting := FALSE;
|
|
|
+ INC(i)
|
|
|
+ ELSIF IsNameChar(ch) THEN
|
|
|
+ start := i;
|
|
|
+ WHILE (i < nRead) AND IsNameChar(scanBuf[i]) DO INC(i) END;
|
|
|
+ IF i - start <= HIGH(tok) THEN
|
|
|
+ CopySlice(scanBuf, start, i - start, tok);
|
|
|
+ HandleScanTok(tok)
|
|
|
+ END
|
|
|
+ ELSE INC(i)
|
|
|
+ END
|
|
|
+ END
|
|
|
+ END ScanFileImports;
|
|
|
+
|
|
|
+ PROCEDURE FindSep (name: ARRAY OF CHAR): INTEGER;
|
|
|
+ VAR i: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ i := 0;
|
|
|
+ WHILE i < nSep DO
|
|
|
+ IF EqNm(sepNames[i], name) THEN RETURN VAL(INTEGER, i) END;
|
|
|
+ INC(i)
|
|
|
+ END;
|
|
|
+ RETURN -1
|
|
|
+ END FindSep;
|
|
|
+
|
|
|
+ PROCEDURE ResolveModule (name: ARRAY OF CHAR): BOOLEAN; FORWARD;
|
|
|
+
|
|
|
+ PROCEDURE AddDefPath (path, name: ARRAY OF CHAR): BOOLEAN;
|
|
|
+ VAR idx, j: INTEGER; pend: ARRAY [0 .. 127] OF GName; pn: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ idx := FindSep(name);
|
|
|
+ IF idx >= 0 THEN RETURN TRUE END;
|
|
|
+ IF nSep > HIGH(sepNames) THEN RETURN FALSE END;
|
|
|
+ idx := VAL(INTEGER, nSep);
|
|
|
+ StrCopy(name, sepNames[nSep]); StrCopy(path, sepPaths[nSep]);
|
|
|
+ sepState[nSep] := 1; INC(nSep);
|
|
|
+ ScanFileImports(path);
|
|
|
+ pn := nScanMods;
|
|
|
+ j := 0;
|
|
|
+ WHILE j < VAL(INTEGER, pn) DO
|
|
|
+ StrCopy(scanMods[j], pend[j]); INC(j)
|
|
|
+ END;
|
|
|
+ j := 0;
|
|
|
+ WHILE j < VAL(INTEGER, pn) DO
|
|
|
+ IF NOT ResolveModule(pend[j]) THEN END;
|
|
|
+ INC(j)
|
|
|
+ END;
|
|
|
+ sepState[VAL(CARDINAL, idx)] := 2;
|
|
|
+ IF nSepOrder <= HIGH(sepOrder) THEN
|
|
|
+ sepOrder[nSepOrder] := VAL(CARDINAL, idx); INC(nSepOrder)
|
|
|
+ END;
|
|
|
+ RETURN TRUE
|
|
|
+ END AddDefPath;
|
|
|
+
|
|
|
+ PROCEDURE ResolveModule (name: ARRAY OF CHAR): BOOLEAN;
|
|
|
+ VAR path: ARRAY [0 .. 255] OF CHAR; idx: INTEGER;
|
|
|
+ BEGIN
|
|
|
+ IF EqNm(name, "SYSTEM") OR EqNm(name, "libc") THEN RETURN TRUE END;
|
|
|
+ idx := FindSep(name);
|
|
|
+ IF idx >= 0 THEN RETURN TRUE END;
|
|
|
+ IF NOT FindDef(name, scanDir, path) THEN RETURN FALSE END;
|
|
|
+ RETURN AddDefPath(path, name)
|
|
|
+ END ResolveModule;
|
|
|
+
|
|
|
+ PROCEDURE ResolveFileImports (path: ARRAY OF CHAR);
|
|
|
+ VAR j: INTEGER; pend: ARRAY [0 .. 127] OF GName; pn: CARDINAL;
|
|
|
+ BEGIN
|
|
|
+ ScanFileImports(path);
|
|
|
+ pn := nScanMods;
|
|
|
+ j := 0;
|
|
|
+ WHILE j < VAL(INTEGER, pn) DO
|
|
|
+ StrCopy(scanMods[j], pend[j]); INC(j)
|
|
|
+ END;
|
|
|
+ j := 0;
|
|
|
+ WHILE j < VAL(INTEGER, pn) DO
|
|
|
+ IF NOT ResolveModule(pend[j]) THEN END;
|
|
|
+ INC(j)
|
|
|
+ END
|
|
|
+ END ResolveFileImports;
|
|
|
+
|
|
|
+ PROCEDURE AddIncDir (s: ARRAY OF CHAR);
|
|
|
+ VAR start, i: CARDINAL; d: ARRAY [0 .. 255] OF CHAR;
|
|
|
+ BEGIN
|
|
|
+ start := 0; i := 0;
|
|
|
+ LOOP
|
|
|
+ IF (i > HIGH(s)) OR (s[i] = CHR(0)) OR (s[i] = ":") THEN
|
|
|
+ IF i > start THEN
|
|
|
+ CopySlice(s, start, i - start, d);
|
|
|
+ IF nIncDirs <= HIGH(incDirs) THEN
|
|
|
+ StrCopy(d, incDirs[nIncDirs]); INC(nIncDirs)
|
|
|
+ END
|
|
|
+ END;
|
|
|
+ IF (i > HIGH(s)) OR (s[i] = CHR(0)) THEN EXIT END;
|
|
|
+ start := i + 1
|
|
|
+ END;
|
|
|
+ INC(i)
|
|
|
+ END
|
|
|
+ END AddIncDir;
|
|
|
+
|
|
|
+ PROCEDURE PrepareSeparate (target: ARRAY OF CHAR);
|
|
|
+ VAR j: CARDINAL; own: ARRAY [0 .. 255] OF CHAR; nm: GName;
|
|
|
+ BEGIN
|
|
|
+ nSep := 0; nSepOrder := 0;
|
|
|
+ DirOfPath(target, scanDir);
|
|
|
+ (* the target's own interface supplies exported globals/consts *)
|
|
|
+ ChangeExtension(target, ".def", own);
|
|
|
+ IF (NOT EqNm(target, own)) AND FileExists(own) THEN
|
|
|
+ BaseName(own, nm);
|
|
|
+ IF NOT AddDefPath(own, nm) THEN END
|
|
|
+ END;
|
|
|
+ ResolveFileImports(target);
|
|
|
+ IF nSepOrder + 1 <= HIGH(files) THEN
|
|
|
+ StrCopy(target, files[nSepOrder]);
|
|
|
+ j := 0;
|
|
|
+ WHILE j < nSepOrder DO
|
|
|
+ StrCopy(sepPaths[sepOrder[j]], files[j]); INC(j)
|
|
|
+ END;
|
|
|
+ nFiles := nSepOrder + 1
|
|
|
+ END
|
|
|
+ END PrepareSeparate;
|
|
|
+
|
|
|
PROCEDURE NoteGen (name: ARRAY OF CHAR; isD: BOOLEAN;
|
|
|
path: ARRAY OF CHAR);
|
|
|
VAR i: CARDINAL;
|
|
|
@@ -469,12 +812,20 @@ MODULE -->Grammar;
|
|
|
LOOP
|
|
|
FileIO.NextParameter(sourceName);
|
|
|
IF (sourceName[0] = CHR(0)) OR (nFiles > HIGH(files)) THEN EXIT END;
|
|
|
- IF EqNm(sourceName, "-notwophase") THEN
|
|
|
+ IF IsOpt(sourceName, "-notwophase") THEN
|
|
|
doTwoPhase := FALSE
|
|
|
- ELSIF EqNm(sourceName, "-legacyopen1d") THEN
|
|
|
+ ELSIF IsOpt(sourceName, "-legacyopen1d") THEN
|
|
|
Lower.SetLegacyOpen1D
|
|
|
- ELSIF EqNm(sourceName, "-c") THEN
|
|
|
+ ELSIF IsOpt(sourceName, "-c") THEN
|
|
|
separate := TRUE
|
|
|
+ ELSIF IsOpt(sourceName, "-I") THEN
|
|
|
+ FileIO.NextParameter(tmpCmd);
|
|
|
+ IF tmpCmd[0] = CHR(0) THEN
|
|
|
+ FileIO.WriteString(FileIO.StdOut, "-I expects a directory");
|
|
|
+ FileIO.WriteLn(FileIO.StdOut);
|
|
|
+ exit(2)
|
|
|
+ END;
|
|
|
+ AddIncDir(tmpCmd)
|
|
|
ELSE
|
|
|
Strings.Assign(sourceName, files[nFiles]);
|
|
|
INC(nFiles)
|
|
|
@@ -486,15 +837,10 @@ MODULE -->Grammar;
|
|
|
exit(2)
|
|
|
END;
|
|
|
|
|
|
- (* M2 -c Foo.mod: pick up Foo.def automatically when it exists;
|
|
|
- imported interfaces may still be supplied explicitly. *)
|
|
|
+ (* M2 -c Foo.mod: resolve Foo.def and its import interfaces through
|
|
|
+ -I directories. Explicit interface lists keep the old path. *)
|
|
|
IF separate AND (nFiles = 1) THEN
|
|
|
- ChangeExtension(files[0], ".def", tmpCmd);
|
|
|
- IF (NOT EqNm(files[0], tmpCmd)) AND FileExists(tmpCmd) THEN
|
|
|
- Strings.Assign(files[0], files[1]);
|
|
|
- Strings.Assign(tmpCmd, files[0]);
|
|
|
- nFiles := 2
|
|
|
- END
|
|
|
+ PrepareSeparate(files[0])
|
|
|
END;
|
|
|
BaseName(files[nFiles - 1], progName);
|
|
|
SymTab.Init;
|