66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
import sys
|
|
|
|
class StandardIOBuffer:
|
|
"""
|
|
IOBuffer implementation that uses system standard input/output.
|
|
|
|
This class provides direct access to stdin/stdout for IO operations.
|
|
It implements a basic line-based input buffer to handle cases where
|
|
multiple reads are needed to process all available input.
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""Initialize the standard IO buffer."""
|
|
self._input_buffer: str = ""
|
|
|
|
def read(self) -> str:
|
|
"""
|
|
Read available input from stdin.
|
|
|
|
If there is buffered input from a previous read, return that first.
|
|
Otherwise, try to read new input from stdin if available.
|
|
|
|
Returns:
|
|
str: Content read from stdin, or empty string if no input available
|
|
"""
|
|
# Return and clear any existing buffered input
|
|
if self._input_buffer:
|
|
content = self._input_buffer
|
|
self._input_buffer = ""
|
|
return content
|
|
|
|
# Check if there's input available
|
|
if not sys.stdin.isatty() and sys.stdin.readable():
|
|
try:
|
|
content = sys.stdin.read()
|
|
if content:
|
|
return content
|
|
except Exception:
|
|
pass # Ignore any read errors
|
|
|
|
return ""
|
|
|
|
def write(self, content: str) -> None:
|
|
"""
|
|
Write content to stdout.
|
|
|
|
Args:
|
|
content: String content to write
|
|
"""
|
|
if not content:
|
|
return
|
|
|
|
try:
|
|
sys.stdout.write(content)
|
|
sys.stdout.flush()
|
|
except Exception:
|
|
pass # Ignore write errors
|
|
|
|
def buffer_length(self) -> int:
|
|
"""
|
|
Get the current length of buffered input.
|
|
|
|
Returns:
|
|
int: Number of characters in the input buffer
|
|
"""
|
|
return len(self._input_buffer) |