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