diff options
Diffstat (limited to 'Tools/clinic/cpp.py')
-rw-r--r-- | Tools/clinic/cpp.py | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/Tools/clinic/cpp.py b/Tools/clinic/cpp.py index e099590..77f5f96 100644 --- a/Tools/clinic/cpp.py +++ b/Tools/clinic/cpp.py @@ -141,23 +141,15 @@ class Monitor: token = fields[0].lower() condition = ' '.join(fields[1:]).strip() - if_tokens = {'if', 'ifdef', 'ifndef'} - all_tokens = if_tokens | {'elif', 'else', 'endif'} - - if token not in all_tokens: - return - - # cheat a little here, to reuse the implementation of if - if token == 'elif': - pop_stack() - token = 'if' - - if token in if_tokens: + if token in {'if', 'ifdef', 'ifndef', 'elif'}: if not condition: self.fail("Invalid format for #" + token + " line: no argument!") - if token == 'if': + if token in {'if', 'elif'}: if not self.is_a_simple_defined(condition): condition = "(" + condition + ")" + if token == 'elif': + previous_token, previous_condition = pop_stack() + self.stack.append((previous_token, negate(previous_condition))) else: fields = condition.split() if len(fields) != 1: @@ -166,18 +158,21 @@ class Monitor: condition = 'defined(' + symbol + ')' if token == 'ifndef': condition = '!' + condition + token = 'if' - self.stack.append(("if", condition)) - if self.verbose: - print(self.status()) - return + self.stack.append((token, condition)) - previous_token, previous_condition = pop_stack() + elif token == 'else': + previous_token, previous_condition = pop_stack() + self.stack.append((previous_token, negate(previous_condition))) - if token == 'else': - self.stack.append(('else', negate(previous_condition))) elif token == 'endif': - pass + while pop_stack()[0] != 'if': + pass + + else: + return + if self.verbose: print(self.status()) |