schema compile UPDATE support all simple text statements

... in extensions.
Fixes #1905
diff --git a/src/schema_compile.c b/src/schema_compile.c
index 5d29adc..f4aae9e 100644
--- a/src/schema_compile.c
+++ b/src/schema_compile.c
@@ -509,7 +509,7 @@
 LIBYANG_API_DEF LY_ERR
 lys_compile_extension_instance(struct lysc_ctx *ctx, const struct lysp_ext_instance *ext_p, struct lysc_ext_instance *ext)
 {
-    LY_ERR ret = LY_SUCCESS, r;
+    LY_ERR rc = LY_SUCCESS, r;
     LY_ARRAY_COUNT_TYPE u;
     struct lysp_stmt *stmt;
     void *parsed = NULL, **compiled = NULL;
@@ -527,7 +527,7 @@
         if (u == LY_ARRAY_COUNT(ext->substmts)) {
             LOGVAL(ctx->ctx, LYVE_SYNTAX_YANG, "Invalid keyword \"%s\" as a child of \"%s%s%s\" extension instance.",
                     stmt->stmt, ext_p->name, ext_p->argument ? " " : "", ext_p->argument ? ext_p->argument : "");
-            ret = LY_EVALID;
+            rc = LY_EVALID;
             goto cleanup;
         }
     }
@@ -564,12 +564,8 @@
                 case LY_STMT_RPC:
                 case LY_STMT_USES:
                     if (!ext_p->parsed) {
-                        struct lysp_ext_instance *unconst_ext_p;
-
-                        r = lysp_stmt_parse(ctx, stmt, &parsed, NULL);
-                        LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
-                        unconst_ext_p = (struct lysp_ext_instance *)ext_p;
-                        unconst_ext_p->parsed = parsed;
+                        LY_CHECK_GOTO(rc = lysp_stmt_parse(ctx, stmt, &parsed, NULL), cleanup);
+                        ((struct lysp_ext_instance *)ext_p)->parsed = parsed;
                     } else {
                         struct lysp_node *node, *last_node = NULL;
 
@@ -578,16 +574,21 @@
                             last_node = node;
                         }
                         /* create and link sibling */
-                        r = lysp_stmt_parse(ctx, stmt, &parsed, NULL);
-                        LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
+                        LY_CHECK_GOTO(rc = lysp_stmt_parse(ctx, stmt, &parsed, NULL), cleanup);
                         last_node->next = parsed;
                     }
 
                     /* set storage as an alternative document root in the compile context */
-                    r = lys_compile_node(ctx, parsed, NULL, 0, NULL);
-                    LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
+                    LY_CHECK_GOTO(rc = lys_compile_node(ctx, parsed, NULL, 0, NULL), cleanup);
                     break;
+                case LY_STMT_CONTACT:
                 case LY_STMT_DESCRIPTION:
+                case LY_STMT_ERROR_APP_TAG:
+                case LY_STMT_ERROR_MESSAGE:
+                case LY_STMT_KEY:
+                case LY_STMT_NAMESPACE:
+                case LY_STMT_ORGANIZATION:
+                case LY_STMT_PRESENCE:
                 case LY_STMT_REFERENCE:
                 case LY_STMT_UNITS: {
                     const char **str_p;
@@ -596,7 +597,7 @@
                         /* single item */
                         if (*((const char **)ext->substmts[u].storage)) {
                             LOGVAL(ctx->ctx, LY_VCODE_DUPSTMT, stmt->stmt);
-                            ret = LY_EVALID;
+                            rc = LY_EVALID;
                             goto cleanup;
                         }
                         str_p = (const char **)ext->substmts[u].storage;
@@ -604,21 +605,21 @@
                         /* sized array */
                         const char ***strings_array = (const char ***)ext->substmts[u].storage;
 
-                        LY_ARRAY_NEW_GOTO(ctx->ctx, *strings_array, str_p, ret, cleanup);
+                        LY_ARRAY_NEW_GOTO(ctx->ctx, *strings_array, str_p, rc, cleanup);
                     }
-                    r = lydict_insert(ctx->ctx, stmt->arg, 0, str_p);
-                    LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
+
+                    /* called instead of lysp_stmt_parse() to skip validation and not parse nested ext instances */
+                    LY_CHECK_GOTO(rc = lydict_insert(ctx->ctx, stmt->arg, 0, str_p), cleanup);
                     break;
                 }
                 case LY_STMT_IF_FEATURE: {
                     ly_bool enabled;
 
-                    r = lysp_stmt_parse(ctx, stmt, &parsed, NULL);
-                    LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
+                    LY_CHECK_GOTO(rc = lysp_stmt_parse(ctx, stmt, &parsed, NULL), cleanup);
 
                     r = lys_eval_iffeatures(ctx->ctx, parsed, &enabled);
                     FREE_ARRAY(ctx->ctx, (struct lysp_qname *)parsed, lysp_qname_free);
-                    LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
+                    LY_CHECK_ERR_GOTO(r, rc = r, cleanup);
                     if (!enabled) {
                         /* it is disabled, remove the whole extension instance */
                         return LY_ENOT;
@@ -626,8 +627,12 @@
                     break;
                 }
                 case LY_STMT_STATUS:
-                    assert(ext->substmts[u].cardinality < LY_STMT_CARD_SOME);
-                    LY_CHECK_ERR_GOTO(r = lysp_stmt_parse(ctx, stmt, &ext->substmts[u].storage, /* TODO */ NULL), ret = r, cleanup);
+                    if (ext->substmts[u].cardinality > LY_STMT_CARD_MAND) {
+                        /* only cardinality 0..1 and 1 */
+                        goto not_supported;
+                    }
+                    /* result needs to be a pointer to pointer */
+                    LY_CHECK_GOTO(rc = lysp_stmt_parse(ctx, stmt, &ext->substmts[u].storage, NULL), cleanup);
                     break;
                 case LY_STMT_TYPE: {
                     uint16_t *flags = lys_compile_extension_instance_storage(LY_STMT_STATUS, ext->substmts);
@@ -637,7 +642,7 @@
                         /* single item */
                         if (*(struct lysc_type **)ext->substmts[u].storage) {
                             LOGVAL(ctx->ctx, LY_VCODE_DUPSTMT, stmt->stmt);
-                            ret = LY_EVALID;
+                            rc = LY_EVALID;
                             goto cleanup;
                         }
                         compiled = ext->substmts[u].storage;
@@ -645,25 +650,26 @@
                         /* sized array */
                         struct lysc_type ***types = (struct lysc_type ***)ext->substmts[u].storage, **type = NULL;
 
-                        LY_ARRAY_NEW_GOTO(ctx->ctx, *types, type, ret, cleanup);
+                        LY_ARRAY_NEW_GOTO(ctx->ctx, *types, type, rc, cleanup);
                         compiled = (void *)type;
                     }
 
-                    r = lysp_stmt_parse(ctx, stmt, &parsed, NULL);
-                    LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
+                    LY_CHECK_GOTO(rc = lysp_stmt_parse(ctx, stmt, &parsed, NULL), cleanup);
                     r = lys_compile_type(ctx, NULL, flags ? *flags : 0, ext_p->name, parsed, (struct lysc_type **)compiled,
-                            units && !*units ? units : NULL, NULL);
+                            (units && !*units) ? units : NULL, NULL);
                     lysp_type_free(ctx->ctx, parsed);
                     free(parsed);
-                    LY_CHECK_ERR_GOTO(r, ret = r, cleanup);
+                    LY_CHECK_ERR_GOTO(r, rc = r, cleanup);
                     break;
                 }
                 /* TODO support other substatements (parse stmt to lysp and then compile lysp to lysc),
                  * also note that in many statements their extensions are not taken into account  */
                 default:
-                    LOGVAL(ctx->ctx, LYVE_SYNTAX_YANG, "Statement \"%s\" is not supported as an extension (found in \"%s%s%s\") substatement.",
-                            stmt->stmt, ext_p->name, ext_p->argument ? " " : "", ext_p->argument ? ext_p->argument : "");
-                    ret = LY_EVALID;
+not_supported:
+                    LOGVAL(ctx->ctx, LYVE_SYNTAX_YANG, "Statement \"%s\" in cardinality %s is not supported as an extension "
+                            "(found in \"%s%s%s\") substatement.", stmt->stmt, ly_cardinality2str(ext->substmts[u].cardinality),
+                            ext_p->name, ext_p->argument ? " " : "", ext_p->argument ? ext_p->argument : "");
+                    rc = LY_EVALID;
                     goto cleanup;
                 }
             }
@@ -671,15 +677,16 @@
 
         if (((ext->substmts[u].cardinality == LY_STMT_CARD_MAND) || (ext->substmts[u].cardinality == LY_STMT_CARD_SOME)) && !stmt_counter) {
             LOGVAL(ctx->ctx, LYVE_SYNTAX_YANG, "Missing mandatory keyword \"%s\" as a child of \"%s%s%s\".",
-                    ly_stmt2str(ext->substmts[u].stmt), ext_p->name, ext_p->argument ? " " : "", ext_p->argument ? ext_p->argument : "");
-            ret = LY_EVALID;
+                    ly_stmt2str(ext->substmts[u].stmt), ext_p->name, ext_p->argument ? " " : "",
+                    ext_p->argument ? ext_p->argument : "");
+            rc = LY_EVALID;
             goto cleanup;
         }
     }
 
 cleanup:
     ctx->ext = NULL;
-    return ret;
+    return rc;
 }
 
 /**