scuffed-code/icu4c/source/data/buildtool/comment_stripper.py
Shane Carr b0d572c7f1 ICU-10923 Python logic for resource filters.
- Adds schema validation for config file
- Adds JSON comment stripping utility
2018-12-17 17:11:25 -08:00

52 lines
1.7 KiB
Python

# 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