summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Martin <consume.noise@gmail.com>2013-05-13 23:33:04 +0200
committerKeith Packard <keithp@keithp.com>2013-11-07 04:50:34 -0800
commitd2eefb77b961fa957e0497e755e448c4fd5df8c3 (patch)
tree17944d33925765508a310f65f61e5c730cb73b77
parent1ac282213543e5f0bbcf621d3798a6c6fad3120b (diff)
c_client.py: Handle multiple expr. in a bitcase
Adopt a change from xcbgen. With that modification the expression in a bitcase became a list of expressions to support multiple <enumref> in a <bitcase>. Signed-off-by: Daniel Martin <consume.noise@gmail.com> Signed-off-by: Peter Harris <pharris@opentext.com>
-rw-r--r--src/c_client.py18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/c_client.py b/src/c_client.py
index ec66223..942e78a 100644
--- a/src/c_client.py
+++ b/src/c_client.py
@@ -687,10 +687,20 @@ def _c_serialize_helper_switch(context, self, complex_name,
switch_expr = _c_accessor_get_expr(self.expr, None)
for b in self.bitcases:
- bitcase_expr = _c_accessor_get_expr(b.type.expr, None)
- code_lines.append(' if(%s & %s) {' % (switch_expr, bitcase_expr))
-# code_lines.append(' printf("switch %s: entering bitcase section %s (mask=%%%%d)...\\n", %s);' %
-# (self.name[-1], b.type.name[-1], bitcase_expr))
+ len_expr = len(b.type.expr)
+ for n, expr in enumerate(b.type.expr):
+ bitcase_expr = _c_accessor_get_expr(expr, None)
+ # only one <enumref> in the <bitcase>
+ if len_expr == 1:
+ code_lines.append(' if(%s & %s) {' % (switch_expr, bitcase_expr))
+ # multiple <enumref> in the <bitcase>
+ elif n == 0: # first
+ code_lines.append(' if((%s & %s) ||' % (switch_expr, bitcase_expr))
+ elif len_expr == (n + 1): # last
+ code_lines.append(' (%s & %s)) {' % (switch_expr, bitcase_expr))
+ else: # between first and last
+ code_lines.append(' (%s & %s) ||' % (switch_expr, bitcase_expr))
+
b_prefix = prefix
if b.type.has_name:
b_prefix = prefix + [(b.c_field_name, '.', b.type)]