1181624Skmacy#!/usr/bin/python
2181624Skmacy
3181624Skmacyimport sys, re;
4183375Skmacyfrom structs import unions, structs, defines;
5181624Skmacy
6181624Skmacy# command line arguments
7181624Skmacyarch    = sys.argv[1];
8181624Skmacyoutfile = sys.argv[2];
9181624Skmacyinfiles = sys.argv[3:];
10181624Skmacy
11181624Skmacy
12181624Skmacy###########################################################################
13181624Skmacy# configuration #2: architecture information
14181624Skmacy
15181624Skmacyinttypes = {};
16181624Skmacyheader = {};
17181624Skmacyfooter = {};
18181624Skmacy
19181624Skmacy# x86_32
20181624Skmacyinttypes["x86_32"] = {
21181624Skmacy    "unsigned long" : "uint32_t",
22181624Skmacy    "long"          : "uint32_t",
23181624Skmacy    "xen_pfn_t"     : "uint32_t",
24181624Skmacy};
25181624Skmacyheader["x86_32"] = """
26181624Skmacy#define __i386___X86_32 1
27181624Skmacy#pragma pack(4)
28181624Skmacy""";
29181624Skmacyfooter["x86_32"] = """
30181624Skmacy#pragma pack()
31181624Skmacy""";
32181624Skmacy
33181624Skmacy# x86_64
34181624Skmacyinttypes["x86_64"] = {
35181624Skmacy    "unsigned long" : "__align8__ uint64_t",
36181624Skmacy    "long"          : "__align8__ uint64_t",
37181624Skmacy    "xen_pfn_t"     : "__align8__ uint64_t",
38181624Skmacy};
39181624Skmacyheader["x86_64"] = """
40181624Skmacy#ifdef __GNUC__
41181624Skmacy# define __DECL_REG(name) union { uint64_t r ## name, e ## name; }
42181624Skmacy# define __align8__ __attribute__((aligned (8)))
43181624Skmacy#else
44181624Skmacy# define __DECL_REG(name) uint64_t r ## name
45181624Skmacy# define __align8__ FIXME
46181624Skmacy#endif
47181624Skmacy#define __x86_64___X86_64 1
48181624Skmacy""";
49181624Skmacy
50181624Skmacy# ia64
51181624Skmacyinttypes["ia64"] = {
52181624Skmacy    "unsigned long" : "__align8__ uint64_t",
53181624Skmacy    "long"          : "__align8__ uint64_t",
54181624Skmacy    "xen_pfn_t"     : "__align8__ uint64_t",
55181624Skmacy    "long double"   : "__align16__ ldouble_t",
56181624Skmacy};
57181624Skmacyheader["ia64"] = """
58181624Skmacy#define __align8__ __attribute__((aligned (8)))
59181624Skmacy#define __align16__ __attribute__((aligned (16)))
60181624Skmacytypedef unsigned char ldouble_t[16];
61181624Skmacy""";
62181624Skmacy
63181624Skmacy
64181624Skmacy###########################################################################
65181624Skmacy# main
66181624Skmacy
67181624Skmacyinput  = "";
68181624Skmacyoutput = "";
69181624Skmacyfileid = re.sub("[-.]", "_", "__FOREIGN_%s__" % outfile.upper());
70181624Skmacy
71181624Skmacy# read input header files
72181624Skmacyfor name in infiles:
73181624Skmacy    f = open(name, "r");
74181624Skmacy    input += f.read();
75181624Skmacy    f.close();
76181624Skmacy
77181624Skmacy# add header
78181624Skmacyoutput += """
79181624Skmacy/*
80181624Skmacy * public xen defines and struct for %s
81181624Skmacy * generated by %s -- DO NOT EDIT
82181624Skmacy */
83181624Skmacy
84181624Skmacy#ifndef %s
85181624Skmacy#define %s 1
86181624Skmacy
87181624Skmacy""" % (arch, sys.argv[0], fileid, fileid)
88181624Skmacy
89181624Skmacyif arch in header:
90181624Skmacy    output += header[arch];
91181624Skmacy    output += "\n";
92181624Skmacy
93181624Skmacy# add defines to output
94181624Skmacyfor line in re.findall("#define[^\n]+", input):
95181624Skmacy    for define in defines:
96181624Skmacy        regex = "#define\s+%s\\b" % define;
97181624Skmacy        match = re.search(regex, line);
98181624Skmacy        if None == match:
99181624Skmacy            continue;
100181624Skmacy        if define.upper()[0] == define[0]:
101181624Skmacy            replace = define + "_" + arch.upper();
102181624Skmacy        else:
103181624Skmacy            replace = define + "_" + arch;
104181624Skmacy        regex = "\\b%s\\b" % define;
105181624Skmacy        output += re.sub(regex, replace, line) + "\n";
106181624Skmacyoutput += "\n";
107181624Skmacy
108181624Skmacy# delete defines, comments, empty lines
109181624Skmacyinput = re.sub("#define[^\n]+\n", "", input);
110181624Skmacyinput = re.compile("/\*(.*?)\*/", re.S).sub("", input)
111181624Skmacyinput = re.compile("\n\s*\n", re.S).sub("\n", input);
112181624Skmacy
113183375Skmacy# add unions to output
114183375Skmacyfor union in unions:
115183375Skmacy    regex = "union\s+%s\s*\{(.*?)\n\};" % union;
116183375Skmacy    match = re.search(regex, input, re.S)
117183375Skmacy    if None == match:
118183375Skmacy        output += "#define %s_has_no_%s 1\n" % (arch, union);
119183375Skmacy    else:
120183375Skmacy        output += "union %s_%s {%s\n};\n" % (union, arch, match.group(1));
121183375Skmacy    output += "\n";
122183375Skmacy
123181624Skmacy# add structs to output
124181624Skmacyfor struct in structs:
125181624Skmacy    regex = "struct\s+%s\s*\{(.*?)\n\};" % struct;
126181624Skmacy    match = re.search(regex, input, re.S)
127181624Skmacy    if None == match:
128181624Skmacy        output += "#define %s_has_no_%s 1\n" % (arch, struct);
129181624Skmacy    else:
130181624Skmacy        output += "struct %s_%s {%s\n};\n" % (struct, arch, match.group(1));
131181624Skmacy        output += "typedef struct %s_%s %s_%s_t;\n" % (struct, arch, struct, arch);
132181624Skmacy    output += "\n";
133181624Skmacy
134181624Skmacy# add footer
135181624Skmacyif arch in footer:
136181624Skmacy    output += footer[arch];
137181624Skmacy    output += "\n";
138181624Skmacyoutput += "#endif /* %s */\n" % fileid;
139181624Skmacy
140181624Skmacy# replace: defines
141181624Skmacyfor define in defines:
142181624Skmacy    if define.upper()[0] == define[0]:
143181624Skmacy        replace = define + "_" + arch.upper();
144181624Skmacy    else:
145181624Skmacy        replace = define + "_" + arch;
146181624Skmacy    output = re.sub("\\b%s\\b" % define, replace, output);
147181624Skmacy
148183375Skmacy# replace: unions
149183375Skmacyfor union in unions:
150183375Skmacy    output = re.sub("\\b(union\s+%s)\\b" % union, "\\1_%s" % arch, output);
151183375Skmacy
152181624Skmacy# replace: structs + struct typedefs
153181624Skmacyfor struct in structs:
154181624Skmacy    output = re.sub("\\b(struct\s+%s)\\b" % struct, "\\1_%s" % arch, output);
155181624Skmacy    output = re.sub("\\b(%s)_t\\b" % struct, "\\1_%s_t" % arch, output);
156181624Skmacy
157181624Skmacy# replace: integer types
158241833Seadlerintegers = list(inttypes[arch].keys());
159181624Skmacyintegers.sort(lambda a, b: cmp(len(b),len(a)));
160181624Skmacyfor type in integers:
161181624Skmacy    output = re.sub("\\b%s\\b" % type, inttypes[arch][type], output);
162181624Skmacy
163181624Skmacy# print results
164181624Skmacyf = open(outfile, "w");
165181624Skmacyf.write(output);
166181624Skmacyf.close;
167181624Skmacy
168