home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
dev
/
obero
/
oberon-a
/
source
/
obumprev
/
obumprev.mod
< prev
next >
Wrap
Text File
|
1994-08-15
|
8KB
|
323 lines
(*
* $DESCRIPTION: Bumps Oberon-A module revisions $
* $AUTHOR: Johan Ferreira $
*)
MODULE OBumpRev;
(* $P- Portable code disabled *)
IMPORT SYSTEM, Exec, Dos, Timer, Utility, IO := BufIO, Strings, OBumpRevRev, Msg := OBumpRevMsg;
CONST moduleOpt = 0;
versionOpt = 1;
revisionOpt = 2;
logExtOpt = 3;
revModExtOpt = 4;
modExtOpt = 5;
noLogOpt = 6;
numOfArgs = 7;
defLogExt = ".revlog";
defRevModExt = "Rev.mod";
defModExt = ".mod";
programName = "OBumpRev";
TYPE LongIntPtr = CPOINTER TO LONGINT;
VAR modrevfh, logfh, modfh: Dos.FileHandlePtr;
author, logname, module, logext, modrevext, modext: Exec.STRPTR;
day, month, year: LONGINT;
version, revision: LONGINT;
argarray: ARRAY numOfArgs OF SYSTEM.LONGWORD;
argresult: Dos.RDArgsPtr;
prgname: Exec.STRPTR;
cleanup: PROCEDURE (rc: LONGINT);
bool, modrevexists, nolog: BOOLEAN;
ch: CHAR;
li: LONGINT;
liptr: LongIntPtr;
strptr: Exec.STRPTR;
PROCEDURE ReadLongInt* (fh: Dos.FileHandlePtr; VAR x: LONGINT): BOOLEAN;
VAR ch: CHAR;
d: LONGINT;
neg: BOOLEAN;
BEGIN
x := 0; IO.Read (fh, ch);
neg := FALSE;
IF ch = "-" THEN neg := TRUE; IO.Read (fh, ch) END;
LOOP
CASE ch OF
0X, ";": IF neg THEN x := -x END; RETURN TRUE
| "0".."9":
d := ORD (ch) - ORD ("0");
IF (MAX (LONGINT) - d) DIV 10 >= x THEN x := 10*x+d ELSE EXIT END
ELSE EXIT
END;
IO.Read (fh, ch);
END;
RETURN FALSE;
END ReadLongInt;
PROCEDURE PrintFault (msg: LONGINT);
BEGIN
strptr := Msg.GetString (msg);
IF msg = 0 THEN
IF Dos.base.PrintFault (Dos.base.IoErr (), prgname^) THEN END
ELSE
IO.WriteF1 (NIL, strptr^, prgname)
END
END PrintFault;
PROCEDURE OpenFile (VAR fh: Dos.FileHandlePtr; mode: LONGINT; name, extension: Exec.STRPTR);
VAR filename: Exec.STRPTR;
BEGIN
NEW (filename, 32);
COPY (name^, filename^); Strings.Append (filename^, extension^);
fh := Dos.base.Open (filename^, mode)
END OpenFile;
PROCEDURE CloseFile (VAR fh: Dos.FileHandlePtr; halt: BOOLEAN);
BEGIN
IF fh # NIL THEN
IF ~ Dos.base.Close (fh) THEN
fh := NIL;
PrintFault (Msg.msgCouldNotClose);
IF halt THEN HALT (Dos.returnError) END
END;
fh := NIL
END;
END CloseFile;
PROCEDURE WriteRevMod ();
BEGIN
OpenFile (modrevfh, Dos.modeNewFile, module, modrevext);
IF modrevfh = NIL THEN
PrintFault (Msg.msgCouldNotCreateModRev);
HALT (Dos.returnFail)
ELSE
IF ~ modrevexists THEN
strptr := Msg.GetString (Msg.msgCreated);
IO.WriteF3 (NIL, strptr^, prgname, module, modrevext)
END
END;
strptr := Msg.GetString (Msg.msgRevModContents);
IF Dos.base.FPrintf (modrevfh, strptr^,
SYSTEM.ADR (OBumpRevRev.vers),
module,
version,
revision,
day,month,year,
module,version,revision,
module,version,revision,day,month,year,
module,version,revision,day,month,year,
module) = -1 THEN
PrintFault (Msg.msgCouldNotWriteModRev);
HALT (Dos.returnFail)
END;
CloseFile (modrevfh, TRUE)
END WriteRevMod;
PROCEDURE WriteLog();
VAR modsize: LONGINT;
BEGIN
(* Open log file *)
OpenFile (logfh, Dos.modeReadWrite, module, logext);
IF logfh = NIL THEN
OpenFile (logfh, Dos.modeNewFile, module, logext);
IF logfh = NIL THEN
strptr := Msg.GetString (Msg.msgCouldNotCreate);
IO.WriteF3 (NIL, strptr^, prgname, module, logext)
ELSE
strptr := Msg.GetString (Msg.msgCreated);
IO.WriteF3 (NIL, strptr^, prgname, module, logext)
END
END;
(* Write log *)
IF logfh # NIL THEN
(* Get #?.mod size *)
OpenFile (modfh, Dos.modeOldFile, module, modext);
IF modfh # NIL THEN
modsize := Dos.base.Seek (modfh, 0, Dos.offsetEnd);
modsize := Dos.base.Seek (modfh, 0, Dos.offsetEnd);
CloseFile (modfh, TRUE)
ELSE
modsize := 0
END;
strptr := Msg.GetString (Msg.msgAuthor);
IF Dos.base.GetVar (strptr^, author^, 30, {}) = -1 THEN author := SYSTEM.ADR ("") END;
li := Dos.base.Seek (logfh, 0, Dos.offsetEnd); (* Append *)
strptr := Msg.GetString (Msg.msgLog);
IF Dos.base.FPrintf (logfh, strptr^,
module, version, revision, day, month, year, modsize, author) = -1 THEN
PrintFault (Msg.msgCouldNotWriteLog);
HALT (Dos.returnFail)
END
END;
CloseFile (logfh, TRUE)
END WriteLog;
PROCEDURE GetVersRev ();
BEGIN
OpenFile (modrevfh, Dos.modeOldFile, module, modrevext);
modrevexists := modrevfh # NIL;
(* Version *)
IF SYSTEM.VAL (LongIntPtr, argarray[versionOpt]) # NIL THEN
liptr := SYSTEM.VAL (LongIntPtr, argarray[versionOpt]);
version := liptr^
ELSE
IF modrevexists THEN
REPEAT IO.Read (modrevfh, ch)
UNTIL ch = "="; IO.Read (modrevfh, ch);
IF ~ ReadLongInt (modrevfh, version) THEN
version := 0
END
ELSE version := 0
END
END;
(* Revision *)
IF SYSTEM.VAL (LongIntPtr, argarray[revisionOpt]) # NIL THEN
liptr := SYSTEM.VAL (LongIntPtr, argarray[revisionOpt]);
revision := liptr^
ELSE
IF modrevexists THEN
REPEAT IO.Read (modrevfh, ch)
UNTIL ch = "="; IO.Read (modrevfh, ch);
IF ~ ReadLongInt (modrevfh, revision) THEN
revision := 0
END
ELSE revision := 0
END;
INC (revision) (* Bump revision *)
END;
CloseFile (modrevfh, TRUE)
END GetVersRev;
PROCEDURE GetDate;
VAR
timeReqPtr: Timer.TimeRequestPtr;
sysTime: Timer.TimeVal;
success: BOOLEAN;
clockData: Utility.ClockData;
timerBase: Timer.TimerBasePtr;
BEGIN
success := FALSE;
NEW (timeReqPtr);
IF timeReqPtr # NIL THEN
IF Exec.base.OpenDevice (Timer.name, Timer.unitVBlank, timeReqPtr, {}) = 0 THEN
timerBase := SYSTEM.VAL (Timer.TimerBasePtr, timeReqPtr.device);
timerBase.GetSysTime (sysTime);
Exec.base.CloseDevice (timeReqPtr);
success := TRUE
END
END;
IF ~success THEN
HALT (20)
END;
Utility.base.Amiga2Date (sysTime.secs, clockData);
day := clockData.mday;
month := clockData.month;
year := clockData.year MOD 100 (* only two digits for the year :-( *)
END GetDate;
PROCEDURE ParseArgs ();
BEGIN
FOR li := 0 TO numOfArgs-1 DO
argarray[li] := NIL
END;
argarray[logExtOpt] := SYSTEM.ADR (defLogExt);
argarray[revModExtOpt] := SYSTEM.ADR (defRevModExt);
argarray[modExtOpt] := SYSTEM.ADR (defModExt);
strptr := Msg.GetString (Msg.msgTemplate);
argresult := Dos.base.ReadArgs (strptr^, argarray, NIL);
IF argresult = NIL THEN
PrintFault (0);
HALT (Dos.returnFail)
END;
module := SYSTEM.VAL (Exec.STRPTR, argarray[moduleOpt]);
logext := SYSTEM.VAL (Exec.STRPTR, argarray[logExtOpt]);
modrevext := SYSTEM.VAL (Exec.STRPTR, argarray[revModExtOpt]);
modext := SYSTEM.VAL (Exec.STRPTR, argarray[modExtOpt]);
nolog := SYSTEM.VAL (LONGINT, argarray[noLogOpt]) # 0
END ParseArgs;
PROCEDURE WriteCopyright ();
BEGIN
strptr := Msg.GetString (Msg.msgCopyright);
IO.WriteF1 (NIL, strptr^, SYSTEM.ADR (OBumpRevRev.vers))
END WriteCopyright;
PROCEDURE *Close ();
BEGIN
Msg.CloseCatalog ();
Dos.base.FreeArgs (argresult);
CloseFile (modrevfh, FALSE);
CloseFile (logfh, FALSE);
CloseFile (modfh, FALSE)
END Close;
PROCEDURE Init ();
BEGIN
modrevfh := NIL; logfh := NIL; modfh := NIL;
modrevexists := TRUE;
SYSTEM.SETCLEANUP (Close);
Utility.OpenLib (TRUE); (* Must open *)
Msg.OpenCatalog (NIL, "");
NEW (author, 32);
NEW (logname, 32);
NEW (module, 32);
NEW (logext, 32);
NEW (modrevext, 32);
NEW (modext, 32);
NEW (prgname, 32);
IF ~ Dos.base.GetProgramName (prgname^, 30) THEN prgname := SYSTEM.ADR (programName) END
END Init;
BEGIN Init ();
WriteCopyright ();
ParseArgs ();
GetDate ();
GetVersRev ();
WriteRevMod ();
IF ~ nolog THEN WriteLog () END;
strptr := Msg.GetString (Msg.msgBumpedTo);
IO.WriteF4 (NIL, strptr^, prgname, module, version, revision)
END OBumpRev.