diff options
author | David Lamparter <equinox@opensourcerouting.org> | 2022-01-13 14:18:29 +0100 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2022-01-13 16:01:53 +0100 |
commit | d11238bb5ef433a813a8673de48d109ca1d01538 (patch) | |
tree | 08117c6d5531e15b16982db818e281ca7d1b37c5 /python/clidef.py | |
parent | Merge pull request #10328 from ton31337/fix/vty_json (diff) | |
download | frr-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.py | 24 |
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) |