1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 comment_re
= re
.compile(r
"//[^\n]*\n|/\*.*\*/", re
.S
)
13 (?:\((.*)\))?$ # optional param tys
19 def read_decls(filename
):
20 """Parse & yield C-style decls from an input file"""
21 with
open(filename
, "r") as fd
:
22 # Strip comments from the source text.
23 text
= comment_re
.sub("", fd
.read())
25 # Parse individual declarations.
26 raw_decls
= [d
.strip() for d
in text
.split(";") if d
.strip()]
28 match
= decl_re
.match(raw
)
30 raise "Invalid decl: %s" % raw
32 ty
, name
, params
= match
.groups()
33 if params
is not None:
34 params
= [a
.strip() for a
in params
.split(",") if a
.strip()]
35 yield ty
, name
, params
38 def generate(fd
, consts_path
, unicodes_path
, template_path
, compiler
):
40 with
open(template_path
, "r") as template_fd
:
41 template
= string
.Template(template_fd
.read())
45 # Each constant should be saved to a temporary, and then re-assigned to a
46 # constant with the correct name, allowing the value to be determined by
47 # the actual definition.
48 for ty
, name
, args
in read_decls(consts_path
):
49 assert args
is None, "parameters in const decl!"
51 decls
+= textwrap
.dedent(
54 constexpr {ty} _tmp_{name} = {name};
56 constexpr {ty} {name} = _tmp_{name};
63 # Each unicode declaration defines a static inline function with the
64 # correct types which calls the 'A' or 'W'-suffixed versions of the
65 # function. Full types are required here to ensure that '0' to 'nullptr'
66 # coersions are preserved.
67 for ty
, name
, args
in read_decls(unicodes_path
):
68 assert args
is not None, "argument list required for unicode decl"
70 # Parameter & argument string list
71 params
= ", ".join("%s a%d" % (ty
, i
) for i
, ty
in enumerate(args
))
72 args
= ", ".join("a%d" % i
for i
in range(len(args
)))
74 decls
+= textwrap
.dedent(
78 static inline {ty} WINAPI
82 return {name}W({args});
89 ty
=ty
, name
=name
, params
=params
, args
=args
93 # Write out the resulting file
94 fd
.write(template
.substitute(decls
=decls
))