Skip to content

Commit

Permalink
Make content optional
Browse files Browse the repository at this point in the history
- Some preprocessors read the file directly
  • Loading branch information
virtuald committed Oct 8, 2023
1 parent d94df61 commit 3d23375
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 7 deletions.
2 changes: 1 addition & 1 deletion cxxheaderparser/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Callable, Optional

#: arguments are (filename, content)
PreprocessorFunction = Callable[[str, str], str]
PreprocessorFunction = Callable[[str, Optional[str]], str]


@dataclass
Expand Down
10 changes: 9 additions & 1 deletion cxxheaderparser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,10 @@ class CxxParser:
def __init__(
self,
filename: str,
content: str,
content: typing.Optional[str],
visitor: CxxVisitor,
options: typing.Optional[ParserOptions] = None,
encoding: typing.Optional[str] = None,
) -> None:
self.visitor = visitor
self.filename = filename
Expand All @@ -85,6 +86,13 @@ def __init__(
if options and options.preprocessor is not None:
content = options.preprocessor(filename, content)

if content is None:
if encoding is None:
encoding = "utf-8-sig"

with open(filename, "r", encoding=encoding) as fp:
content = fp.read()

self.lex: lexer.TokenStream = lexer.LexerTokenStream(filename, content)

global_ns = NamespaceDecl([], False)
Expand Down
10 changes: 8 additions & 2 deletions cxxheaderparser/preprocessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def make_gcc_preprocessor(
if not encoding:
encoding = "utf-8"

def _preprocess_file(filename: str, content: str) -> str:
def _preprocess_file(filename: str, content: typing.Optional[str]) -> str:
cmd = gcc_args + ["-w", "-E", "-C"]

for p in include_paths:
Expand All @@ -86,6 +86,8 @@ def _preprocess_file(filename: str, content: str) -> str:
if filename == "<str>":
cmd.append("-")
filename = "<stdin>"
if content is None:
raise PreprocessorError("no content specified for stdin")
kwargs["input"] = content
else:
cmd.append(filename)
Expand Down Expand Up @@ -191,7 +193,7 @@ def make_pcpp_preprocessor(
if pcpp is None:
raise PreprocessorError("pcpp is not installed")

def _preprocess_file(filename: str, content: str) -> str:
def _preprocess_file(filename: str, content: typing.Optional[str]) -> str:
pp = _CustomPreprocessor(encoding, passthru_includes)
if include_paths:
for p in include_paths:
Expand All @@ -203,6 +205,10 @@ def _preprocess_file(filename: str, content: str) -> str:
if not retain_all_content:
pp.line_directive = "#line"

if content is None:
with open(filename, "r", encoding=encoding) as fp:
content = fp.read()

pp.parse(content, filename)

if pp.errors:
Expand Down
9 changes: 6 additions & 3 deletions cxxheaderparser/simple.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,10 @@ def parse_file(
if filename == "-":
content = sys.stdin.read()
else:
with open(filename, encoding=encoding) as fp:
content = fp.read()
content = None

return parse_string(content, filename=filename, options=options)
visitor = SimpleCxxVisitor()
parser = CxxParser(filename, content, visitor, options)
parser.parse()

return visitor.data

0 comments on commit 3d23375

Please sign in to comment.