]>
git.proxmox.com Git - mirror_frr.git/blob - yang/embedmodel.py
3 # YANG module to C wrapper
4 # written 2018 by David Lamparter, placed in Public Domain.
14 outdir
= os
.path
.dirname(os
.path
.abspath(outname
))
15 if not os
.path
.isdir(outdir
):
18 # these are regexes to avoid a compile-time/host dependency on yang-tools
19 # or python-yang. Cross-compiling FRR is already somewhat involved, no need
20 # to make it even harder.
22 re_name
= re
.compile(r
"\bmodule\s+([^\s]+)\s+\{")
23 re_subname
= re
.compile(r
"\bsubmodule\s+([^\s]+)\s+\{")
24 re_mainname
= re
.compile(r
"\bbelongs-to\s+([^\s]+)\s+\{")
25 re_rev
= re
.compile(r
"\brevision\s+([\d-]+)\s+\{")
28 template
= """/* autogenerated by embedmodel.py. DO NOT EDIT */
33 static const char model[] =
36 static struct yang_module_embed embed = {
39 \t.sub_mod_name = "%s",
40 \t.sub_mod_rev = "%s",
45 static void embed_register(void) __attribute__((_CONSTRUCTOR(2000)));
46 static void embed_register(void)
48 \tyang_module_embed(&embed);
52 passchars
= set(string
.printable
) - set("\\'\"%\r\n\t\x0b\x0c")
64 return "\\x%02x" % (ord(char
))
68 return "".join([escapech(i
) for i
in line
])
71 with
open(inname
, "r") as fd
:
78 # XML support isn't actively used currently, but it's here in case the need
79 # arises. It does avoid the regex'ing.
81 from xml
.etree
import ElementTree
83 xml
= ElementTree
.fromstring(data
)
84 name
= xml
.get("name")
85 rev
= xml
.find("{urn:ietf:params:xml:ns:yang:yin:1}revision").get("date")
88 search_name
= re_name
.search(data
)
90 name
= search_name
.group(1)
91 rev
= re_rev
.search(data
).group(1)
93 search_name
= re_subname
.search(data
)
94 sub_name
= search_name
.group(1)
95 name
= re_mainname
.search(data
).group(1)
96 sub_rev
= re_rev
.search(data
).group(1)
99 if name
is None or rev
is None:
100 raise ValueError("cannot determine YANG module name and revision")
102 lines
= [escape(row
) for row
in data
.split("\n")]
103 text
= '\\n"\n\t"'.join(lines
)
105 with
open(outname
, "w") as fd
:
108 % (text
, escape(name
), escape(rev
), escape(sub_name
), escape(sub_rev
), fmt
)