home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-03-12 | 3.9 KB | 169 lines | [TEXT/PJMM] |
- unit MyBufferedTCP;
-
- interface
-
- uses
- TCPStuff;
-
- type
- TCPBuffer = record
- tcpc: TCPConnectionPtr;
- size, count: integer;
- buffer: Ptr;
- end;
-
- function TBCreate (var buf: TCPBuffer; tcpc: TCPConnectionPtr; buffer_size: integer): OSErr;
- procedure TBDestroy (var buf: TCPBuffer);
- procedure TBReadChars (var buf: TCPBuffer; value: integer);
- function TBGetLongLine (var buf: TCPBuffer; var p: ptr; var len, crlf: integer): boolean;
- procedure TBEatLongLine (var buf: TCPBuffer; len: integer);
- function TBGetLine (var buf: TCPBuffer; var s: str255): boolean;
- function TBTransferTilDot (var buf: TCPBuffer; refnum: integer; var finished: boolean; strip: integer): OSErr;
-
- implementation
-
- uses
- MyUtils;
-
- function TBCreate (var buf: TCPBuffer; tcpc: TCPConnectionPtr; buffer_size: integer): OSErr;
- begin
- buf.tcpc := tcpc;
- with buf do begin
- size := buffer_size;
- count := 0;
- buffer := NewPtr(buffer_size);
- TBCreate := MemError;
- end;
- end;
-
- procedure TBDestroy (var buf: TCPBuffer);
- begin
- DisposePtr(buf.buffer);
- end;
-
- procedure TBReadChars (var buf: TCPBuffer; value: integer);
- var
- oe: OSErr;
- begin
- with buf do begin
- if value > size - count then
- value := size - count;
- if value > 0 then begin
- oe := TCPRawReceiveChars(tcpc, ptr(ord(buffer) + count), value);
- if oe = noErr then
- count := count + value;
- end;
- end;
- end;
-
- function TBGetLongLine (var buf: TCPBuffer; var p: ptr; var len, crlf: integer): boolean;
- var
- q: ptr;
- begin
- TBGetLongLine := false;
- crlf := 0;
- with buf do begin
- p := buffer;
- len := 0;
- q := p;
- while (len < count) & (q^ <> 13) & (q^ <> 10) do begin
- len := len + 1;
- longInt(q) := longInt(q) + 1;
- end;
- if (len < count) & (q^ = 13) then begin
- len := len + 1;
- crlf := crlf + 1;
- longInt(q) := longInt(q) + 1;
- end;
- if (len < count) & (q^ = 10) then begin
- len := len + 1;
- crlf := crlf + 1;
- longInt(q) := longInt(q) + 1;
- TBGetLongLine := true;
- end;
- end;
- end;
-
- procedure TBEatLongLine (var buf: TCPBuffer; len: integer);
- begin
- with buf do begin
- if count = len then begin
- count := 0;
- end
- else begin
- BlockMove(ptr(ord(buffer) + len), buffer, count - len);
- count := count - len;
- end;
- end;
- end;
-
- function TBGetLine (var buf: TCPBuffer; var s: str255): boolean;
- var
- p: ptr;
- len, crlf, l: integer;
- begin
- TBGetLine := false;
- if TBGetLongLine(buf, p, len, crlf) | (len > 512) then begin
- l := len - crlf;
- if l > 255 then
- l := 255;
- {$PUSH}
- {$R-}
- s[0] := chr(l);
- {$POP}
- if l > 0 then
- BlockMove(p, @s[1], l);
- TBEatLongLine(buf, len);
- TBGetLine := true;
- end;
- end;
-
- function MyFSStripAndWrite (refnum: integer; len: longInt; p: ptr; strip: integer): OSErr;
- var
- src, dst: ptr;
- i, j: longInt;
- begin
- if strip = 0 then begin
- MyFSStripAndWrite := MyFSWrite(refnum, len, p);
- end
- else begin
- j := 0;
- src := p;
- dst := p;
- for i := 1 to len do begin
- if src^ <> strip then begin
- dst^ := src^;
- dst := ptr(ord(dst) + 1);
- j := j + 1;
- end;
- src := ptr(ord(src) + 1);
- end;
- MyFSStripAndWrite := MyFSWrite(refnum, j, p);
- end;
- end;
-
- function TBTransferTilDot (var buf: TCPBuffer; refnum: integer; var finished: boolean; strip: integer): OSErr;
- var
- p: longInt;
- len: integer;
- oe: OSErr;
- begin
- finished := false;
- oe := noErr;
- with buf do begin
- len := 0;
- p := ord(buffer);
- while (len < count - 4) & ((ptr(p)^ <> 13) | (ptr(p + 2)^ <> ord('.')) | (ptr(p + 3)^ <> 13) | (ptr(p + 1)^ <> 10) | (ptr(p + 4)^ <> 10)) do begin
- len := len + 1;
- p := p + 1;
- end;
- finished := (ptr(p)^ = 13) & (ptr(p + 1)^ = 10) & (ptr(p + 2)^ = ord('.')) & (ptr(p + 3)^ = 13) & (ptr(p + 4)^ = 10);
- if finished then
- len := len + 5;
- oe := MyFSStripAndWrite(refnum, len, buffer, strip);
- TBEatLongLine(buf, len);
- end;
- TBTransferTilDot := oe;
- end;
-
- end.