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