common CHANGE ly_value_prefix_next returns LY_ERR

Passed the result of the ly_getutf8 function in the case of error.
diff --git a/src/common.c b/src/common.c
index a434235..9e485c8 100644
--- a/src/common.c
+++ b/src/common.c
@@ -101,22 +101,22 @@
     return LY_SUCCESS;
 }
 
-uint32_t
-ly_value_prefix_next(const char *str_begin, const char *str_end, ly_bool *is_prefix, const char **str_next)
+LY_ERR
+ly_value_prefix_next(const char *str_begin, const char *str_end, uint32_t *len, ly_bool *is_prefix, const char **str_next)
 {
     const char *stop, *prefix;
-    size_t bytes;
+    size_t bytes_read;
     uint32_t c;
     ly_bool prefix_found;
-    uint32_t ret;
+    LY_ERR ret = LY_SUCCESS;
 
-    assert(is_prefix && str_next);
+    assert(len && is_prefix && str_next);
 
 #define IS_AT_END(PTR, STR_END) (STR_END ? PTR == STR_END : !(*PTR))
 
     *str_next = NULL;
     *is_prefix = 0;
-    ret = 0;
+    *len = 0;
 
     if (!str_begin || !(*str_begin) || (str_begin == str_end)) {
         return ret;
@@ -128,21 +128,21 @@
 
     do {
         /* look for the beginning of the YANG value */
-        for (ly_getutf8(&stop, &c, &bytes);
-                !is_xmlqnamestartchar(c) && !IS_AT_END(stop, str_end);
-                ly_getutf8(&stop, &c, &bytes)) {}
+        do {
+            LY_CHECK_RET(ly_getutf8(&stop, &c, &bytes_read));
+        } while (!is_xmlqnamestartchar(c) && !IS_AT_END(stop, str_end));
 
         if (IS_AT_END(stop, str_end)) {
             break;
         }
 
         /* maybe the prefix was found */
-        prefix = stop - bytes;
+        prefix = stop - bytes_read;
 
         /* look for the the end of the prefix */
-        for (ly_getutf8(&stop, &c, &bytes);
-                is_xmlqnamechar(c) && !IS_AT_END(stop, str_end);
-                ly_getutf8(&stop, &c, &bytes)) {}
+        do {
+            LY_CHECK_RET(ly_getutf8(&stop, &c, &bytes_read));
+        } while (is_xmlqnamechar(c) && !IS_AT_END(stop, str_end));
 
         prefix_found = c == ':' ? 1 : 0;
 
@@ -153,14 +153,14 @@
         /* prefix found at the beginning of the input string */
         *is_prefix = 1;
         *str_next = IS_AT_END(stop, str_end) ? NULL : stop;
-        ret = (stop - bytes) - str_begin;
+        *len = (stop - bytes_read) - str_begin;
     } else if ((str_begin != prefix) && (prefix_found)) {
         /* there is a some string before prefix */
         *str_next = prefix;
-        ret = prefix - str_begin;
+        *len = prefix - str_begin;
     } else {
         /* no prefix found */
-        ret = stop - str_begin;
+        *len = stop - str_begin;
     }
 
 #undef IS_AT_END
diff --git a/src/common.h b/src/common.h
index 7a08f97..cb2591b 100644
--- a/src/common.h
+++ b/src/common.h
@@ -432,13 +432,14 @@
  *
  * @param[in] str_begin Begin of the input string.
  * @param[in] str_end Length of the @p str_begin. If set to NULL then the @p str_begin must be NULL-terminated string.
+ * @param[out] len Number of bytes (length) of the found prefix/substring starting at @p str_begin.
  * @param[out] is_prefix Type of substring found. Set to True for prefix, otherwise False.
  * @param[out] str_next Remaining string starting after prefix/substring and ending with @p str_end.
  * If the @p is_prefix is set to True then the colon character is skipped.
  * If no string remains, it is set to NULL.
- * @return Number of bytes (length) of the found prefix/substring starting at @p str_begin.
+ * @return LY_ERR value.
  */
-uint32_t ly_value_prefix_next(const char *str_begin, const char *str_end, ly_bool *is_prefix, const char **str_next);
+LY_ERR ly_value_prefix_next(const char *str_begin, const char *str_end, uint32_t *len, ly_bool *is_prefix, const char **str_next);
 
 /**
  * @brief Wrapper around strlen() to handle NULL strings.
diff --git a/src/plugins_types/xpath1.0.c b/src/plugins_types/xpath1.0.c
index e1600cb..a743dd0 100644
--- a/src/plugins_types/xpath1.0.c
+++ b/src/plugins_types/xpath1.0.c
@@ -79,7 +79,8 @@
 
     str_begin = token;
 
-    while ((len = ly_value_prefix_next(str_begin, token + tok_len, &is_prefix, &str_next))) {
+    while (!(ret = ly_value_prefix_next(str_begin, token + tok_len, &len, &is_prefix, &str_next)) && len) {
+
         if (is_prefix) {
             /* resolve the module in the original format */
             mod = lyplg_type_identity_module(resolve_ctx, NULL, str_begin, len, resolve_format, resolve_prefix_data);
diff --git a/src/tree_data_helpers.c b/src/tree_data_helpers.c
index 22c1899..89afee3 100644
--- a/src/tree_data_helpers.c
+++ b/src/tree_data_helpers.c
@@ -535,7 +535,7 @@
         /* add all used prefixes */
         value_end = value + value_len;
         for (value_iter = value; value_iter; value_iter = value_next) {
-            substr_len = ly_value_prefix_next(value_iter, value_end, &is_prefix, &value_next);
+            LY_CHECK_GOTO(ret = ly_value_prefix_next(value_iter, value_end, &substr_len, &is_prefix, &value_next), cleanup);
             if (is_prefix) {
                 /* we have a possible prefix. Do we already have the prefix? */
                 mod = ly_resolve_prefix(ctx, value_iter, substr_len, *format_p, *prefix_data_p);
@@ -571,7 +571,7 @@
         /* add all used prefixes */
         value_end = value + value_len;
         for (value_iter = value; value_iter; value_iter = value_next) {
-            substr_len = ly_value_prefix_next(value_iter, value_end, &is_prefix, &value_next);
+            LY_CHECK_GOTO(ret = ly_value_prefix_next(value_iter, value_end, &substr_len, &is_prefix, &value_next), cleanup);
             if (is_prefix) {
                 /* we have a possible prefix. Do we already have the prefix? */
                 ns = lyxml_ns_get(ns_list, value_iter, substr_len);
diff --git a/src/xml.c b/src/xml.c
index e4bc8bd..b39b3a4 100644
--- a/src/xml.c
+++ b/src/xml.c
@@ -1115,8 +1115,12 @@
     for (value1_iter = value1, value2_iter = value2;
             value1_iter && value2_iter;
             value1_iter = value1_next, value2_iter = value2_next) {
-        value1_len = ly_value_prefix_next(value1_iter, NULL, &is_prefix1, &value1_next);
-        value2_len = ly_value_prefix_next(value2_iter, NULL, &is_prefix2, &value2_next);
+        if ((ret = ly_value_prefix_next(value1_iter, NULL, &value1_len, &is_prefix1, &value1_next))) {
+            break;
+        }
+        if ((ret = ly_value_prefix_next(value2_iter, NULL, &value2_len, &is_prefix2, &value2_next))) {
+            break;
+        }
 
         if (is_prefix1 != is_prefix2) {
             ret = LY_ENOT;
diff --git a/tests/utests/basic/test_common.c b/tests/utests/basic/test_common.c
index 671ef56..355acb7 100644
--- a/tests/utests/basic/test_common.c
+++ b/tests/utests/basic/test_common.c
@@ -264,112 +264,138 @@
 {
     const char *next;
     ly_bool is_prefix;
+    uint32_t bytes;
 
-    assert_int_equal(0, ly_value_prefix_next(NULL, NULL, &is_prefix, &next));
-    assert_int_equal(0, ly_value_prefix_next("", NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(NULL, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(0, bytes);
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next("", NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(0, bytes);
 
     /* prefix */
     next = "pref:";
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(1, is_prefix);
 
     /* no-prefix */
     next = "node";
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(0, is_prefix);
 
     /* no-prefix */
     next = "::::";
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(0, is_prefix);
 
     /* no-prefix */
     next = "//a/:";
-    assert_int_equal(5, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(5, bytes);
     assert_null(next);
     assert_int_equal(0, is_prefix);
 
     /* no-prefix */
     next = "//a//";
-    assert_int_equal(5, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(5, bytes);
     assert_null(next);
     assert_int_equal(0, is_prefix);
 
     /* prefix, prefix */
     next = "pref1:pref2:";
-    assert_int_equal(5, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(5, bytes);
     assert_string_equal(next, "pref2:");
     assert_int_equal(1, is_prefix);
-    assert_int_equal(5, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(5, bytes);
     assert_null(next);
     assert_int_equal(1, is_prefix);
 
     /* prefix, no-prefix */
     next = "pref:node";
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_string_equal(next, "node");
     assert_int_equal(1, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(0, is_prefix);
 
     /* no-prefix, prefix */
     next = "/pref:";
-    assert_int_equal(1, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(1, bytes);
     assert_string_equal(next, "pref:");
     assert_int_equal(0, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(1, is_prefix);
 
     /* no-prefix, prefix */
     next = "//pref:";
-    assert_int_equal(2, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(2, bytes);
     assert_string_equal(next, "pref:");
     assert_int_equal(0, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(1, is_prefix);
 
     /* no-prefix, prefix, no-prefix */
     next = "/pref:node";
-    assert_int_equal(1, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(1, bytes);
     assert_string_equal(next, "pref:node");
     assert_int_equal(0, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_string_equal(next, "node");
     assert_int_equal(1, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(0, is_prefix);
 
     /* prefix, no-prefix, prefix */
     next = "pref:node pref:";
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_string_equal(next, "node pref:");
     assert_int_equal(1, is_prefix);
-    assert_int_equal(5, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(5, bytes);
     assert_string_equal(next, "pref:");
     assert_int_equal(0, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(1, is_prefix);
 
     /* prefix, no-prefix, prefix, no-prefix */
     next = "pref:node /pref:node";
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_string_equal(next, "node /pref:node");
     assert_int_equal(1, is_prefix);
-    assert_int_equal(6, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(6, bytes);
     assert_string_equal(next, "pref:node");
     assert_int_equal(0, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_string_equal(next, "node");
     assert_int_equal(1, is_prefix);
-    assert_int_equal(4, ly_value_prefix_next(next, NULL, &is_prefix, &next));
+    assert_int_equal(LY_SUCCESS, ly_value_prefix_next(next, NULL, &bytes, &is_prefix, &next));
+    assert_int_equal(4, bytes);
     assert_null(next);
     assert_int_equal(0, is_prefix);
 }