|
@@ -142,6 +142,8 @@ kptype_t *kptype_from_iptype(iptype_t *iptype, faux_error_t *error_stack)
|
|
|
bool_t kscheme_nested_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme,
|
|
|
faux_error_t *error_stack)
|
|
|
{
|
|
|
+ bool_t retval = BOOL_TRUE;
|
|
|
+
|
|
|
if (!kscheme || !ischeme) {
|
|
|
if (error_stack)
|
|
|
faux_error_add(error_stack,
|
|
@@ -157,27 +159,84 @@ bool_t kscheme_nested_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme,
|
|
|
iptype_t *iptype = *p_iptype;
|
|
|
|
|
|
kptype = kptype_from_iptype(iptype, error_stack);
|
|
|
- if (!kptype)
|
|
|
+ if (!kptype) {
|
|
|
+ retval = BOOL_FALSE; // Don't stop
|
|
|
continue;
|
|
|
- kscheme_add_ptype(kscheme, kptype);
|
|
|
+ }
|
|
|
+ if (!kscheme_add_ptype(kscheme, kptype)) {
|
|
|
+ if (error_stack) {
|
|
|
+ char *msg = NULL;
|
|
|
+ // Search for PTYPE duplicates
|
|
|
+ if (kscheme_find_ptype(kscheme,
|
|
|
+ kptype_name(kptype))) {
|
|
|
+ msg = faux_str_sprintf("SCHEME: "
|
|
|
+ "Can't add duplicate PTYPE "
|
|
|
+ "\"%s\"",
|
|
|
+ kptype_name(kptype));
|
|
|
+ } else {
|
|
|
+ msg = faux_str_sprintf("SCHEME: "
|
|
|
+ "Can't add PTYPE \"%s\"",
|
|
|
+ kptype_name(kptype));
|
|
|
+ }
|
|
|
+ faux_error_add(error_stack, msg);
|
|
|
+ faux_str_free(msg);
|
|
|
+ }
|
|
|
+ retval = BOOL_FALSE;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// VIEW list
|
|
|
+ // VIEW entries can be duplicate. Duplicated entries will add nested
|
|
|
+ // elements to existent VIEW. Also it can overwrite VIEW attributes.
|
|
|
+ // So there is no special rule which attribute value will be "on top".
|
|
|
+ // It's a random. Technically later VIEW entries will rewrite previous
|
|
|
+ // values.
|
|
|
if (ischeme->views) {
|
|
|
iview_t **p_iview = NULL;
|
|
|
for (p_iview = *ischeme->views; *p_iview; p_iview++) {
|
|
|
kview_t *kview = NULL;
|
|
|
iview_t *iview = *p_iview;
|
|
|
+ const char *view_name = iview->name;
|
|
|
|
|
|
- kview = kview_from_iview(iview, error_stack);
|
|
|
- if (!kview)
|
|
|
+ if (view_name)
|
|
|
+ kview = kscheme_find_view(kscheme, view_name);
|
|
|
+ if (kview) {
|
|
|
+ kview_error_e kview_error = KVIEW_ERROR_OK;
|
|
|
+ if (!kview_parse(kview, iview, &kview_error)) {
|
|
|
+ char *msg = faux_str_sprintf("VIEW \"%s\": %s",
|
|
|
+ iview->name ? iview->name : "(null)",
|
|
|
+ kview_strerror(kview_error));
|
|
|
+ faux_error_add(error_stack, msg);
|
|
|
+ faux_str_free(msg);
|
|
|
+ retval = BOOL_FALSE;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!kview_nested_from_iview(kview, iview,
|
|
|
+ error_stack)) {
|
|
|
+ retval = BOOL_FALSE;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ kview = kview_from_iview(iview, error_stack);
|
|
|
+ }
|
|
|
+ if (!kview) {
|
|
|
+ retval = BOOL_FALSE;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!kscheme_add_view(kscheme, kview) && error_stack) {
|
|
|
+ char *msg = faux_str_sprintf("SCHEME: "
|
|
|
+ "Can't add PTYPE \"%s\"",
|
|
|
+ kview_name(kview));
|
|
|
+ faux_error_add(error_stack, msg);
|
|
|
+ faux_str_free(msg);
|
|
|
+ retval = BOOL_FALSE;
|
|
|
continue;
|
|
|
- kscheme_add_view(kscheme, kview);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return BOOL_TRUE;
|
|
|
+ return retval;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -194,7 +253,10 @@ kscheme_t *kscheme_from_ischeme(ischeme_t *ischeme, faux_error_t *error_stack)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
- kscheme_nested_from_ischeme(kscheme, ischeme, error_stack);
|
|
|
+ if (!kscheme_nested_from_ischeme(kscheme, ischeme, error_stack)) {
|
|
|
+ kscheme_free(kscheme);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
|
|
|
return kscheme;
|
|
|
}
|