home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 8
/
FreshFishVol8-CD2.bin
/
bbs
/
dev
/
oberon-a-1.4ß.lha
/
Oberon-A
/
source
/
oel
/
OEL.mod
< prev
next >
Wrap
Text File
|
1994-08-19
|
10KB
|
321 lines
(*
* $DESCRIPTION: Oberon-A Error Lister $
* $AUTHOR: Johan Ferreira $
*)
MODULE OEL;
(* $P- Portable code disabled *)
IMPORT SYSTEM, Exec, Dos, Locale, ErrorMessages, OELRev, Strings,
IO := BufIO, ANSI, Msg := OELMsg, Errors;
CONST numOfArgs = 10;
defModulePostfix = ".mod";
defErrPostfix = ".err";
defColWidth = 71;
defColSeperator = " ";
defTagLength = 1;
defTabSize = 8;
oaerIdSTR = "OAER";
eclipseSTR = "...";
programName = "OEL";
maxString = 256;
VAR E, R, W: Dos.FileHandlePtr;
errline, errcol, preverrline, errno: INTEGER;
modline, modcol: INTEGER;
tab: INTEGER;
eclipse, bool: BOOLEAN;
i, m, n: LONGINT;
strptr, errstrptr, prgname: Exec.STRPTR;
module, modulePostfix, errPostfix, colSeperator: Exec.STRPTR;
colWidth, tagLength, tabSize: LONGINT;
lineNumbers, errNumbers(*, ansi*): BOOLEAN;
argarray: ARRAY numOfArgs OF SYSTEM.LONGWORD;
argresult: Dos.RDArgsPtr;
PROCEDURE PrintFault ();
BEGIN
IF Dos.base.PrintFault (Dos.base.IoErr (), prgname^) THEN END
END PrintFault;
PROCEDURE WriteLineNumber ();
BEGIN
IF lineNumbers THEN
ANSI.BoldfaceText (W, FALSE, TRUE);
IO.WriteF1 (W, "%-4ld", LONG (modline));
ANSI.PlainText (W);
IO.WriteStr (W, colSeperator^)
END
END WriteLineNumber;
PROCEDURE WriteLine ();
BEGIN
WriteLineNumber ();
LOOP IF (strptr^[i] # 00X) & (strptr^[i] # 0AX) THEN
IF strptr^[i] = 09X THEN
n := tabSize - (modcol MOD tabSize);
WHILE n > 0 DO
IF ((modcol+1) MOD colWidth # 0) THEN
IO.Write (W, " ");
INC (modcol); DEC (n)
ELSE INC (modcol, SHORT (n)); n := 0;
INC (i); EXIT
END;
END
ELSE
IO.Write (W, strptr^[i]);
INC (modcol);
END;
INC (i)
END;
IF (strptr^[i] = 00X) OR (strptr^[i] = 0AX) THEN
modcol := MAX (INTEGER);
i := MAX (INTEGER);
EXIT
ELSIF (modcol MOD colWidth = 0) THEN
EXIT
END
END;
IO.WriteLn (W)
END WriteLine;
PROCEDURE WriteError ();
BEGIN
IF lineNumbers THEN IO.WriteStr (W, " ") END;
m := ((errcol-1) MOD colWidth) + SYSTEM.STRLEN (colSeperator^);
WHILE m > 0 DO
IO.Write (W, " "); DEC (m)
END;
IO.Write (W, "^"); IO.WriteLn (W);
ANSI.ItalicText (W, TRUE);
IF errNumbers THEN IO.WriteF1 (W, "%ld: ", LONG (errno)) END;
(* Internal errors *)
IF (950 < errno) & (errno < 1000) THEN
errstrptr := ErrorMessages.GetString (ErrorMessages.msgErr950);
IO.WriteStr (W, errstrptr^)
ELSIF (1000 < errno) & (errno < 1050) THEN
errstrptr := ErrorMessages.GetString (ErrorMessages.msgErr1000);
IO.WriteStr (W, errstrptr^)
END;
errstrptr := ErrorMessages.GetString (errno + 1);
IO.WriteStr (W, errstrptr^);
IO.WriteLn (W);
ANSI.PlainText (W)
END WriteError;
PROCEDURE ReadLine (output: BOOLEAN);
BEGIN
WHILE output & (i # MAX (INTEGER)) DO
WriteLine ()
END;
IF Dos.base.FGets (R, strptr^, maxString) = NIL THEN
modline := MAX (INTEGER);
modcol := MAX (INTEGER)
ELSE
i := 0;
INC (modline);
modcol := 0
END
END ReadLine;
PROCEDURE WriteCopyright ();
BEGIN
strptr := Msg.GetString (Msg.msgCopyright);
IO.WriteF1 (NIL, strptr^, SYSTEM.ADR (OELRev.vers))
END WriteCopyright;
PROCEDURE ParseArgs ();
TYPE LongPtr = CPOINTER TO LONGINT;
VAR lp: LongPtr;
PROCEDURE ArgError ();
BEGIN
strptr := Msg.GetString (Msg.msgArgError);
IO.WriteF1 (NIL, strptr^, prgname);
HALT (Dos.returnError)
END ArgError;
BEGIN
FOR n := 0 TO numOfArgs-1 DO argarray[n] := SYSTEM.VAL (SYSTEM.LONGWORD, 0) END;
argarray[1] := SYSTEM.ADR (defModulePostfix);
argarray[2] := SYSTEM.ADR (defErrPostfix);
argarray[4] := SYSTEM.ADR (defColSeperator);
strptr := Msg.GetString (Msg.msgTemplate);
argresult := Dos.base.ReadArgs (strptr^, argarray, NIL);
IF argresult = NIL THEN
PrintFault ();
HALT (Dos.returnError)
END;
module := SYSTEM.VAL (Exec.STRPTR, argarray[0]);
modulePostfix := SYSTEM.VAL (Exec.STRPTR, argarray[1]);
errPostfix := SYSTEM.VAL (Exec.STRPTR, argarray[2]);
lp := SYSTEM.VAL (LongPtr, argarray[3]);
IF lp = NIL THEN colWidth := defColWidth ELSE colWidth := lp^ END;
colSeperator := SYSTEM.VAL (Exec.STRPTR, argarray[4]);
lineNumbers := (SYSTEM.VAL (LONGINT, argarray[5]) = 0);
errNumbers := ~(SYSTEM.VAL (LONGINT, argarray[6]) = 0);
ANSI.ansi := (SYSTEM.VAL (LONGINT, argarray[7]) = 0);
lp := SYSTEM.VAL (LongPtr, argarray[8]);
IF lp = NIL THEN tagLength := defTagLength ELSE tagLength := lp^ END;
IF tagLength < 0 THEN ArgError () END;
lp := SYSTEM.VAL (LongPtr, argarray[9]);
IF lp = NIL THEN tabSize := defTabSize ELSE tabSize := lp^ END;
IF tabSize <= 0 THEN ArgError () END;
END ParseArgs;
PROCEDURE Init ();
VAR tag : ARRAY 5 OF CHAR;
PROCEDURE NotErrorFile;
VAR msgstrptr: Exec.STRPTR;
BEGIN
msgstrptr := Msg.GetString (Msg.msgNotAnErrorFile);
IO.WriteF2 (NIL, msgstrptr^, prgname, strptr);
HALT (Dos.returnFail)
END NotErrorFile;
BEGIN
NEW (strptr, maxString);
NEW (errstrptr, maxString);
NEW (prgname, 32);
Locale.OpenLib (FALSE); (* Don't _need_ to open locale *)
Msg.OpenCatalog (NIL, "");
ErrorMessages.OpenCatalog (NIL, "");
IF ~ Dos.base.GetProgramName (prgname^, 30) THEN prgname := SYSTEM.ADR (programName) END;
ParseArgs ();
strptr^ := "";
Strings.Append (strptr^, module^); Strings.Append (strptr^, errPostfix^);
E := Dos.base.Open (strptr^, Dos.modeOldFile);
IF E # NIL THEN
IF Dos.base.Read (E, tag, 4) = 4 THEN
tag [4] := 0X; (* NUL-terminate the string *)
IF tag # oaerIdSTR THEN NotErrorFile() END
ELSE NotErrorFile()
END;
END;
IF E = NIL THEN
PrintFault ();
HALT (Dos.returnWarn)
END;
strptr^ := "";
Strings.Append (strptr^, module^); Strings.Append (strptr^, modulePostfix^);
R := Dos.base.Open (strptr^, Dos.modeOldFile);
IF R = NIL THEN
PrintFault ();
HALT (Dos.returnFail)
END;
W := Dos.base.Output ();
modline := 0; modcol := 0;
errline := 0; errcol := 0;
i := MAX (INTEGER)
END Init;
PROCEDURE *Close ();
BEGIN
ErrorMessages.CloseCatalog ();
Dos.base.FreeArgs (argresult);
IF W = Dos.base.Output () THEN
IF Dos.base.Flush (W) THEN (* Error *) END
ELSE IF W # NIL THEN
IF Dos.base.Close (W) THEN (* Error *) END
END
END;
IF R # NIL THEN
IF Dos.base.Close (R) THEN (* Error *) END
END;
IF E # NIL THEN
IF Dos.base.Close (E) THEN (* Error *) END