home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / m2 / CycloneModules.lha / OOModules / txt / stream.mod < prev    next >
Text File  |  1996-07-02  |  4KB  |  167 lines

  1. IMPLEMENTATION MODULE Stream;
  2.  
  3. FROM SYSTEM IMPORT ADR,ADDRESS,BYTE,CAST,SHIFT;
  4. IMPORT DosL,DosD,ExecD,ExecL,io:InOut;
  5.  
  6. PROCEDURE TStream.Open(name:ARRAY OF CHAR; write:BOOLEAN):BOOLEAN;
  7. (*$ CopyDyn- *)
  8. VAR 
  9.  mode:LONGINT;
  10. BEGIN
  11.  Error:=cantOpen;
  12.  Write:=write;
  13.  IF write THEN mode:=DosD.newFile ELSE mode:=DosD.oldFile; END;
  14.  file:=DosL.Open(ADR(name),mode);
  15.  IF file#NIL THEN
  16.   io.WriteString('FileOpen\n');
  17.   pos:=0;
  18.   bufpos:=0;
  19.   buflen:=0;
  20.   eof:=FALSE;
  21.   buffer:=ExecL.AllocMem(BufSize,ExecD.MemReqSet{ExecD.public});
  22.   Error:=ok;
  23.  END;
  24.  RETURN file#NIL; 
  25. END TStream.Open;
  26.  
  27. PROCEDURE TStream.ReadBytes(adr:ADDRESS; len:LONGINT);
  28. VAR 
  29.   CharPtr{10}:POINTER TO CHAR;
  30.   i{7},bp{6},l{5}:LONGINT;
  31. BEGIN
  32.  IF (adr#NIL) & ~Write THEN
  33.    CharPtr:=adr; i:=0;
  34.    bp:=bufpos;
  35.    l:=buflen;
  36.    WHILE i<=len DO
  37.     IF bp=l THEN 
  38.       bp:=0; bufpos:=0;
  39.       l:=DosL.Read(file,buffer,BufSize);
  40.       IF l<0 THEN Error:=readErr; buflen:=l; RETURN; END;
  41.       IF l=0 THEN eof:=TRUE; buflen:=l; RETURN; END;
  42.     END;
  43.     CharPtr^:=buffer^[bp]; INC(CharPtr); INC(bp); INC(i);
  44.    END;
  45.    buflen:=l;
  46.    bufpos:=bp;
  47.    INC(pos,len);
  48.    Error:=ok;
  49.  END; 
  50. END TStream.ReadBytes;
  51.  
  52. PROCEDURE TStream.WriteBytes(adr:ADDRESS; len:LONGINT);
  53. VAR 
  54.   CharPtr{10}:POINTER TO CHAR;
  55.   i{7},bp{6}:LONGINT;
  56. BEGIN
  57.  IF (adr#NIL) & Write THEN
  58.   io.WriteString('WriteBytes ');
  59.   CharPtr:=adr;
  60.   i:=0;
  61.   bp:=bufpos;
  62.   WHILE i<=len DO
  63.     IF bp=BufSize THEN
  64.       bufpos:=0; bp:=0;
  65.       IF DosL.Write(file,buffer,BufSize)#BufSize THEN Error:=writeErr; RETURN; END;
  66.     END;
  67.     io.WriteString('.');
  68.     buffer^[bp]:=CharPtr^; 
  69.     INC(CharPtr); INC(bp); INC(i);
  70.   END;
  71.   bufpos:=bp;
  72.   INC(pos,len);
  73.   Error:=ok;
  74.   io.WriteString(' End\n');
  75.  END; 
  76. END TStream.WriteBytes;
  77.  
  78. PROCEDURE TStream.Close;
  79. BEGIN
  80.  Error:=ok;
  81.  IF file#NIL THEN
  82.   io.WriteString('Closing\n');
  83.   IF Write THEN 
  84.    io.WriteString('WriteBuffer\n');
  85.    IF ((bufpos-1)#DosL.Write(file,buffer,bufpos-1)) THEN
  86.     Error:=writeErr;
  87.    END;
  88.   END;
  89.   DosL.Close(file);
  90.   IF buffer#NIL THEN
  91.     io.WriteString('Free Memory\n');
  92.     ExecL.FreeMem(buffer,BufSize);
  93.   END;
  94.   file:=NIL;
  95.   io.WriteString('Done!\n');
  96.  END;
  97. END TStream.Close;
  98.  
  99.  
  100. PROCEDURE TReader.Init(s:TStream);
  101. BEGIN
  102.  FStream:=s;
  103. END TReader.Init;
  104.  
  105. PROCEDURE TReader.ReadBoolean(VAR b:BOOLEAN);
  106. BEGIN
  107.  FStream^.ReadBytes(ADR(b),1);
  108. END TReader.ReadBoolean;
  109.  
  110. PROCEDURE TReader.ReadInt(VAR i:LONGINT);
  111. VAR n:LONGINT; s:INTEGER; x:CHAR;
  112. BEGIN
  113.  s:=0; n:=0; FStream^.ReadBytes(ADR(x),1);
  114.  WHILE (ORD(x)>=128) DO
  115.   INC(n, SHIFT(ORD(x)-128,s)); INC(s,7); FStream^.ReadBytes(ADR(x),1);
  116.  END;
  117.  i:=n+LONGINT(SHIFT(ORD(x) MOD 64 - ORD(x) DIV 64 * 64,s));
  118. END TReader.ReadInt;
  119.  
  120. PROCEDURE TReader.ReadChar(VAR ch:CHAR);
  121. BEGIN
  122.  FStream^.ReadBytes(ADR(ch),1);
  123. END TReader.ReadChar;
  124.  
  125. PROCEDURE TReader.ReadBlock(VAR blk:ARRAY OF BYTE);
  126. BEGIN
  127.  FStream^.ReadBytes(ADR(blk),HIGH(blk)+1);
  128. END TReader.ReadBlock;
  129.  
  130.  
  131. (* TWriter *)
  132.  
  133. PROCEDURE TWriter.Init(s:TStream);
  134. BEGIN
  135.  FStream:=s;
  136. END TWriter.Init;
  137.  
  138. PROCEDURE TWriter.WriteBoolean(b:BOOLEAN);
  139. BEGIN
  140.  FStream^.WriteBytes(ADR(b),1);
  141. END TWriter.WriteBoolean;
  142.  
  143. PROCEDURE TWriter.WriteInt(i:LONGINT);
  144. VAR x:SHORTCARD;
  145. BEGIN
  146.   WHILE (i < -64) OR (i > 63) DO
  147.     x:=i MOD 128 + 128;
  148.     FStream^.WriteBytes(ADR(x),1); i := i DIV 128;
  149.   END;
  150.   x:=i MOD 128;
  151.   FStream^.WriteBytes(ADR(x),1);
  152. END TWriter.WriteInt;
  153.  
  154.  
  155. PROCEDURE TWriter.WriteChar(ch:CHAR);
  156. BEGIN
  157.  FStream^.WriteBytes(ADR(ch),1);
  158. END TWriter.WriteChar;
  159.  
  160. PROCEDURE TWriter.WriteBlock(blk:ARRAY OF BYTE);
  161. BEGIN
  162.  FStream^.WriteBytes(ADR(blk),HIGH(blk)+1);
  163. END TWriter.WriteBlock;
  164.  
  165. BEGIN
  166. END Stream.
  167.