A much more sane buffer implementation
This commit is contained in:
parent
22f417e68e
commit
945f85c2a3
1 changed files with 21 additions and 20 deletions
|
@ -15,27 +15,28 @@ class OutputBuffer():
|
||||||
self.sock: socket.socket = sock
|
self.sock: socket.socket = sock
|
||||||
self.offset: int = 0
|
self.offset: int = 0
|
||||||
|
|
||||||
|
def write(self, data: bytes):
|
||||||
|
count = len(data)
|
||||||
|
remaining = count
|
||||||
|
|
||||||
|
while remaining > 0:
|
||||||
|
if self.offset >= self.size:
|
||||||
|
self.offset = 0
|
||||||
|
|
||||||
|
needed = self.size - self.offset
|
||||||
|
copy = min(needed, remaining)
|
||||||
|
|
||||||
|
self.buf[self.offset:self.offset+copy] = data[0:copy]
|
||||||
|
|
||||||
|
remaining -= copy
|
||||||
|
self.offset += copy
|
||||||
|
|
||||||
|
if self.offset >= self.size:
|
||||||
|
self.sock.send(self.buf)
|
||||||
|
self.offset = 0
|
||||||
|
|
||||||
def print(self, text: str, end: str="\r\n"):
|
def print(self, text: str, end: str="\r\n"):
|
||||||
data = bytes(text + end, 'utf-8')
|
return self.write(bytes(text + end, 'utf-8'))
|
||||||
count = len(data)
|
|
||||||
|
|
||||||
if count > self.size:
|
|
||||||
return self.sock.send(data)
|
|
||||||
|
|
||||||
if count + self.offset > self.size:
|
|
||||||
to_fill = self.size - self.offset
|
|
||||||
left = count - to_fill
|
|
||||||
|
|
||||||
self.buf[self.offset:self.size] = data[0:to_fill]
|
|
||||||
|
|
||||||
self.sock.send(self.buf)
|
|
||||||
|
|
||||||
self.offset = 0
|
|
||||||
|
|
||||||
self.buf[0:left] = data[to_fill:to_fill+left]
|
|
||||||
else:
|
|
||||||
self.buf[self.offset:self.offset+count] = data
|
|
||||||
self.offset += count
|
|
||||||
|
|
||||||
def flush(self):
|
def flush(self):
|
||||||
self.sock.send(self.buf[0:self.offset])
|
self.sock.send(self.buf[0:self.offset])
|
||||||
|
|
Loading…
Add table
Reference in a new issue