blob: 4001f2f675e76467b61c08501020ccf6f99e6732 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# Copyright (C) 2018 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
import io
class CommentStripper(object):
"""Removes lines starting with "//" from a file stream."""
def __init__(self, f):
self.f = f
self.state = 0
def read(self, size=-1):
bytes = self.f.read(size)
# TODO: Do we need to read more bytes if comments were stripped
# in order to obey the size request?
return "".join(self._strip_comments(bytes))
def _strip_comments(self, bytes):
for byte in bytes:
if self.state == 0:
# state 0: start of a line
if byte == "/":
self.state = 1
elif byte == "\n":
self.state = 0
yield byte
else:
self.state = 2
yield byte
elif self.state == 1:
# state 1: read a single '/'
if byte == "/":
self.state = 3
elif byte == "\n":
self.state = 0
yield "/" # the one that was skipped
yield "\n"
else:
self.state = 2
yield "/" # the one that was skipped
yield byte
elif self.state == 2:
# state 2: middle of a line, no comment
if byte == "\n":
self.state = 0
yield byte
elif self.state == 3:
# state 3: inside a comment
if byte == "\n":
self.state = 0
|