Przeglądaj źródła

scheme: Move functions like kscheme_from_ischeme() to kscheme.c

Serj Kalichev 3 lat temu
rodzic
commit
c738714a4c

+ 2 - 2
bin/klishd/klishd.c

@@ -84,8 +84,8 @@ ischeme_t sch = {
       END_COMMAND_LIST,
     },
 
-//    VIEW {
-//    },
+    VIEW {
+    },
 
   END_VIEW_LIST,
 };

+ 5 - 0
klish/kptype.h

@@ -6,6 +6,7 @@
 #ifndef _klish_kptype_h
 #define _klish_kptype_h
 
+#include <faux/error.h>
 #include <klish/kaction.h>
 
 typedef struct kptype_s kptype_t;
@@ -38,6 +39,10 @@ bool_t kptype_set_name(kptype_t *ptype, const char *name);
 const char *kptype_help(const kptype_t *ptype);
 bool_t kptype_set_help(kptype_t *ptype, const char *help);
 
+bool_t kptype_nested_from_iptype(kptype_t *kptype, iptype_t *iptype,
+	faux_error_t *error_stack);
+kptype_t *kptype_from_iptype(iptype_t *iptype, faux_error_t *error_stack);
+
 C_DECL_END
 
 #endif // _klish_kptype_h

+ 2 - 0
klish/kscheme.h

@@ -63,6 +63,8 @@ kview_t *kscheme_find_view(const kscheme_t *scheme, const char *name);
 bool_t kscheme_add_ptype(kscheme_t *scheme, kptype_t *ptype);
 kptype_t *kscheme_find_ptype(const kscheme_t *scheme, const char *name);
 
+bool_t kscheme_nested_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme,
+	faux_error_t *error_stack);
 kscheme_t *kscheme_from_ischeme(ischeme_t *ischeme, faux_error_t *error_stack);
 
 C_DECL_END

+ 0 - 248
klish/kscheme/ischeme.c

@@ -10,251 +10,3 @@
 #include <klish/kscheme.h>
 
 
-bool_t kview_nested_from_iview(kview_t *kview, iview_t *iview,
-	faux_error_t *error_stack)
-{
-	bool_t retval = BOOL_TRUE;
-
-	if (!kview || !iview) {
-		faux_error_add(error_stack,
-			kview_strerror(KVIEW_ERROR_INTERNAL));
-		return BOOL_FALSE;
-	}
-
-	// COMMAND list
-	if (iview->commands) {
-		icommand_t **p_icommand = NULL;
-		for (p_icommand = *iview->commands; *p_icommand; p_icommand++) {
-			kcommand_t *kcommand = NULL;
-			icommand_t *icommand = *p_icommand;
-printf("command %s\n", icommand->name);
-//			kcommand = kcommand_from_icommand(icommand, error_stack);
-//			if (!kcommand) {
-//				retval = BOOL_FALSE;
-//				continue;
-//			}
-kcommand = kcommand;
-		}
-	}
-
-	return retval;
-}
-
-
-kview_t *kview_from_iview(iview_t *iview, faux_error_t *error_stack)
-{
-	kview_t *kview = NULL;
-	kview_error_e kview_error = KVIEW_ERROR_OK;
-
-	kview = kview_new(iview, &kview_error);
-	if (!kview) {
-		char *msg = NULL;
-		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);
-		return NULL;
-	}
-	printf("view %s\n", kview_name(kview));
-
-	// Parse nested elements
-	if (!kview_nested_from_iview(kview, iview, error_stack)) {
-		char *msg = NULL;
-		msg = faux_str_sprintf("VIEW \"%s\": Illegal nested elements",
-			kview_name(kview));
-		faux_error_add(error_stack, msg);
-		faux_str_free(msg);
-		kview_free(kview);
-		return NULL;
-	}
-
-	return kview;
-}
-
-
-bool_t kptype_nested_from_iptype(kptype_t *kptype, iptype_t *iptype,
-	faux_error_t *error_stack)
-{
-	bool_t retval = BOOL_TRUE;
-
-	if (!kptype || !iptype) {
-		faux_error_add(error_stack,
-			kptype_strerror(KPTYPE_ERROR_INTERNAL));
-		return BOOL_FALSE;
-	}
-
-	// ACTION list
-	if (iptype->actions) {
-		iaction_t **p_iaction = NULL;
-		for (p_iaction = *iptype->actions; *p_iaction; p_iaction++) {
-			kaction_t *kaction = NULL;
-			iaction_t *iaction = *p_iaction;
-iaction = iaction;
-printf("action\n");
-//			kaction = kaction_from_iaction(iaction, error_stack);
-//			if (!kaction) {
-//				retval = BOOL_FALSE;
-//				continue;
-//			}
-kaction = kaction;
-		}
-	}
-
-	return retval;
-}
-
-
-kptype_t *kptype_from_iptype(iptype_t *iptype, faux_error_t *error_stack)
-{
-	kptype_t *kptype = NULL;
-	kptype_error_e kptype_error = KPTYPE_ERROR_OK;
-
-	kptype = kptype_new(iptype, &kptype_error);
-	if (!kptype) {
-		char *msg = NULL;
-		msg = faux_str_sprintf("PTYPE \"%s\": %s",
-			iptype->name ? iptype->name : "(null)",
-			kptype_strerror(kptype_error));
-		faux_error_add(error_stack, msg);
-		faux_str_free(msg);
-		return NULL;
-	}
-	printf("ptype %s\n", kptype_name(kptype));
-
-	// Parse nested elements
-	if (!kptype_nested_from_iptype(kptype, iptype, error_stack)) {
-		char *msg = NULL;
-		msg = faux_str_sprintf("PTYPE \"%s\": Illegal nested elements",
-			kptype_name(kptype));
-		faux_error_add(error_stack, msg);
-		faux_str_free(msg);
-		kptype_free(kptype);
-		return NULL;
-	}
-
-	return kptype;
-}
-
-
-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) {
-		faux_error_add(error_stack,
-			kscheme_strerror(KSCHEME_ERROR_INTERNAL));
-		return BOOL_FALSE;
-	}
-
-	// PTYPE list
-	if (ischeme->ptypes) {
-		iptype_t **p_iptype = NULL;
-		for (p_iptype = *ischeme->ptypes; *p_iptype; p_iptype++) {
-			kptype_t *kptype = NULL;
-			iptype_t *iptype = *p_iptype;
-
-			kptype = kptype_from_iptype(iptype, error_stack);
-			if (!kptype) {
-				retval = BOOL_FALSE; // Don't stop
-				continue;
-			}
-			if (!kscheme_add_ptype(kscheme, kptype)) {
-				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;
-
-			if (view_name)
-				kview = kscheme_find_view(kscheme, view_name);
-
-			// VIEW already exists
-			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;
-				}
-				continue;
-			}
-
-			// New VIEW
-			kview = kview_from_iview(iview, error_stack);
-			if (!kview) {
-				retval = BOOL_FALSE;
-				continue;
-			}
-			if (!kscheme_add_view(kscheme, kview)) {
-				char *msg = faux_str_sprintf("SCHEME: "
-					"Can't add VIEW \"%s\"",
-					kview_name(kview));
-				faux_error_add(error_stack, msg);
-				faux_str_free(msg);
-				retval = BOOL_FALSE;
-				continue;
-			}
-		}
-	}
-
-	return retval;
-}
-
-
-kscheme_t *kscheme_from_ischeme(ischeme_t *ischeme, faux_error_t *error_stack)
-{
-	kscheme_t *kscheme = NULL;
-	kscheme_error_e kscheme_error = KSCHEME_ERROR_OK;
-
-	kscheme = kscheme_new(&kscheme_error);
-	if (!kscheme) {
-		faux_error_add(error_stack,
-			kscheme_strerror(kscheme_error));
-		return NULL;
-	}
-
-	if (!kscheme_nested_from_ischeme(kscheme, ischeme, error_stack)) {
-		kscheme_free(kscheme);
-		return NULL;
-	}
-
-	return kscheme;
-}

+ 65 - 0
klish/kscheme/kptype.c

@@ -5,6 +5,7 @@
 
 #include <faux/str.h>
 #include <faux/list.h>
+#include <faux/error.h>
 #include <klish/khelper.h>
 #include <klish/kptype.h>
 
@@ -136,3 +137,67 @@ bool_t kptype_parse(kptype_t *ptype, const iptype_t *info, kptype_error_e *error
 
 	return retval;
 }
+
+
+bool_t kptype_nested_from_iptype(kptype_t *kptype, iptype_t *iptype,
+	faux_error_t *error_stack)
+{
+	bool_t retval = BOOL_TRUE;
+
+	if (!kptype || !iptype) {
+		faux_error_add(error_stack,
+			kptype_strerror(KPTYPE_ERROR_INTERNAL));
+		return BOOL_FALSE;
+	}
+
+	// ACTION list
+	if (iptype->actions) {
+		iaction_t **p_iaction = NULL;
+		for (p_iaction = *iptype->actions; *p_iaction; p_iaction++) {
+			kaction_t *kaction = NULL;
+			iaction_t *iaction = *p_iaction;
+iaction = iaction;
+printf("action\n");
+//			kaction = kaction_from_iaction(iaction, error_stack);
+//			if (!kaction) {
+//				retval = BOOL_FALSE;
+//				continue;
+//			}
+kaction = kaction;
+		}
+	}
+
+	return retval;
+}
+
+
+kptype_t *kptype_from_iptype(iptype_t *iptype, faux_error_t *error_stack)
+{
+	kptype_t *kptype = NULL;
+	kptype_error_e kptype_error = KPTYPE_ERROR_OK;
+
+	kptype = kptype_new(iptype, &kptype_error);
+	if (!kptype) {
+		char *msg = NULL;
+		msg = faux_str_sprintf("PTYPE \"%s\": %s",
+			iptype->name ? iptype->name : "(null)",
+			kptype_strerror(kptype_error));
+		faux_error_add(error_stack, msg);
+		faux_str_free(msg);
+		return NULL;
+	}
+	printf("ptype %s\n", kptype_name(kptype));
+
+	// Parse nested elements
+	if (!kptype_nested_from_iptype(kptype, iptype, error_stack)) {
+		char *msg = NULL;
+		msg = faux_str_sprintf("PTYPE \"%s\": Illegal nested elements",
+			kptype_name(kptype));
+		faux_error_add(error_stack, msg);
+		faux_str_free(msg);
+		kptype_free(kptype);
+		return NULL;
+	}
+
+	return kptype;
+}

+ 123 - 0
klish/kscheme/kscheme.c

@@ -91,3 +91,126 @@ const char *kscheme_strerror(kscheme_error_e error)
 
 	return str;
 }
+
+
+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) {
+		faux_error_add(error_stack,
+			kscheme_strerror(KSCHEME_ERROR_INTERNAL));
+		return BOOL_FALSE;
+	}
+
+	// PTYPE list
+	if (ischeme->ptypes) {
+		iptype_t **p_iptype = NULL;
+		for (p_iptype = *ischeme->ptypes; *p_iptype; p_iptype++) {
+			kptype_t *kptype = NULL;
+			iptype_t *iptype = *p_iptype;
+
+			kptype = kptype_from_iptype(iptype, error_stack);
+			if (!kptype) {
+				retval = BOOL_FALSE; // Don't stop
+				continue;
+			}
+			if (!kscheme_add_ptype(kscheme, kptype)) {
+				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;
+
+			if (view_name)
+				kview = kscheme_find_view(kscheme, view_name);
+
+			// VIEW already exists
+			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;
+				}
+				continue;
+			}
+
+			// New VIEW
+			kview = kview_from_iview(iview, error_stack);
+			if (!kview) {
+				retval = BOOL_FALSE;
+				continue;
+			}
+			if (!kscheme_add_view(kscheme, kview)) {
+				char *msg = faux_str_sprintf("SCHEME: "
+					"Can't add VIEW \"%s\"",
+					kview_name(kview));
+				faux_error_add(error_stack, msg);
+				faux_str_free(msg);
+				retval = BOOL_FALSE;
+				continue;
+			}
+		}
+	}
+
+	return retval;
+}
+
+
+kscheme_t *kscheme_from_ischeme(ischeme_t *ischeme, faux_error_t *error_stack)
+{
+	kscheme_t *kscheme = NULL;
+	kscheme_error_e kscheme_error = KSCHEME_ERROR_OK;
+
+	kscheme = kscheme_new(&kscheme_error);
+	if (!kscheme) {
+		faux_error_add(error_stack,
+			kscheme_strerror(kscheme_error));
+		return NULL;
+	}
+
+	if (!kscheme_nested_from_ischeme(kscheme, ischeme, error_stack)) {
+		kscheme_free(kscheme);
+		return NULL;
+	}
+
+	return kscheme;
+}

+ 64 - 0
klish/kscheme/kview.c

@@ -5,6 +5,7 @@
 
 #include <faux/str.h>
 #include <faux/list.h>
+#include <faux/error.h>
 #include <klish/khelper.h>
 #include <klish/kcommand.h>
 #include <klish/kview.h>
@@ -130,3 +131,66 @@ bool_t kview_parse(kview_t *view, const iview_t *info, kview_error_e *error)
 
 	return retval;
 }
+
+
+bool_t kview_nested_from_iview(kview_t *kview, iview_t *iview,
+	faux_error_t *error_stack)
+{
+	bool_t retval = BOOL_TRUE;
+
+	if (!kview || !iview) {
+		faux_error_add(error_stack,
+			kview_strerror(KVIEW_ERROR_INTERNAL));
+		return BOOL_FALSE;
+	}
+
+	// COMMAND list
+	if (iview->commands) {
+		icommand_t **p_icommand = NULL;
+		for (p_icommand = *iview->commands; *p_icommand; p_icommand++) {
+			kcommand_t *kcommand = NULL;
+			icommand_t *icommand = *p_icommand;
+printf("command %s\n", icommand->name);
+//			kcommand = kcommand_from_icommand(icommand, error_stack);
+//			if (!kcommand) {
+//				retval = BOOL_FALSE;
+//				continue;
+//			}
+kcommand = kcommand;
+		}
+	}
+
+	return retval;
+}
+
+
+kview_t *kview_from_iview(iview_t *iview, faux_error_t *error_stack)
+{
+	kview_t *kview = NULL;
+	kview_error_e kview_error = KVIEW_ERROR_OK;
+
+	kview = kview_new(iview, &kview_error);
+	if (!kview) {
+		char *msg = NULL;
+		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);
+		return NULL;
+	}
+	printf("view %s\n", kview_name(kview));
+
+	// Parse nested elements
+	if (!kview_nested_from_iview(kview, iview, error_stack)) {
+		char *msg = NULL;
+		msg = faux_str_sprintf("VIEW \"%s\": Illegal nested elements",
+			kview_name(kview));
+		faux_error_add(error_stack, msg);
+		faux_str_free(msg);
+		kview_free(kview);
+		return NULL;
+	}
+
+	return kview;
+}

+ 5 - 0
klish/kview.h

@@ -7,6 +7,7 @@
 #define _klish_kview_h
 
 #include <faux/faux.h>
+#include <faux/error.h>
 #include <klish/kcommand.h>
 
 typedef struct kview_s kview_t;
@@ -37,6 +38,10 @@ bool_t kview_set_name(kview_t *view, const char *name);
 
 bool_t kview_add_command(kview_t *view, kcommand_t *command);
 
+bool_t kview_nested_from_iview(kview_t *kview, iview_t *iview,
+	faux_error_t *error_stack);
+kview_t *kview_from_iview(iview_t *iview, faux_error_t *error_stack);
+
 C_DECL_END
 
 #endif // _klish_kview_h