OILS
/
frontend
/
signal_gen.py
1 |
#!/usr/bin/env python2
|
2 |
"""Signal_gen.py."""
|
3 |
from __future__ import print_function
|
4 |
|
5 |
import sys
|
6 |
|
7 |
import signal_def
|
8 |
|
9 |
|
10 |
def CppPrintSignals(f):
|
11 |
f.write("""
|
12 |
void PrintSignals() {
|
13 |
""")
|
14 |
|
15 |
for abbrev, _ in signal_def._BY_NUMBER:
|
16 |
name = "SIG%s" % (abbrev,)
|
17 |
f.write("""\
|
18 |
#ifdef %s
|
19 |
printf("%%2d %s\\n", %s);
|
20 |
#endif
|
21 |
""" % (name, name, name))
|
22 |
|
23 |
f.write("}\n")
|
24 |
|
25 |
|
26 |
def CppGetNumber(f):
|
27 |
f.write("""\
|
28 |
int GetNumber(Str* sig_spec) {
|
29 |
int length = len(sig_spec);
|
30 |
if (length == 0) {
|
31 |
return NO_SIGNAL;
|
32 |
}
|
33 |
|
34 |
const char* data = sig_spec->data_;
|
35 |
|
36 |
""")
|
37 |
for abbrev, _ in signal_def._BY_NUMBER:
|
38 |
name = "SIG%s" % (abbrev,)
|
39 |
f.write("""\
|
40 |
if ((length == %d && memcmp("%s", data, %d) == 0) ||
|
41 |
(length == %d && memcmp("%s", data, %d) == 0)) {
|
42 |
return %s;
|
43 |
}
|
44 |
""" % (len(name), name, len(name), len(abbrev), abbrev, len(abbrev), name))
|
45 |
f.write("""\
|
46 |
return NO_SIGNAL;
|
47 |
}
|
48 |
""")
|
49 |
|
50 |
|
51 |
def main(argv):
|
52 |
try:
|
53 |
action = argv[1]
|
54 |
except IndexError:
|
55 |
raise RuntimeError('Action required')
|
56 |
|
57 |
if action == 'cpp':
|
58 |
out_prefix = argv[2]
|
59 |
|
60 |
with open(out_prefix + '.h', 'w') as f:
|
61 |
f.write("""\
|
62 |
#ifndef FRONTEND_SIGNAL_H
|
63 |
#define FRONTEND_SIGNAL_H
|
64 |
|
65 |
#include "mycpp/runtime.h"
|
66 |
|
67 |
namespace signal_def {
|
68 |
|
69 |
const int NO_SIGNAL = -1;
|
70 |
|
71 |
void PrintSignals();
|
72 |
|
73 |
int GetNumber(Str* sig_spec);
|
74 |
|
75 |
} // namespace signal_def
|
76 |
|
77 |
#endif // FRONTEND_SIGNAL_H
|
78 |
""")
|
79 |
|
80 |
with open(out_prefix + '.cc', 'w') as f:
|
81 |
f.write("""\
|
82 |
#include "signal.h"
|
83 |
|
84 |
#include <signal.h> // SIG*
|
85 |
#include <stdio.h> // printf
|
86 |
|
87 |
namespace signal_def {
|
88 |
|
89 |
""")
|
90 |
CppPrintSignals(f)
|
91 |
f.write("\n")
|
92 |
CppGetNumber(f)
|
93 |
|
94 |
f.write("""\
|
95 |
|
96 |
} // namespace signal_def
|
97 |
""")
|
98 |
|
99 |
|
100 |
if __name__ == '__main__':
|
101 |
try:
|
102 |
main(sys.argv)
|
103 |
except RuntimeError as e:
|
104 |
print('FATAL: %s' % e, file=sys.stderr)
|
105 |
sys.exit(1)
|