IMPLEMENTATION MODULE CodeGen; IMPORT FileIO; VAR out : FileIO.File; level : INTEGER; opened : BOOLEAN; PROCEDURE Append (VAR dest: ARRAY OF CHAR; src: ARRAY OF CHAR); VAR i, j : CARDINAL; BEGIN i := 0; WHILE dest[i] # 0C DO INC(i) END; j := 0; WHILE (i < HIGH(dest)) & (src[j] # 0C) DO dest[i] := src[j]; INC(i); INC(j) END; dest[i] := 0C END Append; PROCEDURE OpenModule (name: ARRAY OF CHAR); VAR fname : ARRAY [0 .. 127] OF CHAR; BEGIN fname[0] := 0C; Append(fname, "gen/"); Append(fname, name); Append(fname, ".mod"); FileIO.Open(out, fname, TRUE); opened := FileIO.Okay; level := 0; IF opened THEN FileIO.WriteString(out, "(* Generated by SimpleM backend *)"); FileIO.WriteLn(out) END END OpenModule; PROCEDURE Close; BEGIN IF opened THEN FileIO.Close(out); opened := FALSE END END Close; PROCEDURE Emit (s: ARRAY OF CHAR); BEGIN IF opened THEN FileIO.WriteString(out, s) END END Emit; PROCEDURE Brk; VAR i : INTEGER; BEGIN IF ~opened THEN RETURN END; FileIO.WriteLn(out); i := 0; WHILE i < level * 2 DO FileIO.Write(out, " "); INC(i) END END Brk; PROCEDURE Ind; BEGIN INC(level) END Ind; PROCEDURE Ded; BEGIN IF level > 0 THEN DEC(level) END END Ded; BEGIN opened := FALSE; level := 0 END CodeGen.