Simplify a bit before tackling this.
Chris Pressey
10 years ago
32 | 32 | @property |
33 | 33 | def column_number(self): |
34 | 34 | return self._column_number |
35 | ||
36 | def advance(self, inp): | |
37 | """Given a string that we have just consumed from the buffer, | |
38 | return new line_number and column_number. | |
39 | ||
40 | """ | |
41 | line_number = self.line_number | |
42 | column_number = self.column_number | |
43 | for char in inp: | |
44 | if char == '\n': | |
45 | line_number += 1 | |
46 | column_number = 1 | |
47 | else: | |
48 | column_number += 1 | |
49 | return (line_number, column_number) | |
35 | 50 | |
36 | 51 | def chop(self, amount): |
37 | 52 | raise NotImplementedError |
86 | 101 | self.string, self.filename, self.position, self.line_number, self.column_number |
87 | 102 | ) |
88 | 103 | |
89 | def __eq__(self, other): | |
90 | return (self.string == other.string and | |
91 | self._filename == other.filename and | |
92 | self.position == other.position and | |
93 | self._line_number == other.line_number and | |
94 | self._column_number == other.column_number) | |
95 | ||
96 | 104 | def chop(self, amount): |
97 | 105 | assert self.position <= len(self.string) - amount, \ |
98 | 106 | "attempt made to chop past end of buffer" |
99 | 107 | result = self.string[self.position:self.position + amount] |
100 | 108 | |
101 | line_number = self.line_number | |
102 | column_number = self.column_number | |
103 | for char in result: | |
104 | if char == '\n': | |
105 | line_number += 1 | |
106 | column_number = 1 | |
107 | else: | |
108 | column_number += 1 | |
109 | ||
109 | (line_number, column_number) = self.advance(result) | |
110 | 110 | new_buffer = StringBuffer(self.string, |
111 | 111 | filename=self._filename, |
112 | 112 | position=self.position + amount, |
141 | 141 | print "BAD" |
142 | 142 | raise |
143 | 143 | |
144 | def __eq__(self, other): | |
145 | return (self.file == other.file and | |
146 | self._filename == other.filename and | |
147 | self.position == other.position and | |
148 | self._line_number == other.line_number and | |
149 | self._column_number == other.column_number) | |
150 | ||
151 | 144 | def chop(self, amount): |
152 | 145 | self.file.seek(self.position, 0) |
153 | 146 | result = self.file.read(amount) |
154 | 147 | |
155 | line_number = self.line_number | |
156 | column_number = self.column_number | |
157 | for char in result: | |
158 | if char == '\n': | |
159 | line_number += 1 | |
160 | column_number = 1 | |
161 | else: | |
162 | column_number += 1 | |
163 | ||
148 | (line_number, column_number) = self.advance(result) | |
164 | 149 | new_buffer = FileBuffer(self.file, |
165 | 150 | filename=self._filename, |
166 | 151 | position=self.position + amount, |