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/.
5 from __future__
import absolute_import
10 comment_re
= re
.compile(r
'//[^\n]*\n|/\*.*\*/', re
.S
)
11 decl_re
= re
.compile(r
'''^(.+)\s+ # type
13 (?:\((.*)\))?$ # optional param tys
17 def read_decls(filename
):
18 """Parse & yield C-style decls from an input file"""
19 with
open(filename
, 'r') as fd
:
20 # Strip comments from the source text.
21 text
= comment_re
.sub('', fd
.read())
23 # Parse individual declarations.
24 raw_decls
= [d
.strip() for d
in text
.split(';') if d
.strip()]
26 match
= decl_re
.match(raw
)
28 raise "Invalid decl: %s" % raw
30 ty
, name
, params
= match
.groups()
31 if params
is not None:
32 params
= [a
.strip() for a
in params
.split(',') if a
.strip()]
33 yield ty
, name
, params
36 def generate(fd
, consts_path
, unicodes_path
, template_path
, compiler
):
38 with
open(template_path
, 'r') as template_fd
:
39 template
= string
.Template(template_fd
.read())
43 # Each constant should be saved to a temporary, and then re-assigned to a
44 # constant with the correct name, allowing the value to be determined by
45 # the actual definition.
46 for ty
, name
, args
in read_decls(consts_path
):
47 assert args
is None, "parameters in const decl!"
49 decls
+= textwrap
.dedent("""
51 constexpr {ty} _tmp_{name} = {name};
53 constexpr {ty} {name} = _tmp_{name};
55 """.format(ty
=ty
, name
=name
))
57 # Each unicode declaration defines a static inline function with the
58 # correct types which calls the 'A' or 'W'-suffixed versions of the
59 # function. Full types are required here to ensure that '0' to 'nullptr'
60 # coersions are preserved.
61 for ty
, name
, args
in read_decls(unicodes_path
):
62 assert args
is not None, "argument list required for unicode decl"
64 # Parameter & argument string list
65 params
= ', '.join('%s a%d' % (ty
, i
) for i
, ty
in enumerate(args
))
66 args
= ', '.join('a%d' % i
for i
in range(len(args
)))
68 decls
+= textwrap
.dedent("""
71 static inline {ty} WINAPI
75 return {name}W({args});
77 return {name}A({args});
81 """.format(ty
=ty
, name
=name
, params
=params
, args
=args
))
83 # Write out the resulting file
84 fd
.write(template
.substitute(decls
=decls
))