|
|
@@ -31,8 +31,8 @@ TYPE
|
|
|
|
|
|
VAR
|
|
|
nMods: CARDINAL;
|
|
|
- (* Flat pools (V3 cannot pass nested-array elements as open-array
|
|
|
- actuals, nor double-index; all access is single-indexed here). *)
|
|
|
+ (* Flat 1D pools: every table is a single indexed array (a style
|
|
|
+ choice -- both compilers handle nested arrays now). *)
|
|
|
namePool: ARRAY [0..16383] OF CHAR;
|
|
|
srcPool: ARRAY [0..65535] OF CHAR;
|
|
|
defPool: ARRAY [0..65535] OF CHAR;
|
|
|
@@ -49,6 +49,7 @@ VAR
|
|
|
dryRun, verbose, useGm2: BOOLEAN;
|
|
|
outGiven: BOOLEAN;
|
|
|
mainPath, outName, m2bin, shimPath: Path;
|
|
|
+ extraC: Path; (* extra C file linked in m2 mode (may be empty) *)
|
|
|
nDirs: CARDINAL;
|
|
|
progName: Name;
|
|
|
wantProg: BOOLEAN;
|
|
|
@@ -64,19 +65,14 @@ VAR
|
|
|
(* ---------------- zeroed (NUL) string utilities ---------------- *)
|
|
|
|
|
|
PROCEDURE Len(s: ARRAY OF CHAR): CARDINAL;
|
|
|
-(* NUL scan that never reads past HIGH(s): V3 evaluates AND operands
|
|
|
- fully (no short-circuit) and traps out-of-range access, and string
|
|
|
- literals carry no NUL padding, so the scan must stop by index. *)
|
|
|
-VAR i, hi: CARDINAL;
|
|
|
+(* NUL scan. Both compilers short-circuit AND/OR now, so the index
|
|
|
+ guard protects the access; the bound is the string's HIGH + 1
|
|
|
+ (V3 sting literals carry no NUL padding, fixed buffers do). *)
|
|
|
+VAR i: CARDINAL;
|
|
|
BEGIN
|
|
|
- hi := HIGH(s);
|
|
|
i := 0;
|
|
|
- WHILE i < hi DO
|
|
|
- IF s[i] = CHR(0) THEN RETURN i END;
|
|
|
- INC(i)
|
|
|
- END;
|
|
|
- IF s[hi] = CHR(0) THEN RETURN hi END;
|
|
|
- RETURN hi + 1
|
|
|
+ WHILE (i <= HIGH(s)) AND (s[i] # CHR(0)) DO INC(i) END;
|
|
|
+ RETURN i
|
|
|
END Len;
|
|
|
|
|
|
PROCEDURE Zero(VAR s: ARRAY OF CHAR);
|
|
|
@@ -98,7 +94,7 @@ END Copy;
|
|
|
|
|
|
PROCEDURE Cmp(a, b: ARRAY OF CHAR): INTEGER;
|
|
|
(* Length-aware comparison: also correct when one side is a string
|
|
|
- literal (no NUL padding under V3). No AND-access in conditions. *)
|
|
|
+ literal (no NUL padding under V3). *)
|
|
|
VAR i, na, nb: CARDINAL;
|
|
|
BEGIN
|
|
|
na := Len(a);
|
|
|
@@ -116,56 +112,44 @@ BEGIN
|
|
|
END Cmp;
|
|
|
|
|
|
PROCEDURE Cat(a, b: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR);
|
|
|
-VAR i, k: CARDINAL; done: BOOLEAN;
|
|
|
+(* dst := a + b (NUL-terminated). Short-circuit AND keeps the index
|
|
|
+ guard ahead of every access. *)
|
|
|
+VAR i, k: CARDINAL;
|
|
|
BEGIN
|
|
|
Zero(dst);
|
|
|
- k := 0;
|
|
|
- i := 0;
|
|
|
- done := FALSE;
|
|
|
- WHILE (NOT done) AND (i <= HIGH(a)) AND (k <= HIGH(dst)) DO
|
|
|
- IF a[i] = CHR(0) THEN done := TRUE
|
|
|
- ELSE dst[k] := a[i]; INC(k); INC(i)
|
|
|
- END
|
|
|
+ k := 0; i := 0;
|
|
|
+ WHILE (i <= HIGH(a)) AND (k <= HIGH(dst)) AND (a[i] # CHR(0)) DO
|
|
|
+ dst[k] := a[i]; INC(k); INC(i)
|
|
|
END;
|
|
|
i := 0;
|
|
|
- done := FALSE;
|
|
|
- WHILE (NOT done) AND (i <= HIGH(b)) AND (k <= HIGH(dst)) DO
|
|
|
- IF b[i] = CHR(0) THEN done := TRUE
|
|
|
- ELSE dst[k] := b[i]; INC(k); INC(i)
|
|
|
- END
|
|
|
+ WHILE (i <= HIGH(b)) AND (k <= HIGH(dst)) AND (b[i] # CHR(0)) DO
|
|
|
+ dst[k] := b[i]; INC(k); INC(i)
|
|
|
END
|
|
|
END Cat;
|
|
|
|
|
|
PROCEDURE Sub(src: ARRAY OF CHAR; start, count: CARDINAL;
|
|
|
VAR dst: ARRAY OF CHAR);
|
|
|
-VAR j: CARDINAL; done: BOOLEAN;
|
|
|
+VAR j: CARDINAL;
|
|
|
BEGIN
|
|
|
Zero(dst);
|
|
|
j := 0;
|
|
|
- done := FALSE;
|
|
|
- WHILE (NOT done) AND (j < count) AND (start + j <= HIGH(src))
|
|
|
- AND (j <= HIGH(dst)) DO
|
|
|
- IF src[start + j] = CHR(0) THEN done := TRUE
|
|
|
- ELSE dst[j] := src[start + j]; INC(j)
|
|
|
- END
|
|
|
+ WHILE (j < count) AND (start + j <= HIGH(src)) AND (j <= HIGH(dst))
|
|
|
+ AND (src[start + j] # CHR(0)) DO
|
|
|
+ dst[j] := src[start + j]; INC(j)
|
|
|
END
|
|
|
END Sub;
|
|
|
|
|
|
PROCEDURE Lower(src: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR);
|
|
|
-VAR i: CARDINAL; ch: CHAR; done: BOOLEAN;
|
|
|
+VAR i: CARDINAL; ch: CHAR;
|
|
|
BEGIN
|
|
|
Zero(dst);
|
|
|
i := 0;
|
|
|
- done := FALSE;
|
|
|
- WHILE (NOT done) AND (i <= HIGH(src)) AND (i <= HIGH(dst)) DO
|
|
|
- IF src[i] = CHR(0) THEN done := TRUE
|
|
|
- ELSE
|
|
|
- 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
|
|
|
+ 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
|
|
|
END Lower;
|
|
|
|
|
|
@@ -297,7 +281,7 @@ END Die;
|
|
|
PROCEDURE Usage;
|
|
|
BEGIN
|
|
|
Out("Usage: M2make [-n] [-v] [-c m2|gm2] [-I dir] [-o out]"); OutLn;
|
|
|
- Out(" [--m2bin path] [--shim path] main.mod"); OutLn
|
|
|
+ Out(" [--m2bin path] [--shim path] [--extra path] main.mod"); OutLn
|
|
|
END Usage;
|
|
|
|
|
|
(* ---------------- module table ---------------- *)
|
|
|
@@ -823,6 +807,7 @@ BEGIN
|
|
|
AppendSeg(cmd, progName);
|
|
|
AppendSeg(cmd, ".s ");
|
|
|
AppendTok(cmd, shimPath);
|
|
|
+ IF Len(extraC) > 0 THEN AppendTok(cmd, extraC) END;
|
|
|
AppendSeg(cmd, " -o ");
|
|
|
AppendTok(cmd, out);
|
|
|
AppendSeg(cmd, " -lm");
|
|
|
@@ -1034,6 +1019,14 @@ BEGIN
|
|
|
END;
|
|
|
INC(na);
|
|
|
Copy(s, shimPath)
|
|
|
+ ELSIF Cmp(s, "--extra") = 0 THEN
|
|
|
+ ok := M2makeOS.GetArg(na, s, HIGH(s) + 1);
|
|
|
+ IF NOT ok THEN
|
|
|
+ Out("M2make: --extra expects a path"); OutLn;
|
|
|
+ M2makeOS.ExitNow(2)
|
|
|
+ END;
|
|
|
+ INC(na);
|
|
|
+ Copy(s, extraC)
|
|
|
ELSIF (Cmp(s, "-h") = 0) OR (Cmp(s, "--help") = 0) THEN
|
|
|
Usage;
|
|
|
M2makeOS.ExitNow(0)
|