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 >
Text File  |  1994-08-15  |  8KB  |  323 lines

  1. (*
  2.  *    $DESCRIPTION: Bumps Oberon-A module revisions $
  3.  *    $AUTHOR: Johan Ferreira $
  4.  *)
  5.  
  6. MODULE    OBumpRev;
  7.  
  8. (* $P- Portable code disabled *)
  9.  
  10. IMPORT    SYSTEM, Exec, Dos, Timer, Utility, IO := BufIO, Strings, OBumpRevRev, Msg := OBumpRevMsg;
  11.  
  12.  
  13. CONST    moduleOpt = 0;
  14.     versionOpt = 1;
  15.     revisionOpt = 2;
  16.     logExtOpt = 3;
  17.     revModExtOpt = 4;
  18.     modExtOpt = 5;
  19.     noLogOpt = 6;
  20.     numOfArgs = 7;
  21.  
  22.     defLogExt = ".revlog";
  23.     defRevModExt = "Rev.mod";
  24.     defModExt = ".mod";
  25.  
  26.     programName = "OBumpRev";
  27.  
  28.  
  29. TYPE    LongIntPtr = CPOINTER TO LONGINT;
  30.  
  31.  
  32. VAR    modrevfh, logfh, modfh: Dos.FileHandlePtr;
  33.  
  34.     author, logname, module, logext, modrevext, modext: Exec.STRPTR;
  35.     day, month, year: LONGINT;
  36.     version, revision: LONGINT;
  37.  
  38.     argarray: ARRAY numOfArgs OF SYSTEM.LONGWORD;
  39.     argresult: Dos.RDArgsPtr;
  40.     prgname: Exec.STRPTR;
  41.     cleanup: PROCEDURE (rc: LONGINT);
  42.  
  43.     bool, modrevexists, nolog: BOOLEAN;
  44.     ch: CHAR;
  45.     li: LONGINT;
  46.     liptr: LongIntPtr;
  47.     strptr: Exec.STRPTR;
  48.  
  49.  
  50. PROCEDURE ReadLongInt* (fh: Dos.FileHandlePtr; VAR x: LONGINT): BOOLEAN;
  51. VAR    ch: CHAR;
  52.     d: LONGINT;
  53.     neg: BOOLEAN;
  54. BEGIN
  55.     x := 0; IO.Read (fh, ch);
  56.     neg := FALSE;
  57.     IF ch = "-" THEN neg := TRUE; IO.Read (fh, ch) END;
  58.     LOOP
  59.         CASE ch OF
  60.             0X, ";": IF neg THEN x := -x END; RETURN TRUE
  61.         |    "0".."9":
  62.                 d := ORD (ch) - ORD ("0");
  63.                 IF (MAX (LONGINT) - d) DIV 10 >= x THEN x := 10*x+d ELSE EXIT END
  64.         ELSE    EXIT
  65.         END;
  66.         IO.Read (fh, ch);
  67.     END;
  68.     RETURN FALSE;
  69. END ReadLongInt;
  70.  
  71.  
  72. PROCEDURE PrintFault (msg: LONGINT);
  73. BEGIN
  74.     strptr := Msg.GetString (msg);
  75.     IF msg = 0 THEN
  76.         IF Dos.base.PrintFault (Dos.base.IoErr (), prgname^) THEN END
  77.     ELSE
  78.         IO.WriteF1 (NIL, strptr^, prgname)
  79.     END
  80. END PrintFault;
  81.  
  82.  
  83. PROCEDURE OpenFile (VAR fh: Dos.FileHandlePtr; mode: LONGINT; name, extension: Exec.STRPTR);
  84. VAR    filename: Exec.STRPTR;
  85. BEGIN
  86.     NEW (filename, 32);
  87.     COPY (name^, filename^); Strings.Append (filename^, extension^);
  88.     fh := Dos.base.Open (filename^, mode)
  89. END OpenFile;
  90.  
  91.  
  92. PROCEDURE CloseFile (VAR fh: Dos.FileHandlePtr; halt: BOOLEAN);
  93. BEGIN
  94.     IF fh # NIL THEN 
  95.         IF ~ Dos.base.Close (fh) THEN
  96.             fh := NIL;
  97.             PrintFault (Msg.msgCouldNotClose);
  98.             IF halt THEN HALT (Dos.returnError) END
  99.         END;
  100.         fh := NIL
  101.     END;
  102. END CloseFile;
  103.  
  104.  
  105. PROCEDURE WriteRevMod ();
  106. BEGIN
  107.     OpenFile (modrevfh, Dos.modeNewFile, module, modrevext);
  108.     IF modrevfh = NIL THEN
  109.         PrintFault (Msg.msgCouldNotCreateModRev);
  110.         HALT (Dos.returnFail)
  111.     ELSE
  112.         IF ~ modrevexists THEN
  113.             strptr := Msg.GetString (Msg.msgCreated);
  114.             IO.WriteF3 (NIL, strptr^, prgname, module, modrevext)
  115.         END
  116.     END;
  117.  
  118.     strptr := Msg.GetString (Msg.msgRevModContents);
  119.     IF Dos.base.FPrintf (modrevfh, strptr^,
  120.                 SYSTEM.ADR (OBumpRevRev.vers),
  121.                 module,
  122.                 version,
  123.                 revision,
  124.                 day,month,year,
  125.                 module,version,revision,
  126.                 module,version,revision,day,month,year,
  127.                 module,version,revision,day,month,year,
  128.                 module) = -1 THEN
  129.         PrintFault (Msg.msgCouldNotWriteModRev);
  130.         HALT (Dos.returnFail)
  131.     END;
  132.  
  133.     CloseFile (modrevfh, TRUE)
  134. END WriteRevMod;
  135.  
  136.  
  137. PROCEDURE WriteLog();
  138. VAR    modsize: LONGINT;
  139. BEGIN
  140.     (* Open log file *)
  141.     OpenFile (logfh, Dos.modeReadWrite, module, logext);
  142.     IF logfh = NIL THEN
  143.         OpenFile (logfh, Dos.modeNewFile, module, logext);
  144.         IF logfh = NIL THEN
  145.             strptr := Msg.GetString (Msg.msgCouldNotCreate);
  146.             IO.WriteF3 (NIL, strptr^, prgname, module, logext)
  147.         ELSE
  148.             strptr := Msg.GetString (Msg.msgCreated);
  149.             IO.WriteF3 (NIL, strptr^, prgname, module, logext)
  150.         END
  151.     END;
  152.  
  153.     (* Write log *)
  154.     IF logfh # NIL THEN
  155.  
  156.         (* Get #?.mod size *)
  157.         OpenFile (modfh, Dos.modeOldFile, module, modext);
  158.         IF modfh # NIL THEN
  159.             modsize := Dos.base.Seek (modfh, 0, Dos.offsetEnd);
  160.             modsize := Dos.base.Seek (modfh, 0, Dos.offsetEnd);
  161.             CloseFile (modfh, TRUE)
  162.         ELSE
  163.             modsize := 0
  164.         END;
  165.  
  166.         strptr := Msg.GetString (Msg.msgAuthor);
  167.         IF Dos.base.GetVar (strptr^, author^, 30, {}) = -1 THEN author := SYSTEM.ADR ("") END;
  168.  
  169.         li := Dos.base.Seek (logfh, 0, Dos.offsetEnd);    (* Append *)
  170.         strptr := Msg.GetString (Msg.msgLog);
  171.         IF Dos.base.FPrintf (logfh, strptr^,
  172.                      module, version, revision, day, month, year, modsize, author) = -1 THEN
  173.             PrintFault (Msg.msgCouldNotWriteLog);
  174.             HALT (Dos.returnFail)
  175.         END
  176.     END;
  177.  
  178.     CloseFile (logfh, TRUE)
  179. END WriteLog;
  180.  
  181.  
  182. PROCEDURE GetVersRev ();
  183. BEGIN
  184.     OpenFile (modrevfh, Dos.modeOldFile, module, modrevext);
  185.     modrevexists := modrevfh # NIL;
  186.  
  187.     (* Version *)
  188.     IF SYSTEM.VAL (LongIntPtr, argarray[versionOpt]) # NIL THEN
  189.         liptr := SYSTEM.VAL (LongIntPtr, argarray[versionOpt]);
  190.         version := liptr^
  191.     ELSE
  192.         IF modrevexists THEN
  193.             REPEAT    IO.Read (modrevfh, ch)
  194.             UNTIL ch = "="; IO.Read (modrevfh, ch);
  195.             IF ~ ReadLongInt (modrevfh, version) THEN
  196.                 version := 0
  197.             END
  198.         ELSE    version := 0
  199.         END
  200.     END;
  201.  
  202.     (* Revision *)
  203.     IF SYSTEM.VAL (LongIntPtr, argarray[revisionOpt]) # NIL THEN
  204.         liptr := SYSTEM.VAL (LongIntPtr, argarray[revisionOpt]);
  205.         revision := liptr^
  206.     ELSE
  207.         IF modrevexists THEN
  208.             REPEAT    IO.Read (modrevfh, ch)
  209.             UNTIL ch = "="; IO.Read (modrevfh, ch);
  210.             IF ~ ReadLongInt (modrevfh, revision) THEN
  211.                 revision := 0
  212.             END
  213.         ELSE    revision := 0
  214.         END;
  215.         INC (revision)        (* Bump revision *)
  216.     END;
  217.  
  218.     CloseFile (modrevfh, TRUE)
  219. END GetVersRev;
  220.  
  221.  
  222. PROCEDURE GetDate;
  223. VAR
  224.     timeReqPtr: Timer.TimeRequestPtr;
  225.     sysTime: Timer.TimeVal;
  226.     success: BOOLEAN;
  227.     clockData: Utility.ClockData;
  228.     timerBase: Timer.TimerBasePtr;
  229. BEGIN
  230.     success := FALSE;
  231.     NEW (timeReqPtr);
  232.     IF timeReqPtr # NIL THEN
  233.         IF Exec.base.OpenDevice (Timer.name, Timer.unitVBlank, timeReqPtr, {}) = 0 THEN
  234.             timerBase := SYSTEM.VAL (Timer.TimerBasePtr, timeReqPtr.device);
  235.             timerBase.GetSysTime (sysTime);
  236.             Exec.base.CloseDevice (timeReqPtr);
  237.             success := TRUE
  238.         END
  239.     END;
  240.     IF ~success THEN
  241.         HALT (20)
  242.     END;
  243.     Utility.base.Amiga2Date (sysTime.secs, clockData);
  244.     day := clockData.mday;
  245.     month := clockData.month;
  246.     year  := clockData.year MOD 100  (* only two digits for the year :-( *)
  247. END GetDate;
  248.  
  249.  
  250. PROCEDURE ParseArgs ();
  251. BEGIN
  252.     FOR li := 0 TO numOfArgs-1 DO
  253.         argarray[li] := NIL
  254.     END;
  255.     argarray[logExtOpt] := SYSTEM.ADR (defLogExt);
  256.     argarray[revModExtOpt] := SYSTEM.ADR (defRevModExt);
  257.     argarray[modExtOpt] := SYSTEM.ADR (defModExt);
  258.  
  259.     strptr := Msg.GetString (Msg.msgTemplate);
  260.     argresult := Dos.base.ReadArgs (strptr^, argarray, NIL);
  261.  
  262.     IF argresult = NIL THEN
  263.         PrintFault (0);
  264.         HALT (Dos.returnFail)
  265.     END;
  266.  
  267.     module := SYSTEM.VAL (Exec.STRPTR, argarray[moduleOpt]);
  268.     logext := SYSTEM.VAL (Exec.STRPTR, argarray[logExtOpt]);
  269.     modrevext := SYSTEM.VAL (Exec.STRPTR, argarray[revModExtOpt]);
  270.     modext := SYSTEM.VAL (Exec.STRPTR, argarray[modExtOpt]);
  271.     nolog := SYSTEM.VAL (LONGINT, argarray[noLogOpt]) # 0
  272. END ParseArgs;
  273.  
  274.  
  275. PROCEDURE WriteCopyright ();
  276. BEGIN
  277.     strptr := Msg.GetString (Msg.msgCopyright);
  278.     IO.WriteF1 (NIL, strptr^, SYSTEM.ADR (OBumpRevRev.vers))
  279. END WriteCopyright;
  280.  
  281.  
  282. PROCEDURE *Close ();
  283. BEGIN
  284.     Msg.CloseCatalog ();
  285.     Dos.base.FreeArgs (argresult);
  286.     CloseFile (modrevfh, FALSE);
  287.     CloseFile (logfh, FALSE);
  288.     CloseFile (modfh, FALSE)
  289. END Close;
  290.  
  291.  
  292. PROCEDURE Init ();
  293. BEGIN
  294.     modrevfh := NIL; logfh := NIL; modfh := NIL;
  295.     modrevexists := TRUE;
  296.     SYSTEM.SETCLEANUP (Close);
  297.     Utility.OpenLib (TRUE);        (* Must open *)
  298.     Msg.OpenCatalog (NIL, "");
  299.  
  300.     NEW (author, 32);
  301.     NEW (logname, 32);
  302.     NEW (module, 32);
  303.     NEW (logext, 32);
  304.     NEW (modrevext, 32);
  305.     NEW (modext, 32);
  306.     NEW (prgname, 32);
  307.  
  308.     IF ~ Dos.base.GetProgramName (prgname^, 30) THEN prgname := SYSTEM.ADR (programName) END
  309. END Init;
  310.  
  311.  
  312. BEGIN    Init ();
  313.     WriteCopyright ();
  314.     ParseArgs ();
  315.  
  316.     GetDate ();
  317.     GetVersRev ();
  318.     WriteRevMod ();
  319.     IF ~ nolog THEN WriteLog () END;
  320.     strptr := Msg.GetString (Msg.msgBumpedTo);
  321.     IO.WriteF4 (NIL, strptr^, prgname, module, version, revision)
  322. END OBumpRev.
  323.