| 3 | from .exceptions import EOF, TIMEOUT |
| 4 | |
| 5 | class Expecter(object): |
| 6 | def __init__(self, spawn, searcher, searchwindowsize=-1): |
| 7 | self.spawn = spawn |
| 8 | self.searcher = searcher |
| 9 | # A value of -1 means to use the figure from spawn, which should |
| 10 | # be None or a positive number. |
| 11 | if searchwindowsize == -1: |
| 12 | searchwindowsize = spawn.searchwindowsize |
| 13 | self.searchwindowsize = searchwindowsize |
| 14 | self.lookback = None |
| 15 | if hasattr(searcher, 'longest_string'): |
| 16 | self.lookback = searcher.longest_string |
| 17 | |
| 18 | def do_search(self, window, freshlen): |
| 19 | spawn = self.spawn |
| 20 | searcher = self.searcher |
| 21 | if freshlen > len(window): |
| 22 | freshlen = len(window) |
| 23 | index = searcher.search(window, freshlen, self.searchwindowsize) |
| 24 | if index >= 0: |
| 25 | spawn._buffer = spawn.buffer_type() |
| 26 | spawn._buffer.write(window[searcher.end:]) |
| 27 | spawn.before = spawn._before.getvalue()[ |
| 28 | 0:-(len(window) - searcher.start)] |
| 29 | spawn._before = spawn.buffer_type() |
| 30 | spawn._before.write(window[searcher.end:]) |
| 31 | spawn.after = window[searcher.start:searcher.end] |
| 32 | spawn.match = searcher.match |
| 33 | spawn.match_index = index |
| 34 | # Found a match |
| 35 | return index |
| 36 | elif self.searchwindowsize or self.lookback: |
| 37 | maintain = self.searchwindowsize or self.lookback |
| 38 | if spawn._buffer.tell() > maintain: |
| 39 | spawn._buffer = spawn.buffer_type() |
| 40 | spawn._buffer.write(window[-maintain:]) |
| 41 | |
| 42 | def existing_data(self): |
| 43 | # First call from a new call to expect_loop or expect_async. |
| 44 | # self.searchwindowsize may have changed. |
| 45 | # Treat all data as fresh. |
| 46 | spawn = self.spawn |
| 47 | before_len = spawn._before.tell() |
| 48 | buf_len = spawn._buffer.tell() |
| 49 | freshlen = before_len |
| 50 | if before_len > buf_len: |
| 51 | if not self.searchwindowsize: |
| 52 | spawn._buffer = spawn.buffer_type() |
| 53 | window = spawn._before.getvalue() |
| 54 | spawn._buffer.write(window) |
| 55 | elif buf_len < self.searchwindowsize: |
| 56 | spawn._buffer = spawn.buffer_type() |
| 57 | spawn._before.seek( |
| 58 | max(0, before_len - self.searchwindowsize)) |
| 59 | window = spawn._before.read() |
| 60 | spawn._buffer.write(window) |
| 61 | else: |
| 62 | spawn._buffer.seek(max(0, buf_len - self.searchwindowsize)) |
no outgoing calls
no test coverage detected
searching dependent graphs…