summaryrefslogtreecommitdiffstats
path: root/python/clidef.py
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2022-01-13 14:18:29 +0100
committerDavid Lamparter <equinox@opensourcerouting.org>2022-01-13 16:01:53 +0100
commitd11238bb5ef433a813a8673de48d109ca1d01538 (patch)
tree08117c6d5531e15b16982db818e281ca7d1b37c5 /python/clidef.py
parentMerge pull request #10328 from ton31337/fix/vty_json (diff)
downloadfrr-d11238bb5ef433a813a8673de48d109ca1d01538.tar.xz
frr-d11238bb5ef433a813a8673de48d109ca1d01538.zip
python: pass conditionals through clippy for DEFPY
Track what conditionals apply when a DEFPY is encountered, and stack them around the autogenerated clippy wrapper. Otherwise conditional DEFPYs result in undefined function warnings. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'python/clidef.py')
-rw-r--r--python/clidef.py24
1 files changed, 22 insertions, 2 deletions
diff --git a/python/clidef.py b/python/clidef.py
index ba7c9072c..b57a00fc8 100644
--- a/python/clidef.py
+++ b/python/clidef.py
@@ -173,7 +173,7 @@ handlers = {
# common form, without requiring a more advanced template engine (e.g.
# jinja2)
templ = Template(
- """/* $fnname => "$cmddef" */
+ """$cond_begin/* $fnname => "$cmddef" */
DEFUN_CMD_FUNC_DECL($fnname)
#define funcdecl_$fnname static int ${fnname}_magic(\\
const struct cmd_element *self __attribute__ ((unused)),\\
@@ -211,7 +211,7 @@ $argblocks
$argassert
return ${fnname}_magic(self, vty, argc, argv$arglist);
}
-
+$cond_end
"""
)
@@ -265,7 +265,25 @@ def process_file(fn, ofd, dumpfd, all_defun, macros):
errors = 0
filedata = clippy.parse(fn)
+ cond_stack = []
+
for entry in filedata["data"]:
+ if entry["type"] == "PREPROC":
+ line = entry["line"].lstrip()
+ tokens = line.split(maxsplit=1)
+ line = "#" + line + "\n"
+
+ if not tokens:
+ continue
+
+ if tokens[0] in ["if", "ifdef", "ifndef"]:
+ cond_stack.append(line)
+ elif tokens[0] in ["elif", "else"]:
+ prev_line = cond_stack.pop(-1)
+ cond_stack.append(prev_line + line)
+ elif tokens[0] in ["endif"]:
+ cond_stack.pop(-1)
+ continue
if entry["type"].startswith("DEFPY") or (
all_defun and entry["type"].startswith("DEFUN")
):
@@ -385,6 +403,8 @@ def process_file(fn, ofd, dumpfd, all_defun, macros):
else:
dumpfd.write('"%s":\n\t---- no magic arguments ----\n\n' % (cmddef))
+ params["cond_begin"] = "".join(cond_stack)
+ params["cond_end"] = "".join(["#endif\n"] * len(cond_stack))
params["argdefs"] = "".join(argdefs)
params["argdecls"] = "".join(argdecls)
params["arglist"] = "".join(arglist)