home *** CD-ROM | disk | FTP | other *** search
/ synchro.net / synchro.net.tar / synchro.net / main / BBS / D32_01.ZIP / BUFUNIT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-11-25  |  3.8 KB  |  145 lines

  1. unit BufUnit;
  2. {$I-,R-,S-,Q-}
  3. (*
  4. **
  5. ** Large char-buffer handling routines for EleBBS
  6. **
  7. ** Copyright (c) 1998-1999 by Maarten Bekers
  8. **
  9. ** Version : 1.01
  10. ** Created : 05-Jan-1999
  11. ** Last update : 07-Apr-1999
  12. **
  13. **
  14. *)
  15.  
  16. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  17.  INTERFACE
  18. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  19.  
  20. Type CharBufType = Array[0..65520] of Char;
  21.  
  22. type BufArrayObj = Object
  23.           TxtArr     : ^CharBufType;
  24.           TxtMaxLen  : Longint;
  25.           TxtStartPtr: Longint;                      { Start of buffer ptr }
  26.           CurTxtPtr  : Longint;                 { Maximum data entered yet }
  27.           TmpBuf     : ^CharBufType;
  28.  
  29.           constructor Init(TxtSize: Longint);
  30.           destructor Done;
  31.  
  32.           function BufRoom: Longint;
  33.           function BufUsed: Longint;
  34.           function Put(var Buf; Size: Longint): Longint;
  35.           function Get(var Buf; Size: Longint; Remove: Boolean): Longint;
  36.  
  37.           procedure Clear;
  38.      end; { BufArrayObj }
  39.  
  40.  
  41. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  42.  IMPLEMENTATION
  43. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  44.  
  45. constructor BufArrayObj.Init(TxtSize: Longint);
  46. begin
  47.   TxtMaxLen := TxtSize;
  48.   TxtArr := nil;
  49.   TmpBuf := nil;
  50.   CurTxtPtr := -1;
  51.   TxtStartPtr := 0;
  52.  
  53.   Getmem(TxtArr, TxtMaxLen);
  54.   GetMem(TmpBuf, TxtMaxLen);
  55.  
  56.   if TxtArr <> nil then FillChar(TxtArr^, TxtMaxLen, #00);
  57.   if TmpBuf <> nil then FillChar(TmpBuf^, TxtMaxLen, #00);
  58. end; { constructor Init }
  59.  
  60. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  61.  
  62. destructor BufArrayObj.Done;
  63. begin
  64.   if TxtArr <> nil then FreeMem(TxtArr, TxtMaxLen);
  65.   if TmpBuf <> nil then FreeMem(TmpBuf, TxtMaxLen);
  66. end; { destructor Done }
  67.  
  68. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  69.  
  70. function BufArrayObj.BufRoom: Longint;
  71. begin
  72.   BufRoom := (TxtMaxLen - (CurTxtPtr + 1));
  73. end; { func. BufRoom }
  74.  
  75. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  76.  
  77. function BufArrayObj.BufUsed: Longint;
  78. begin
  79.   BufUsed := (CurTxtPtr + 01);
  80. end; { func. BufUsed }
  81.  
  82. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  83.  
  84. function BufArrayObj.Put(var Buf; Size: Longint): Longint;
  85. var RetSize: Longint;
  86. begin
  87.   Put := 0;
  88.   if Size < 0 then EXIT;
  89.  
  90.   if TxtStartPtr > 0 then
  91.    if (CurTxtPtr + TxtStartPtr) > TxtMaxLen then
  92.      begin
  93.        Move(TxtArr^[TxtStartPtr], TxtArr^[0], Succ(CurTxtPtr));
  94.        TxtStartPtr := 0;
  95.      end; { if }
  96.  
  97.   if Size > BufRoom then RetSize := BufRoom
  98.     else RetSize := Size;
  99.  
  100.   Move(Buf, TxtArr^[TxtStartPtr + BufUsed], RetSize);
  101.  
  102.   Inc(CurTxtPtr, RetSize);
  103.   Put := RetSize;
  104. end; { func. Put }
  105.  
  106. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  107.  
  108. function BufArrayObj.Get(var Buf; Size: Longint; Remove: Boolean): Longint;
  109. var RetSize: Longint;
  110. begin
  111.   Get := 0;
  112.   if Size < 0 then EXIT;
  113.  
  114.   if Size > BufUsed then RetSize := BufUsed
  115.      else RetSize := Size;
  116.  
  117.   Move(TxtArr^[TxtStartPtr], Buf, RetSize);
  118.  
  119.   Get := RetSize;
  120.  
  121.   if Remove then
  122.     begin
  123.       if RetSize = BufUsed then
  124.         begin
  125.           CurTxtPtr := -1;
  126.           TxtStartPtr := 0;
  127.         end
  128.           else begin
  129.                  Inc(TxtStartPtr, RetSize);
  130.                  Dec(CurTxtPtr, RetSize);
  131.                end; { if }
  132.     end; { if }
  133. end; { func. Get }
  134.  
  135. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  136.  
  137. procedure BufArrayObj.Clear;
  138. begin
  139.   CurTxtPtr := -1;
  140. end; { proc. Clear }
  141.  
  142. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  143.  
  144. end. { bufunit }
  145.