Generate key-to-(start, stop) table of contents.
(self)
| 911 | f.write(linesep) |
| 912 | |
| 913 | def _generate_toc(self): |
| 914 | """Generate key-to-(start, stop) table of contents.""" |
| 915 | starts, stops = [], [] |
| 916 | last_was_empty = False |
| 917 | self._file.seek(0) |
| 918 | while True: |
| 919 | line_pos = self._file.tell() |
| 920 | line = self._file.readline() |
| 921 | if line.startswith(b'From '): |
| 922 | if len(stops) < len(starts): |
| 923 | if last_was_empty: |
| 924 | stops.append(line_pos - len(linesep)) |
| 925 | else: |
| 926 | # The last line before the "From " line wasn't |
| 927 | # blank, but we consider it a start of a |
| 928 | # message anyway. |
| 929 | stops.append(line_pos) |
| 930 | starts.append(line_pos) |
| 931 | last_was_empty = False |
| 932 | elif not line: |
| 933 | if last_was_empty: |
| 934 | stops.append(line_pos - len(linesep)) |
| 935 | else: |
| 936 | stops.append(line_pos) |
| 937 | break |
| 938 | elif line == linesep: |
| 939 | last_was_empty = True |
| 940 | else: |
| 941 | last_was_empty = False |
| 942 | self._toc = dict(enumerate(zip(starts, stops))) |
| 943 | self._next_key = len(self._toc) |
| 944 | self._file_length = self._file.tell() |
| 945 | |
| 946 | |
| 947 | class MMDF(_mboxMMDF): |