Pārlūkot izejas kodu

entry: Update schemes due to entry

Serj Kalichev 2 gadi atpakaļ
vecāks
revīzija
d863f6d980

+ 1 - 0
klish/ischeme/Makefile.am

@@ -6,4 +6,5 @@ libklish_la_SOURCES += \
 	klish/ischeme/iptype.c \
 	klish/ischeme/iview.c \
 	klish/ischeme/inspace.c \
+	klish/ischeme/ientry.c \
 	klish/ischeme/ischeme.c

+ 2 - 0
klish/ischeme/ientry.c

@@ -5,6 +5,7 @@
 
 #include <faux/str.h>
 #include <faux/list.h>
+#include <faux/conv.h>
 #include <klish/khelper.h>
 #include <klish/ientry.h>
 #include <klish/kptype.h>
@@ -243,6 +244,7 @@ char *ientry_deploy(const kentry_t *kentry, int level)
 	char *tmp = NULL;
 	char *mode = NULL;
 	kentry_entrys_node_t *entrys_iter = NULL;
+	kentry_actions_node_t *actions_iter = NULL;
 	char *num = NULL;
 
 	tmp = faux_str_sprintf("%*cENTRY {\n", level, ' ');

+ 69 - 0
klish/ischeme/ischeme.c

@@ -133,6 +133,54 @@ bool_t ischeme_parse_nested(const ischeme_t *ischeme, kscheme_t *kscheme,
 		}
 	}
 
+	// ENTRY list
+	// ENTRYs can be duplicate. Duplicated ENTRY will add nested
+	// elements to existent ENTRY. Also it can overwrite ENTRY attributes.
+	// So there is no special rule which attribute value will be "on top".
+	// It's a random. Technically later ENTRYs will rewrite previous
+	// values.
+	if (ischeme->entrys) {
+		ientry_t **p_ientry = NULL;
+		for (p_ientry = *ischeme->entrys; *p_ientry; p_ientry++) {
+			kentry_t *nkentry = NULL;
+			ientry_t *nientry = *p_ientry;
+			const char *entry_name = nientry->name;
+
+			if (entry_name)
+				nkentry = kscheme_find_entry(kscheme, entry_name);
+
+			// ENTRY already exists
+			if (nkentry) {
+				if (!ientry_parse(nientry, nkentry, error)) {
+					retval = BOOL_FALSE;
+					continue;
+				}
+				if (!ientry_parse_nested(nientry, nkentry,
+					error)) {
+					retval = BOOL_FALSE;
+					continue;
+				}
+				continue;
+			}
+
+			// New ENTRY
+			nkentry = ientry_load(nientry, error);
+			if (!nkentry) {
+				retval = BOOL_FALSE;
+				continue;
+			}
+			kentry_set_parent(nkentry, NULL); // Set empty parent entry
+			if (!kscheme_add_entry(kscheme, nkentry)) {
+				faux_error_sprintf(error,
+					TAG": Can't add ENTRY \"%s\"",
+					kentry_name(nkentry));
+				kentry_free(nkentry);
+				retval = BOOL_FALSE;
+				continue;
+			}
+		}
+	}
+
 	if (!retval)
 		faux_error_sprintf(error, TAG": Illegal nested elements");
 
@@ -161,6 +209,7 @@ char *ischeme_deploy(const kscheme_t *scheme, int level)
 	kscheme_plugins_node_t *plugins_iter = NULL;
 	kscheme_ptypes_node_t *ptypes_iter = NULL;
 	kscheme_views_node_t *views_iter = NULL;
+	kscheme_entrys_node_t *entrys_iter = NULL;
 
 	tmp = faux_str_sprintf("ischeme_t sch = {\n");
 	faux_str_cat(&str, tmp);
@@ -226,6 +275,26 @@ char *ischeme_deploy(const kscheme_t *scheme, int level)
 		faux_str_free(tmp);
 	}
 
+	// ENTRY list
+	entrys_iter = kscheme_entrys_iter(scheme);
+	if (entrys_iter) {
+		kentry_t *entry = NULL;
+
+		tmp = faux_str_sprintf("\n%*cENTRY_LIST\n\n", level, ' ');
+		faux_str_cat(&str, tmp);
+		faux_str_free(tmp);
+
+		while ((entry = kscheme_entrys_each(&entrys_iter))) {
+			tmp = ientry_deploy(entry, level + 2);
+			faux_str_cat(&str, tmp);
+			faux_str_free(tmp);
+		}
+
+		tmp = faux_str_sprintf("%*cEND_ENTRY_LIST,\n", level + 1, ' ');
+		faux_str_cat(&str, tmp);
+		faux_str_free(tmp);
+	}
+
 	tmp = faux_str_sprintf("};\n");
 	faux_str_cat(&str, tmp);
 	faux_str_free(tmp);

+ 12 - 3
klish/kscheme.h

@@ -10,6 +10,7 @@
 #include <klish/kplugin.h>
 #include <klish/kptype.h>
 #include <klish/kview.h>
+#include <klish/kentry.h>
 #include <klish/kcontext_base.h>
 
 
@@ -18,6 +19,7 @@ typedef struct kscheme_s kscheme_t;
 typedef faux_list_node_t kscheme_views_node_t;
 typedef faux_list_node_t kscheme_ptypes_node_t;
 typedef faux_list_node_t kscheme_plugins_node_t;
+typedef faux_list_node_t kscheme_entrys_node_t;
 
 
 C_DECL_BEGIN
@@ -25,6 +27,9 @@ C_DECL_BEGIN
 kscheme_t *kscheme_new(void);
 void kscheme_free(kscheme_t *scheme);
 
+bool_t kscheme_prepare(kscheme_t *scheme, kcontext_t *context, faux_error_t *error);
+bool_t kscheme_fini(kscheme_t *scheme, kcontext_t *context, faux_error_t *error);
+
 // VIEWs
 faux_list_t *kscheme_views(const kscheme_t *scheme);
 bool_t kscheme_add_view(kscheme_t *scheme, kview_t *view);
@@ -49,9 +54,13 @@ ssize_t kscheme_plugins_len(const kscheme_t *scheme);
 kscheme_plugins_node_t *kscheme_plugins_iter(const kscheme_t *scheme);
 kplugin_t *kscheme_plugins_each(kscheme_plugins_node_t **iter);
 
-bool_t kscheme_prepare(kscheme_t *scheme, kcontext_t *context, faux_error_t *error);
-bool_t kscheme_fini(kscheme_t *scheme, kcontext_t *context, faux_error_t *error);
-
+// ENTRYs
+faux_list_t *kscheme_entrys(const kscheme_t *scheme);
+bool_t kscheme_add_entry(kscheme_t *scheme, kentry_t *entry);
+kentry_t *kscheme_find_entry(const kscheme_t *scheme, const char *name);
+ssize_t kscheme_entrys_len(const kscheme_t *scheme);
+kscheme_entrys_node_t *kscheme_entrys_iter(const kscheme_t *scheme);
+kentry_t *kscheme_entrys_each(kscheme_entrys_node_t **iter);
 
 C_DECL_END
 

+ 22 - 0
klish/kscheme/kscheme.c

@@ -11,6 +11,7 @@
 #include <klish/kptype.h>
 #include <klish/kview.h>
 #include <klish/knspace.h>
+#include <klish/kentry.h>
 #include <klish/kscheme.h>
 #include <klish/kcontext.h>
 
@@ -19,6 +20,7 @@ struct kscheme_s {
 	faux_list_t *plugins;
 	faux_list_t *ptypes;
 	faux_list_t *views;
+	faux_list_t *entrys;
 };
 
 // Simple methods
@@ -53,6 +55,16 @@ KNESTED_LEN(scheme, view);
 KNESTED_ITER(scheme, view);
 KNESTED_EACH(scheme, view);
 
+// ENTRY list
+KGET(scheme, faux_list_t *, entrys);
+KCMP_NESTED(scheme, entry, name);
+KCMP_NESTED_BY_KEY(scheme, entry, name);
+KADD_NESTED(scheme, entry);
+KFIND_NESTED(scheme, entry);
+KNESTED_LEN(scheme, entry);
+KNESTED_ITER(scheme, entry);
+KNESTED_EACH(scheme, entry);
+
 
 kscheme_t *kscheme_new(void)
 {
@@ -81,6 +93,14 @@ kscheme_t *kscheme_new(void)
 		(void (*)(void *))kview_free);
 	assert(scheme->views);
 
+	// ENTRY list
+	// Must be unsorted because order is important
+	scheme->entrys = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_UNIQUE,
+		kscheme_entry_compare, kscheme_entry_kcompare,
+		(void (*)(void *))kentry_free);
+	assert(scheme->entrys);
+
+
 	return scheme;
 }
 
@@ -93,6 +113,8 @@ void kscheme_free(kscheme_t *scheme)
 	faux_list_free(scheme->plugins);
 	faux_list_free(scheme->ptypes);
 	faux_list_free(scheme->views);
+	faux_list_free(scheme->entrys);
+
 	faux_free(scheme);
 }