Generate key-to-(start, stop) table of contents.
(self)
| 855 | f.write(linesep) |
| 856 | |
| 857 | def _generate_toc(self): |
| 858 | """Generate key-to-(start, stop) table of contents.""" |
| 859 | starts, stops = [], [] |
| 860 | last_was_empty = False |
| 861 | self._file.seek(0) |
| 862 | while True: |
| 863 | line_pos = self._file.tell() |
| 864 | line = self._file.readline() |
| 865 | if line.startswith(b'From '): |
| 866 | if len(stops) < len(starts): |
| 867 | if last_was_empty: |
| 868 | stops.append(line_pos - len(linesep)) |
| 869 | else: |
| 870 | # The last line before the "From " line wasn't |
| 871 | # blank, but we consider it a start of a |
| 872 | # message anyway. |
| 873 | stops.append(line_pos) |
| 874 | starts.append(line_pos) |
| 875 | last_was_empty = False |
| 876 | elif not line: |
| 877 | if last_was_empty: |
| 878 | stops.append(line_pos - len(linesep)) |
| 879 | else: |
| 880 | stops.append(line_pos) |
| 881 | break |
| 882 | elif line == linesep: |
| 883 | last_was_empty = True |
| 884 | else: |
| 885 | last_was_empty = False |
| 886 | self._toc = dict(enumerate(zip(starts, stops))) |
| 887 | self._next_key = len(self._toc) |
| 888 | self._file_length = self._file.tell() |
| 889 | |
| 890 | |
| 891 | class MMDF(_mboxMMDF): |