validation NEW state data checking

Separate flag for validation and parsers.
The reason is to allow not validating
parsed data but checking for state data
such as for <get-config> reply.
diff --git a/src/common.h b/src/common.h
index 57d1808..a556e5a 100644
--- a/src/common.h
+++ b/src/common.h
@@ -236,6 +236,7 @@
 #define LY_VCODE_DUP            LYVE_DATA, "Duplicate instance of \"%s\"."
 #define LY_VCODE_DUPCASE        LYVE_DATA, "Data for both cases \"%s\" and \"%s\" exist."
 #define LY_VCODE_NOIFF          LYVE_DATA, "Data are disabled by \"%s\" schema node if-feature."
+#define LY_VCODE_INSTATE        LYVE_DATA, "Invalid state data node \"%s\" found."
 
 /******************************************************************************
  * Context
diff --git a/src/parser_xml.c b/src/parser_xml.c
index c3f5f93..44fe075 100644
--- a/src/parser_xml.c
+++ b/src/parser_xml.c
@@ -266,6 +266,10 @@
             ret = LY_EVALID;
             goto cleanup;
         }
+        if ((ctx->options & LYD_OPT_NO_STATE) && (snode->flags & LYS_CONFIG_R)) {
+            LOGVAL(ctx->ctx, LY_VLOG_LINE, &ctx->line, LY_VCODE_INSTATE, snode->name);
+            return LY_EVALID;
+        }
 
         /* create actual attributes so that prefixes are available in the context */
         if (attrs_data.count) {
@@ -470,7 +474,7 @@
     const struct lys_module *mod;
     struct lyd_node *first, *next, **first2;
 
-    xmlctx.options = options;
+    xmlctx.options = options & LYD_OPT_MASK;
     xmlctx.ctx = ctx;
     xmlctx.line = 1;
 
@@ -513,7 +517,7 @@
             LY_CHECK_GOTO(ret, cleanup);
 
             /* perform final validation that assumes the data tree is final */
-            ret = lyd_validate_siblings_r(*first2, NULL, mod, options);
+            ret = lyd_validate_siblings_r(*first2, NULL, mod, options & LYD_VALOPT_MASK);
             LY_CHECK_GOTO(ret, cleanup);
         }
     }
diff --git a/src/tree_data.c b/src/tree_data.c
index 976d9e2..9ab42ef 100644
--- a/src/tree_data.c
+++ b/src/tree_data.c
@@ -279,6 +279,11 @@
 
     LY_CHECK_ARG_RET(ctx, ctx, NULL);
 
+    if ((options & LYD_OPT_PARSE_ONLY) && (options & LYD_VALOPT_MASK)) {
+        LOGERR(ctx, LY_EINVAL, "Passing validation flags with LYD_OPT_PARSE_ONLY is not allowed.");
+        return NULL;
+    }
+
 #if 0
     if (options & LYD_OPT_RPCREPLY) {
         /* first item in trees is mandatory - the RPC/action request */
diff --git a/src/tree_data.h b/src/tree_data.h
index 9132f30..d56920b 100644
--- a/src/tree_data.h
+++ b/src/tree_data.h
@@ -402,9 +402,9 @@
 #define LYD_OPT_CONFIG     LYD_VALOPT_NO_STATE /**< A configuration datastore - complete datastore without state data. */
 #define LYD_OPT_GET        LYD_OPT_PARSE_ONLY /**< Data content from a NETCONF reply message to the NETCONF
                                 \<get\> operation. */
-#define LYD_OPT_GETCONFIG  LYD_OPT_PARSE_ONLY | LYD_VALOPT_NO_STATE /**< Data content from a NETCONF reply message to
+#define LYD_OPT_GETCONFIG  LYD_OPT_PARSE_ONLY | LYD_OPT_NO_STATE /**< Data content from a NETCONF reply message to
                                 the NETCONF \<get-config\> operation. */
-#define LYD_OPT_EDIT       LYD_OPT_PARSE_ONLY | LYD_VALOPT_NO_STATE | LYD_OPT_EMPTY_INST /**< Content of
+#define LYD_OPT_EDIT       LYD_OPT_PARSE_ONLY | LYD_OPT_NO_STATE | LYD_OPT_EMPTY_INST /**< Content of
                                 the NETCONF \<edit-config\>'s config element. */
 
 #define LYD_OPT_PARSE_ONLY      0x0001 /**< Data will be only parsed and no validation will be performed. When statements
@@ -416,9 +416,12 @@
                                             This flag can be used only with #LYD_OPT_PARSE_ONLY. */
 #define LYD_OPT_STRICT          0x0004 /**< Instead of silently ignoring data without schema definition raise an error. */
 #define LYD_OPT_EMPTY_INST      0x0008 /**< Allow leaf/leaf-list instances without values and lists without keys. */
+#define LYD_OPT_NO_STATE        0x0010 /**< Forbid state data in the parsed data. */
 //#define LYD_OPT_NOSIBLINGS 0x1000 /**< Parse only a single XML tree from the input. This option applies only to
 //                                       XML input data. */
 
+#define LYD_OPT_MASK            0xFFFF /**< Mask for all the parser options. */
+
 /** @} dataparseroptions */
 
 /**
@@ -448,6 +451,8 @@
 #define LYD_VALOPT_DATA_ONLY    0x00020000 /**< Validate only modules whose data actually exist. */
 //#define LYD_VALOPT_OBSOLETE   0x0800 /**< Raise an error when an obsolete statement (status set to obsolete) is used. */
 
+#define LYD_VALOPT_MASK         0xFFFF0000 /**< Mask for all the validation options. */
+
 /** @} datavalidationoptions */
 
 //#define LYD_OPT_VAL_DIFF 0x40000 /**< Flag only for validation, store all the data node changes performed by the validation
@@ -483,7 +488,7 @@
  * @param[in] ctx Context to connect with the data tree being built here.
  * @param[in] data Serialized data in the specified format.
  * @param[in] format Format of the input data to be parsed.
- * @param[in] options Parser options, see @ref parseroptions. \p format LYD_LYB uses #LYD_OPT_PARSE_ONLY implicitly.
+ * @param[in] options Parser and validation options, see @ref parseroptions.
  * @return Pointer to the built data tree or NULL in case of empty \p data. To free the returned structure,
  *         use lyd_free_all().
  * @return NULL in case of error. The error information can be then obtained using ly_err* functions.
diff --git a/src/validation.c b/src/validation.c
index eb28b7c..80766f9 100644
--- a/src/validation.c
+++ b/src/validation.c
@@ -782,6 +782,11 @@
             break;
         }
 
+        if ((val_opts & LYD_VALOPT_NO_STATE) && (node->schema->flags & LYS_CONFIG_R)) {
+            LOGVAL(node->schema->module->ctx, LY_VLOG_LYD, node, LY_VCODE_INSTATE, node->schema->name);
+            return LY_EVALID;
+        }
+
         /* node's schema if-features */
         if ((snode = lysc_node_is_disabled(node->schema, 1))) {
             LOGVAL(node->schema->module->ctx, LY_VLOG_LYD, node, LY_VCODE_NOIFF, snode->name);
@@ -790,7 +795,7 @@
 
         /* TODO node's must */
         /* TODO node status */
-        /* TODO list all keys existence */
+        /* TODO list all keys existence (take LYD_OPT_EMPTY_INST into consideration) */
         /* node value including if-feature is checked by plugins */
     }
 
@@ -921,6 +926,11 @@
 
     LY_CHECK_ARG_RET(NULL, tree, *tree || ctx || (modules && mod_count), LY_EINVAL);
 
+    if (val_opts & ~LYD_VALOPT_MASK) {
+        LOGERR(ctx, LY_EINVAL, "Some invalid flags passed to validation.");
+        return LY_EINVAL;
+    }
+
     next = *tree;
     while (1) {
         if (val_opts & LYD_VALOPT_DATA_ONLY) {