diff options
| -rw-r--r-- | lib/yang.c | 28 | ||||
| -rw-r--r-- | lib/yang.h | 2 | ||||
| -rw-r--r-- | yang/embedmodel.py | 21 | 
3 files changed, 38 insertions, 13 deletions
diff --git a/lib/yang.c b/lib/yang.c index db99c0339e..6ab9492d52 100644 --- a/lib/yang.c +++ b/lib/yang.c @@ -53,22 +53,30 @@ static const char *yang_module_imp_clb(const char *mod_name,  {  	struct yang_module_embed *e; -	if (submod_name || submod_rev) -		return NULL; -  	for (e = embeds; e; e = e->next) { -		if (strcmp(e->mod_name, mod_name)) -			continue; -		if (mod_rev && strcmp(e->mod_rev, mod_rev)) -			continue; +		if (e->sub_mod_name && submod_name) { +			if (strcmp(e->sub_mod_name, submod_name)) +				continue; + +			if (submod_rev && strcmp(e->sub_mod_rev, submod_rev)) +				continue; +		} else { +			if (strcmp(e->mod_name, mod_name)) +				continue; + +			if (mod_rev && strcmp(e->mod_rev, mod_rev)) +				continue; +		}  		*format = e->format;  		return e->data;  	} -	flog_warn(EC_LIB_YANG_MODULE_LOAD, -		  "YANG model \"%s@%s\" not embedded, trying external file", -		  mod_name, mod_rev ? mod_rev : "*"); +	flog_warn( +		EC_LIB_YANG_MODULE_LOAD, +		"YANG model \"%s@%s\" \"%s@%s\"not embedded, trying external file", +		mod_name, mod_rev ? mod_rev : "*", +		submod_name ? submod_name : "*", submod_rev ? submod_rev : "*");  	return NULL;  } diff --git a/lib/yang.h b/lib/yang.h index d526d2f5d6..cc048c44e8 100644 --- a/lib/yang.h +++ b/lib/yang.h @@ -48,6 +48,8 @@ extern "C" {  struct yang_module_embed {  	struct yang_module_embed *next;  	const char *mod_name, *mod_rev; +	const char *sub_mod_name; +	const char *sub_mod_rev;  	const char *data;  	LYS_INFORMAT format;  }; diff --git a/yang/embedmodel.py b/yang/embedmodel.py index 624a11da9d..0a25c93da7 100644 --- a/yang/embedmodel.py +++ b/yang/embedmodel.py @@ -20,6 +20,8 @@ if not os.path.isdir(outdir):  # to make it even harder.  re_name = re.compile(r'\bmodule\s+([^\s]+)\s+\{') +re_subname = re.compile(r'\bsubmodule\s+([^\s]+)\s+\{') +re_mainname = re.compile(r'\bbelongs-to\s+([^\s]+)\s+\{')  re_rev = re.compile(r'\brevision\s+([\d-]+)\s+\{') @@ -34,6 +36,8 @@ static const char model[] =  static struct yang_module_embed embed = {  \t.mod_name = "%s",  \t.mod_rev = "%s", +\t.sub_mod_name = "%s", +\t.sub_mod_rev = "%s",  \t.data = model,  \t.format = %s,  }; @@ -62,6 +66,10 @@ def escape(line):  with open(inname, 'r') as fd:      data = fd.read() +sub_name = "" +rev = "" +sub_rev = "" +  # XML support isn't actively used currently, but it's here in case the need  # arises.  It does avoid the regex'ing.  if '<?xml' in data: @@ -71,8 +79,15 @@ if '<?xml' in data:      rev = xml.find('{urn:ietf:params:xml:ns:yang:yin:1}revision').get('date')      fmt = 'LYS_YIN'  else: -    name = re_name.search(data).group(1) -    rev = re_rev.search(data).group(1) +    search_name = re_name.search(data) +    if search_name : +       name = search_name.group(1) +       rev = re_rev.search(data).group(1) +    else : +       search_name = re_subname.search(data) +       sub_name = search_name.group(1) +       name = re_mainname.search(data).group(1) +       sub_rev = re_rev.search(data).group(1)      fmt = 'LYS_YANG'  if name is None or rev is None: @@ -82,4 +97,4 @@ lines = [escape(row) for row in data.split('\n')]  text = '\\n"\n\t"'.join(lines)  with open(outname, 'w') as fd: -    fd.write(template % (text, escape(name), escape(rev), fmt)) +    fd.write(template % (text, escape(name), escape(rev), escape(sub_name), escape(sub_rev), fmt))  | 
