home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / loader / loggerlib.mod < prev    next >
Text File  |  1977-12-31  |  5KB  |  290 lines

  1. IMPLEMENTATION MODULE LoggerLib;
  2.  
  3. (*$
  4.  LargeVars:=FALSE StackParms:=FALSE Volatile:=FALSE
  5.  StackChk:=FALSE RangeChk:=FALSE OverflowChk:=FALSE
  6.  NilChk:=FALSE CaseChk:=FALSE
  7. *)
  8.  
  9. FROM SYSTEM IMPORT
  10.  ADR,ADDRESS,ASSEMBLE,CAST;
  11.  
  12. FROM Arts IMPORT
  13.  dosCmdLen;
  14.  
  15. FROM DosD IMPORT
  16.  DateFormat,DateTime,DateTimePtr,DateTimeFlagSet;
  17.  
  18. FROM DosL IMPORT
  19.  DateStamp,DateToStr;
  20.  
  21. FROM ExecD IMPORT
  22.  Library,MemReqs,MemReqSet;
  23.  
  24. FROM ExecL IMPORT
  25.  AllocAbs,AllocMem,Remove,FreeMem;
  26.  
  27. FROM String IMPORT
  28.  Length;
  29.  
  30. IMPORT R;
  31.  
  32. CONST
  33.  revision=4; (* Ihre Revision *)
  34.  
  35. (*
  36.  This library is shall never be closed, once it is open.
  37. *)
  38. PROCEDURE LibOpen(myLib{R.A6}:LoggerBasePtr):ADDRESS;
  39. (*$ EntryExitCode:=FALSE *)
  40. BEGIN
  41.   ASSEMBLE(
  42.    MOVE.W #1,Library.openCnt(A6)
  43.    MOVE.L A6,D0
  44.    RTS
  45.   END);
  46. END LibOpen;
  47.  
  48. PROCEDURE LibClose(myLib{R.A6}:LoggerBasePtr): ADDRESS;
  49. (*$ EntryExitCode:=FALSE *)
  50. BEGIN
  51.   ASSEMBLE(
  52.    MOVEQ #0,D0
  53.    RTS
  54.   END);
  55. END LibClose;
  56.  
  57. PROCEDURE LibExpunge(myLib{R.A6}:LoggerBasePtr): ADDRESS;
  58. (*$ EntryExitCode:=FALSE *)
  59. BEGIN
  60.   ASSEMBLE(
  61.    MOVEQ #0,D0
  62.    RTS
  63.   END);
  64. END LibExpunge;
  65.  
  66. PROCEDURE LibExtFunc(myLib{R.A6}:LoggerBasePtr): ADDRESS;
  67. (*$ EntryExitCode:=FALSE *)
  68. BEGIN
  69.  ASSEMBLE(
  70.   MOVEQ #0,D0 (* Immer NIL *)
  71.   RTS
  72.  END);
  73. END LibExtFunc;
  74.  
  75. CONST
  76.  blockSize=100H;
  77.  blockCount=100H;
  78.  bufLength=blockCount*blockSize;
  79.  bufEnd=07F80000H;
  80.  
  81. TYPE
  82.  BlockData=ARRAY [0..blockSize-1] OF CHAR;
  83.  Buffer=RECORD
  84.   first:LONGCARD;
  85.   next:LONGCARD;
  86.   datasum:ARRAY [0..blockCount-1] OF LONGCARD;
  87.   chksum:LONGCARD; (* sum over first, next and all block checksums. *)
  88.   data:ARRAY [0..blockCount-1] OF BlockData;
  89.  END;
  90.  BufferPtr=POINTER TO Buffer;
  91.  
  92. PROCEDURE sumBlock(VAR data:BlockData):LONGCARD;
  93. VAR
  94.  i:[0..blockCount-1];
  95.  sum:LONGCARD;
  96. BEGIN
  97.  sum:=0;
  98.  FOR i:=0 TO blockSize-1 DO
  99.   INC(sum,LONGCARD(data[i]));
  100.  END;
  101.  RETURN sum;
  102. END sumBlock;
  103.  
  104. PROCEDURE sumBuffer(VAR buf:Buffer):LONGCARD;
  105. VAR
  106.  i:[0..blockCount-1];
  107.  sum:LONGCARD;
  108. BEGIN
  109.  sum:=buf.first+buf.next;
  110.  FOR i:=0 TO blockCount-1 DO
  111.   INC(sum,buf.datasum[i]);
  112.  END;
  113.  RETURN sum;
  114. END sumBuffer;
  115.  
  116. PROCEDURE sumAll(VAR buf:Buffer);
  117. VAR
  118.  sum:LONGCARD;
  119.  i:[0..blockCount-1];
  120. BEGIN
  121.  FOR i:=0 TO blockCount-1 DO
  122.   sum:=sumBlock(buf.data[i]);
  123.   buf.datasum[i]:=sum;
  124.  END;
  125.  sum:=sumBuffer(buf);
  126.  buf.chksum:=sum;
  127. END sumAll;
  128.  
  129. PROCEDURE sumVerify(VAR buf:Buffer):BOOLEAN;
  130. VAR
  131.  sum:LONGCARD;
  132.  i:[0..blockCount-1];
  133. BEGIN
  134.  FOR i:=0 TO blockCount-1 DO
  135.   sum:=sumBlock(buf.data[i]);
  136.   IF buf.datasum[i]#sum THEN RETURN FALSE; END;
  137.  END;
  138.  sum:=sumBuffer(buf);
  139.  RETURN buf.chksum=sum;
  140. END sumVerify;
  141.  
  142. PROCEDURE setup(VAR buf:BufferPtr; VAR first,next:LONGCARD);
  143. BEGIN
  144.  buf:=CAST(BufferPtr,bufEnd-SIZE(Buffer));
  145.  first:=buf^.first;
  146.  next:=buf^.next;
  147. END setup;
  148.  
  149. PROCEDURE update(first,next:LONGCARD);
  150. VAR
  151.  buf:BufferPtr;
  152. BEGIN
  153.  buf:=CAST(BufferPtr,bufEnd-SIZE(Buffer));
  154.  buf^.first:=first;
  155.  buf^.next:=next;
  156. END update;
  157.  
  158. PROCEDURE init;
  159. (*$ LoadA4:=TRUE *)
  160. VAR
  161.  buf:BufferPtr;
  162.  first,next:LONGCARD;
  163. BEGIN
  164.  setup(buf,first,next);
  165.  IF ~sumVerify(buf^) THEN
  166.   update(0,0);
  167.   sumAll(buf^);
  168.  END;
  169. END init;
  170.  
  171. PROCEDURE clear;
  172. (*$ LoadA4:=TRUE *)
  173. VAR
  174.  buf:BufferPtr;
  175.  first,next:LONGCARD;
  176. BEGIN
  177.  setup(buf,first,next);
  178.  update(0,0);
  179.  buf^.chksum:=sumBuffer(buf^);
  180. END clear;
  181.  
  182. PROCEDURE firstPos():LONGCARD;
  183. (*$ LoadA4:=TRUE *)
  184. VAR
  185.  buf:BufferPtr;
  186.  first,next:LONGCARD;
  187. BEGIN
  188.  setup(buf,first,next);
  189.  RETURN first;
  190. END firstPos;
  191.  
  192. PROCEDURE nextPos():LONGCARD;
  193. (*$ LoadA4:=TRUE *)
  194. VAR
  195.  buf:BufferPtr;
  196.  first,next:LONGCARD;
  197. BEGIN
  198.  setup(buf,first,next);
  199.  RETURN next;
  200. END nextPos;
  201.  
  202. PROCEDURE write(ch{R.D2}:CHAR);
  203. (*$ LoadA4:=TRUE *)
  204. VAR
  205.  blk,first,next,pos:LONGCARD;
  206.  buf:BufferPtr;
  207. BEGIN
  208.  setup(buf,first,next);
  209.  IF sumBuffer(buf^)#buf^.chksum THEN
  210.   init;
  211.   blk:=0; pos:=0; first:=0; next:=0;
  212.  ELSE
  213.   pos:=next MOD bufLength;
  214.   blk:=pos MOD blockCount;
  215.   IF sumBlock(buf^.data[blk])#buf^.datasum[blk] THEN
  216.    init;
  217.    blk:=0; pos:=0; first:=0; next:=0;
  218.   END;
  219.  END;
  220.  buf^.data[blk][pos DIV blockCount]:=ch;
  221.  buf^.datasum[blk]:=sumBlock(buf^.data[blk]);
  222.  INC(next);
  223.  IF next-first>bufLength THEN
  224.   INC(first);
  225.  END;
  226.  update(first,next);
  227.  buf^.chksum:=sumBuffer(buf^);
  228. END write;
  229.  
  230. PROCEDURE writeStamp;
  231. (*$ LoadA4:=TRUE *)
  232. VAR
  233.  day,date,time:ARRAY [0..30] OF CHAR;
  234.  dt:DateTimePtr;
  235.  i:INTEGER;
  236. BEGIN
  237.  dt:=AllocMem(SIZE(DateTime),MemReqSet{public});
  238.  DateStamp(ADR(dt^.date));
  239.  dt^.format:=formatDOS;
  240.  dt^.flags:=DateTimeFlagSet{};
  241.  dt^.strDay:=ADR(day);
  242.  dt^.strDate:=ADR(date);
  243.  dt^.strTime:=ADR(time);
  244.  IF DateToStr(dt)#0 THEN
  245.   FOR i:=0 TO Length(day)-1 DO write(day[i]); END;
  246.   write(" ");
  247.   FOR i:=0 TO Length(date)-1 DO write(date[i]); END;
  248.   write(" ");
  249.   FOR i:=0 TO Length(time)-1 DO write(time[i]); END;
  250.   write(" ");
  251.  END;
  252.  FreeMem(dt,SIZE(DateTime));
  253. END writeStamp;
  254.  
  255. PROCEDURE read(pos{R.D2}:LONGCARD):CHAR;
  256. (*$ LoadA4:=TRUE *)
  257. VAR
  258.  blk,first,next:LONGCARD;
  259.  buf:BufferPtr;
  260.  ch:CHAR;
  261. BEGIN
  262.  setup(buf,first,next);
  263.  IF sumBuffer(buf^)#buf^.chksum THEN
  264.   init;
  265.   ch:=0C;
  266.  ELSIF (first<=pos) & (pos<next) THEN
  267.   pos:=pos MOD bufLength;
  268.   blk:=pos MOD blockCount;
  269.   IF sumBlock(buf^.data[blk])#buf^.datasum[blk] THEN
  270.    init;
  271.    ch:=0C;
  272.   ELSE
  273.    ch:=buf^.data[blk][pos DIV blockCount];
  274.   END;
  275.  ELSE
  276.   ch:=0C;
  277.  END;
  278.  RETURN ch;
  279. END read;
  280.  
  281. BEGIN
  282.  IF dosCmdLen#0 THEN
  283.   IF AllocAbs(SIZE(Buffer),bufEnd-SIZE(Buffer))=NIL THEN
  284.    dosCmdLen:=0;
  285.   ELSE
  286.    init;
  287.   END;
  288.  END;
  289. END LoggerLib.mod
  290.