]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/yang_translator.c
Merge pull request #6279 from opensourcerouting/nb-cb-args
[mirror_frr.git] / lib / yang_translator.c
index 76a6cc5fd1954d40b54683c436cb88c0fa783c38..7dbb1f3f1a10bae2ffb28d5e052b3f23eecdbf9b 100644 (file)
@@ -24,6 +24,7 @@
 #include "hash.h"
 #include "yang.h"
 #include "yang_translator.h"
+#include "frrstr.h"
 
 DEFINE_MTYPE_STATIC(LIB, YANG_TRANSLATOR, "YANG Translator")
 DEFINE_MTYPE_STATIC(LIB, YANG_TRANSLATOR_MODULE, "YANG Translator Module")
@@ -45,8 +46,6 @@ static struct ly_ctx *ly_translator_ctx;
 static unsigned int
 yang_translator_validate(struct yang_translator *translator);
 static unsigned int yang_module_nodes_count(const struct lys_module *module);
-static void str_replace(char *o_string, const char *s_string,
-                       const char *r_string);
 
 struct yang_mapping_node {
        char xpath_from_canonical[XPATH_MAXLEN];
@@ -62,7 +61,7 @@ static bool yang_mapping_hash_cmp(const void *value1, const void *value2)
        return strmatch(c1->xpath_from_canonical, c2->xpath_from_canonical);
 }
 
-static unsigned int yang_mapping_hash_key(void *value)
+static unsigned int yang_mapping_hash_key(const void *value)
 {
        return string_hash_make(value);
 }
@@ -108,14 +107,24 @@ static void yang_mapping_add(struct yang_translator *translator, int dir,
                sizeof(mapping->xpath_from_fmt));
        strlcpy(mapping->xpath_to_fmt, xpath_to_fmt,
                sizeof(mapping->xpath_to_fmt));
-       str_replace(mapping->xpath_from_fmt, "KEY1", "%[^']");
-       str_replace(mapping->xpath_from_fmt, "KEY2", "%[^']");
-       str_replace(mapping->xpath_from_fmt, "KEY3", "%[^']");
-       str_replace(mapping->xpath_from_fmt, "KEY4", "%[^']");
-       str_replace(mapping->xpath_to_fmt, "KEY1", "%s");
-       str_replace(mapping->xpath_to_fmt, "KEY2", "%s");
-       str_replace(mapping->xpath_to_fmt, "KEY3", "%s");
-       str_replace(mapping->xpath_to_fmt, "KEY4", "%s");
+
+       const char *keys[] = {"KEY1", "KEY2", "KEY3", "KEY4"};
+       char *xpfmt;
+
+       for (unsigned int i = 0; i < array_size(keys); i++) {
+               xpfmt = frrstr_replace(mapping->xpath_from_fmt, keys[i],
+                                      "%[^']");
+               strlcpy(mapping->xpath_from_fmt, xpfmt,
+                       sizeof(mapping->xpath_from_fmt));
+               XFREE(MTYPE_TMP, xpfmt);
+       }
+
+       for (unsigned int i = 0; i < array_size(keys); i++) {
+               xpfmt = frrstr_replace(mapping->xpath_to_fmt, keys[i], "%s");
+               strlcpy(mapping->xpath_to_fmt, xpfmt,
+                       sizeof(mapping->xpath_to_fmt));
+               XFREE(MTYPE_TMP, xpfmt);
+       }
 }
 
 struct yang_translator *yang_translator_load(const char *path)
@@ -162,7 +171,7 @@ struct yang_translator *yang_translator_load(const char *path)
        RB_INSERT(yang_translators, &yang_translators, translator);
 
        /* Initialize the translator libyang context. */
-       translator->ly_ctx = yang_ctx_new_setup();
+       translator->ly_ctx = yang_ctx_new_setup(false);
        if (!translator->ly_ctx) {
                flog_warn(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
                goto error;
@@ -500,31 +509,9 @@ static unsigned int yang_module_nodes_count(const struct lys_module *module)
        return total;
 }
 
-/* TODO: rewrite this function. */
-static void str_replace(char *o_string, const char *s_string,
-                       const char *r_string)
-{
-       char buffer[BUFSIZ];
-       char *ch;
-
-       ch = strstr(o_string, s_string);
-       if (!ch)
-               return;
-
-       memcpy(buffer, o_string, ch - o_string);
-       buffer[ch - o_string] = 0;
-
-       sprintf(buffer + (ch - o_string), "%s%s", r_string,
-               ch + strlen(s_string));
-
-       o_string[0] = 0;
-       strcpy(o_string, buffer);
-       return str_replace(o_string, s_string, r_string);
-}
-
 void yang_translator_init(void)
 {
-       ly_translator_ctx = yang_ctx_new_setup();
+       ly_translator_ctx = yang_ctx_new_setup(true);
        if (!ly_translator_ctx) {
                flog_err(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
                exit(1);