(self, size=None)
| 2564 | return line |
| 2565 | |
| 2566 | def readline(self, size=None): |
| 2567 | if self.closed: |
| 2568 | raise ValueError("read from closed file") |
| 2569 | if size is None: |
| 2570 | size = -1 |
| 2571 | else: |
| 2572 | try: |
| 2573 | size_index = size.__index__ |
| 2574 | except AttributeError: |
| 2575 | raise TypeError(f"{size!r} is not an integer") |
| 2576 | else: |
| 2577 | size = size_index() |
| 2578 | |
| 2579 | # Grab all the decoded text (we will rewind any extra bits later). |
| 2580 | line = self._get_decoded_chars() |
| 2581 | |
| 2582 | start = 0 |
| 2583 | # Make the decoder if it doesn't already exist. |
| 2584 | if not self._decoder: |
| 2585 | self._get_decoder() |
| 2586 | |
| 2587 | pos = endpos = None |
| 2588 | while True: |
| 2589 | if self._readtranslate: |
| 2590 | # Newlines are already translated, only search for \n |
| 2591 | pos = line.find('\n', start) |
| 2592 | if pos >= 0: |
| 2593 | endpos = pos + 1 |
| 2594 | break |
| 2595 | else: |
| 2596 | start = len(line) |
| 2597 | |
| 2598 | elif self._readuniversal: |
| 2599 | # Universal newline search. Find any of \r, \r\n, \n |
| 2600 | # The decoder ensures that \r\n are not split in two pieces |
| 2601 | |
| 2602 | # In C we'd look for these in parallel of course. |
| 2603 | nlpos = line.find("\n", start) |
| 2604 | crpos = line.find("\r", start) |
| 2605 | if crpos == -1: |
| 2606 | if nlpos == -1: |
| 2607 | # Nothing found |
| 2608 | start = len(line) |
| 2609 | else: |
| 2610 | # Found \n |
| 2611 | endpos = nlpos + 1 |
| 2612 | break |
| 2613 | elif nlpos == -1: |
| 2614 | # Found lone \r |
| 2615 | endpos = crpos + 1 |
| 2616 | break |
| 2617 | elif nlpos < crpos: |
| 2618 | # Found \n |
| 2619 | endpos = nlpos + 1 |
| 2620 | break |
| 2621 | elif nlpos == crpos + 1: |
| 2622 | # Found \r\n |
| 2623 | endpos = crpos + 2 |
no test coverage detected