62 def _Preprocess(self, template, filename, conditions):
63
64 def error(lineno, message):
65 raise Exception('%s:%s: %s' % (filename, lineno, message))
66
67 lines = template.splitlines(True)
68 out = []
69
70 condition_stack = []
71 active = True
72 seen_else = False
73
74 for (lineno, full_line) in enumerate(lines):
75 line = full_line.strip()
76
77 if line.startswith('$'):
78 words = line.split()
79 directive = words[0]
80
81 if directive == '$if':
82 if len(words) != 2:
83 error(lineno,
'$if does not have single variable')
84 variable = words[1]
85 if variable in conditions:
86 condition_stack.append((active, seen_else))
87 active = active and conditions[variable]
88 seen_else = False
89 else:
90 error(lineno,
"Unknown $if variable '%s'" % variable)
91
92 elif directive == '$else':
93 if not condition_stack:
94 error(lineno,
'$else without $if')
95 if seen_else:
96 raise error(lineno,
'Double $else')
97 seen_else = True
98 (parentactive,
99 _) = condition_stack[len(condition_stack) - 1]
100 active = not active and parentactive
101
102 elif directive == '$endif':
103 if not condition_stack:
104 error(lineno,
'$endif without $if')
105 (active, seen_else) = condition_stack.pop()
106
107 else:
108
109 if active:
110 out.append(full_line)
111 elif line.startswith('//$'):
112 pass
113
114 else:
115 if active:
116 out.append(full_line)
117 continue
118
119 if condition_stack:
120 error(len(lines),
'Unterminated $if')
121
122 return ''.join(out)
const uint8_t uint32_t uint32_t GError ** error