No Bug, mozilla-central repo-update HSTS HPKP remote-settings tld-suffixes ct-logs...
[gecko.git] / config / make-windows-h-wrapper.py
blob91d335ba420c1b586487bfa491b56d3e6c9d276e
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 import re
6 import string
7 import textwrap
9 comment_re = re.compile(r"//[^\n]*\n|/\*.*\*/", re.S)
10 decl_re = re.compile(
11 r"""^(.+)\s+ # type
12 (\w+)\s* # name
13 (?:\((.*)\))?$ # optional param tys
14 """,
15 re.X | re.S,
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()]
27 for raw in raw_decls:
28 match = decl_re.match(raw)
29 if match is None:
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):
39 # Parse the template
40 with open(template_path, "r") as template_fd:
41 template = string.Template(template_fd.read())
43 decls = ""
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(
52 """
53 #ifdef {name}
54 constexpr {ty} _tmp_{name} = {name};
55 #undef {name}
56 constexpr {ty} {name} = _tmp_{name};
57 #endif
58 """.format(
59 ty=ty, name=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(
75 """
76 #ifdef {name}
77 #undef {name}
78 static inline {ty} WINAPI
79 {name}({params})
80 #ifdef UNICODE
82 return {name}W({args});
84 #else
85 = delete;
86 #endif
87 #endif
88 """.format(
89 ty=ty, name=name, params=params, args=args
93 # Write out the resulting file
94 fd.write(template.substitute(decls=decls))