| 468 | |
| 469 | |
| 470 | class StdInputFile(StdioFile): |
| 471 | _line_buffer = '' |
| 472 | |
| 473 | def readable(self): |
| 474 | return True |
| 475 | |
| 476 | def read(self, size=-1): |
| 477 | if self.closed: |
| 478 | raise ValueError("read from closed file") |
| 479 | if size is None: |
| 480 | size = -1 |
| 481 | elif not isinstance(size, int): |
| 482 | raise TypeError('must be int, not ' + type(size).__name__) |
| 483 | result = self._line_buffer |
| 484 | self._line_buffer = '' |
| 485 | if size < 0: |
| 486 | while line := self.shell.readline(): |
| 487 | result += line |
| 488 | else: |
| 489 | while len(result) < size: |
| 490 | line = self.shell.readline() |
| 491 | if not line: break |
| 492 | result += line |
| 493 | self._line_buffer = result[size:] |
| 494 | result = result[:size] |
| 495 | return result |
| 496 | |
| 497 | def readline(self, size=-1): |
| 498 | if self.closed: |
| 499 | raise ValueError("read from closed file") |
| 500 | if size is None: |
| 501 | size = -1 |
| 502 | elif not isinstance(size, int): |
| 503 | raise TypeError('must be int, not ' + type(size).__name__) |
| 504 | line = self._line_buffer or self.shell.readline() |
| 505 | if size < 0: |
| 506 | size = len(line) |
| 507 | eol = line.find('\n', 0, size) |
| 508 | if eol >= 0: |
| 509 | size = eol + 1 |
| 510 | self._line_buffer = line[size:] |
| 511 | return line[:size] |
| 512 | |
| 513 | def close(self): |
| 514 | self.shell.close() |
| 515 | |
| 516 | |
| 517 | class MyHandler(rpc.RPCHandler): |