3ec668f25fd8ba6b4da8d4808dfedddfe9e5fca4
[nas-tools.git] / input-eventd / gen / gen.py
1 # -*- coding: utf-8 -*-
2 # This file is part of the lacie-nas project
3 #
4 # Copyright 2011 Benoît Canet
5 #
6 # Authors:
7 # - Benoît Canet <benoit.canet@gmail.com>
8 #
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; version 3.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program.  If not, see <http://www.gnu.org/licenses/>
20
21 from parser import *
22
23 def license():
24         return """/*
25  * This file is automaticaly generated by input-eventd's gen a script of the
26  * lacie-nas project
27  *
28  * Code : git clone git://lacie-nas.org/nas-tools.git
29  */
30 """
31
32 def generate_header():
33         result = """
34 #ifndef INPUT_TABLES_H
35 #define INPUT_TABLES_H
36
37 #include <stdint.h>
38 """
39         return result
40
41 def generate_footer():
42         return "#endif\n"
43
44 def generate_struct():
45         return """
46 struct input_entry {
47         uint16_t value;
48         char     string[128];
49 };      
50
51 """
52
53 def generate_declaration(name):
54         return "struct input_entry %s[] = {\n" % name
55
56 def generate_table(name, array):
57         result = ""
58         result += generate_declaration(name)
59
60         for key in array:
61                 result += '\t{'
62                 result += '.value = %s, ' % key
63                 result += '.string = "%s"' % array[key]
64                 result += '},\n'
65         
66         result += "\t{}"
67         result += "\n};\n\n"
68         return result
69
70 def generate_index_struct():
71         return """
72 struct index_entry {
73         uint16_t type;
74         uint16_t count;
75         struct input_entry *codes;
76 };
77
78 """
79
80 def generate_index(types, not_empty, codes_count):
81         result = "struct index_entry table_index[] = {\n"
82
83         for key in types:
84                 value = types[key][3:]
85                 if value in not_empty:
86                         value = "codes_"+ value.lower()
87                         result += "\t{.type = %s, .codes = %s, .count = %i},\n" % \
88                                          (key, value, codes_count[value])
89
90         result += "\t{}"
91         result += "\n};\n\n"
92         return result
93
94 def generate(filename):
95         result = license()
96         result += generate_header()
97         result += generate_struct()
98         result += generate_index_struct()
99
100         types = parse_file_by_prefix(filename, "EV_")
101         result += generate_table("event_types", types)
102
103         not_empty_types = []
104         codes_count = {}
105         for t in get_event_type_list(types):
106                 codes = parse_file_by_prefix(filename, t+"_")
107                 if len(codes):
108                         table_name = "codes_"+t.lower()
109                         result += generate_table(table_name, codes)
110                         not_empty_types.append(t)
111                         codes_count[table_name] = len(codes)
112
113         result += generate_index(types, not_empty_types, codes_count)
114         result += generate_footer()
115
116         return result
117