tree schema BUGFIX correct predicate order in lysc_path (#2244)

* tree schema BUGFIX correct predicate order in lysc_path

* correct uncrustify errors

* test non-empty path after predicates

---------

Co-authored-by: Alexandre Snarskii <snar@retn.net>
diff --git a/src/tree_schema.c b/src/tree_schema.c
index f7dac07..1dd9319 100644
--- a/src/tree_schema.c
+++ b/src/tree_schema.c
@@ -715,22 +715,32 @@
         }
 
         if ((pathtype == LYSC_PATH_DATA_PATTERN) && (iter->nodetype == LYS_LIST)) {
+            char *predicates = NULL;
+
             key = NULL;
             while ((key = lys_getnext(key, iter, NULL, 0)) && lysc_is_key(key)) {
-                s = buffer ? strdup(buffer) : path;
+                s = predicates;
 
                 /* print key predicate */
-                if (buffer) {
-                    len = snprintf(buffer, buflen, "%s[%s='%%s']", s ? s : "", key->name);
-                } else {
-                    len = asprintf(&path, "%s[%s='%%s']", s ? s : "", key->name);
+                asprintf(&predicates, "%s[%s='%%s']", s ? s : "", key->name);
+                if (s) {
+                    free(s);
                 }
-                free(s);
+            }
+            s = buffer ? strdup(buffer) : path;
+            if (buffer) {
+                len = snprintf(buffer, buflen, "%s%s", predicates ? predicates : "", s ? s : "");
+            } else {
+                len = asprintf(&path, "%s%s", predicates ? predicates : "", s ? s : "");
+            }
+            if (predicates) {
+                free(predicates);
+            }
+            free(s);
 
-                if (buffer && (buflen <= (size_t)len)) {
-                    /* not enough space in buffer */
-                    break;
-                }
+            if (buffer && (buflen <= (size_t)len)) {
+                /* not enough space in buffer */
+                break;
             }
         }
 
diff --git a/tests/utests/schema/test_schema.c b/tests/utests/schema/test_schema.c
index 5cb5e47..2dd7f6d 100644
--- a/tests/utests/schema/test_schema.c
+++ b/tests/utests/schema/test_schema.c
@@ -1873,6 +1873,7 @@
             "    leaf k {type string;}"
             "    leaf l {type string;}"
             "    leaf m {type string;}"
+            "    leaf n {type string;}"
             "  }"
             "}}", LYS_IN_YANG, NULL));
 
@@ -1880,6 +1881,10 @@
     path = lysc_path(node, LYSC_PATH_DATA_PATTERN, NULL, 0);
     assert_string_equal(path, "/b:a/l[k='%s'][l='%s'][m='%s']");
     free(path);
+    node = lys_find_path(UTEST_LYCTX, NULL, "/b:a/l/n", 0);
+    path = lysc_path(node, LYSC_PATH_DATA_PATTERN, NULL, 0);
+    assert_string_equal(path, "/b:a/l[k='%s'][l='%s'][m='%s']/n");
+    free(path);
 }
 
 int