home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyBufferedRead.p < prev    next >
Encoding:
Text File  |  1995-03-19  |  3.2 KB  |  147 lines  |  [TEXT/CWIE]

  1. unit MyBufferedRead;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types;
  7.         
  8.     const
  9.         min_buffer_size = 128;
  10.         max_buffer_size = 32000;
  11.  
  12.     type
  13.         bufferedReadFile = ptr;
  14.  
  15.     function BufferReadInit (p: bufferedReadFile; size: longInt; refnum: integer): OSErr;
  16.     function BufferRead (p: bufferedReadFile; data: ptr; var size: longInt): OSErr;
  17.     function BufferReadChar (p: bufferedReadFile): integer;
  18.     function BufferIgnoreTil (p: bufferedReadFile; c1, c2: integer): integer;
  19.     procedure BufferProgress (p: bufferedReadFile; var thru, total: longInt);
  20.  
  21. implementation
  22.  
  23.     uses
  24.         Files,Errors;
  25.     
  26.     const
  27.         buffer_extra = 30;
  28.         max_buffer_size1 = max_buffer_size - 1;
  29.  
  30.     type
  31.         bufferedFile = record
  32.                 rn: integer;
  33.                 max_buffer: integer;
  34.                 bufp, bufmax: integer;
  35.                 total: longInt;
  36.                 buffer: array[0..max_buffer_size1] of signedByte;
  37.             end;
  38.         bufferedFilePtr = ^bufferedFile;
  39.  
  40.     function BufferReadInit (p: ptr; size: longInt; refnum: integer): OSErr;
  41.         var
  42.             oe: OSErr;
  43.     begin
  44.         with bufferedFilePtr(p)^ do begin
  45.             rn := refnum;
  46.             oe := GetEOF(rn, total);
  47.             max_buffer := size - buffer_extra;
  48.             bufp := 0;
  49.             bufmax := 0;
  50.         end;
  51.         BufferReadInit := oe;
  52.     end;
  53.  
  54.     function FillBuffer (p: bufferedReadFile): OSErr;
  55.         var
  56.             oe: OSErr;
  57.             size: longInt;
  58.     begin
  59.         oe := noErr;
  60.         with bufferedFilePtr(p)^ do begin
  61.             if bufmax - bufp < max_buffer then begin
  62.                 if (bufmax - bufp > 0) & (bufp > 0) then
  63.                     BlockMove(@buffer[bufp], @buffer, bufmax - bufp);
  64.                 bufmax := bufmax - bufp;
  65.                 bufp := 0;
  66.                 size := max_buffer - bufmax;
  67.                 oe := FSRead(rn, size, @buffer[bufmax]);
  68.                 bufmax := bufmax + size;
  69.                 if (oe = eofErr) and (bufmax > 0) then
  70.                     oe := noErr;
  71.             end;
  72.         end;
  73.         FillBuffer := oe;
  74.     end;
  75.  
  76.     function BufferRead (p: bufferedReadFile; data: ptr; var size: longInt): OSErr;
  77.         var
  78.             oe: OSErr;
  79.             c: longInt;
  80.     begin
  81.         oe := noErr;
  82.         with bufferedFilePtr(p)^ do begin
  83.             c := bufmax - bufp;
  84.             if c > size then
  85.                 c := size;
  86.             BlockMove(@buffer[bufp], @data, c);
  87.             bufp := bufp + c;
  88.             if size > c then begin
  89.                 size := size - c;
  90.                 oe := FSRead(rn, size, ptr(ord(data) + c));
  91.                 size := size + c;
  92.                 if (oe = eofErr) and (size > 0) then
  93.                     oe := noErr;
  94.             end;
  95.         end;
  96.         BufferRead := oe;
  97.     end;
  98.  
  99.     function BufferReadChar (p: bufferedReadFile): integer;
  100.         var
  101.             oe: OSErr;
  102.     begin
  103.         with bufferedFilePtr(p)^ do begin
  104.             if bufp >= bufmax then
  105.                 oe := FillBuffer(p);
  106.             if bufp >= bufmax then
  107.                 BufferReadChar := -1
  108.             else begin
  109.                 BufferReadChar := BAND(buffer[bufp], $FF);
  110.                 bufp := bufp + 1;
  111.             end;
  112.         end;
  113.     end;
  114.  
  115.     function BufferIgnoreTil (p: bufferedReadFile; c1, c2: integer): integer;
  116.         var
  117.             ch: integer;
  118.     begin
  119.         with bufferedFilePtr(p)^ do begin
  120.             repeat
  121.                 repeat
  122.                     if bufp < bufmax then begin
  123.                         ch := BAND(buffer[bufp], $FF);
  124.                         bufp := bufp + 1;
  125.                     end
  126.                     else
  127.                         ch := BufferReadChar(p);
  128.                 until (ch = c1) or (ch < 0);
  129.                 while ch = c1 do
  130.                     ch := BufferReadChar(p);
  131.             until (ch = c2) or (ch < 0);
  132.         end;
  133.         BufferIgnoreTil := ch;
  134.     end;
  135.  
  136.     procedure BufferProgress (p: bufferedReadFile; var thru, total: longInt);
  137.         var
  138.             oe: OSErr;
  139.     begin
  140.         total := bufferedFilePtr(p)^.total;
  141.         with bufferedFilePtr(p)^ do begin
  142.             oe := GetFPos(rn, thru);
  143.             thru := thru - bufmax + bufp;
  144.         end;
  145.     end;
  146.  
  147. end.