24 Evaluate and reduce #ifdef / #ifndef blocks based on specified keys.
29 List of preprocessor keys to evaluate.
30 Keys preceded by '%' are treated as undefined (False).
31 Example: ['KEY1', '%KEY2'] means KEY1=True, KEY2=False.
33 Transformation Examples
34 ----------------------
35 If 'K' is in keys (K=True):
43 If '%K' is in keys (K=False):
53 - Only handles #ifdef and #ifndef (not "#if defined ...")
54 - Nested if/ifdef/ifndef are supported
55 - Code not matching any conditional is kept unchanged
60 parents = set(self.getParent(cppNode)
for cppNode
in self.findall(
'.//{*}cpp')
61 if (cppNode.text.startswith(
'#ifdef ')
or
62 cppNode.text.startswith(
'#ifndef ')))
73 if tag(node) ==
'cpp':
74 if node.text.startswith(
'#ifdef '):
75 k = alltext(node).split(
' ')[1].strip()
77 toRemove.append((node, par))
80 toRemove.append((node, par))
85 toRemove.append((node, par))
86 elif node.text.startswith(
'#ifndef '):
87 k = alltext(node).split(
' ')[1].strip()
89 toRemove.append((node, par))
92 toRemove.append((node, par))
97 toRemove.append((node, par))
98 elif node.text.startswith(
'#if '):
100 toRemove.append((node, par))
103 elif node.text.startswith(
'#else'):
104 if keep[-1]
is not None:
105 toRemove.append((node, par))
106 keep[-1] =
not keep[-1]
108 toRemove.append((node, par))
109 elif node.text.startswith(
'#endif'):
110 if keep[-1]
is not None or False in keep:
111 toRemove.append((node, par))
113 elif node.text.startswith(
'#elifdef')
or node.text.startswith(
'#elifndef'):
114 raise NotImplementedError(
"#elifdef and #elifndef not (yet?) implemented")
117 toRemove.append((node, par))
120 toRemove.append((node, par))
123 raise PYFTError(
"#else or #endif hasn't the same parent as #ifdef " +
124 "or #ifndef in {f}".format(f=self.getFileName()))
126 if len(toRemove) != 0:
127 self.tree.signal(self)
128 for node, par
in toRemove[::-1]:
129 index = list(par).index(node)
131 if node.tail
is not None:
132 if par[index - 1].tail
is None:
133 par[index - 1].tail =
""
135 par[index - 1].tail += (node.tail.count(
'\n') *
'\n' +
136 (len(node.tail) - len(node.tail.rstrip(
' '))) *
' ')