瀏覽代碼

scheme: kview_from_iview

Serj Kalichev 3 年之前
父節點
當前提交
6cf039b718
共有 3 個文件被更改,包括 100 次插入27 次删除
  1. 21 9
      bin/klishd/klishd.c
  2. 68 10
      klish/kscheme/ischeme.c
  3. 11 8
      klish/kscheme/kview.c

+ 21 - 9
bin/klishd/klishd.c

@@ -29,6 +29,7 @@
 #include <faux/conv.h>
 #include <faux/file.h>
 #include <faux/eloop.h>
+#include <faux/error.h>
 
 #include <klish/ktp.h>
 #include <klish/ktp_session.h>
@@ -49,6 +50,16 @@ ischeme_t sch = {
           .help = "help1",
         },
 
+        COMMAND {
+          .name = "command2",
+          .help = "help1",
+        },
+
+        COMMAND {
+          .name = "command3",
+          .help = "help1",
+        },
+
       END_COMMAND_LIST,
     },
 
@@ -56,6 +67,9 @@ ischeme_t sch = {
       .name = "view2",
     },
 
+    VIEW {
+    },
+
   END_VIEW_LIST,
 };
 
@@ -154,15 +168,13 @@ int main(int argc, char **argv)
 
 	// Load scheme
 	{
-//	kscheme_error_e kscheme_error = KSCHEME_ERROR_OK;
-//	scheme = kscheme_new(&kscheme_error);
-//	if (!scheme) {
-//		if (error_stack)
-//			faux_list_add(error_stack,
-//				kscheme_strerror(kscheme_error);
-//		return NULL;
-//	}
-	scheme = kscheme_from_ischeme(&sch, NULL);
+	faux_error_t *error = faux_error_new();
+	scheme = kscheme_from_ischeme(&sch, error);
+	if (faux_error(error)) {
+		fprintf(stderr, "Scheme errors:\n");
+		faux_error_print(error);
+		goto err;
+	}
 	}
 
 	// Listen socket

+ 68 - 10
klish/kscheme/ischeme.c

@@ -10,6 +10,70 @@
 #include <klish/kscheme.h>
 
 
+bool_t kview_nested_from_iview(kview_t *kview, iview_t *iview,
+	faux_error_t *error_stack)
+{
+	if (!kview || !iview) {
+		if (error_stack)
+			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)
+//				continue;
+kcommand = kcommand;
+		}
+	}
+
+	return BOOL_TRUE;
+}
+
+
+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;
+	ssize_t error_stack_len = 0;
+
+	kview = kview_new(iview, &kview_error);
+	if (!kview) {
+		if (error_stack) {
+			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 (error_stack)
+		error_stack_len = faux_error_len(error_stack);
+	kview_nested_from_iview(kview, iview, error_stack);
+	if (error_stack && (faux_error_len(error_stack) > error_stack_len)) {
+		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);
+	}
+
+	return kview;
+}
+
+
 bool_t kscheme_nested_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme,
 	faux_error_t *error_stack)
 {
@@ -26,17 +90,11 @@ bool_t kscheme_nested_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme,
 		for (p_iview = *ischeme->views; *p_iview; p_iview++) {
 			kview_t *kview = NULL;
 			iview_t *iview = *p_iview;
-			kview_error_e kview_error = KVIEW_ERROR_OK;
 
-			kview = kview_new(iview, &kview_error);
-			if (!kview) {
-				if (error_stack)
-					faux_error_add(error_stack,
-						kview_strerror(kview_error));
+			kview = kview_from_iview(iview, error_stack);
+			if (!kview)
 				continue;
-			}
-//			kview_from_iview
-			printf("view %p %s\n", iview, iview->name);
+			kscheme_add_view(kscheme, kview);
 		}
 	}
 
@@ -60,4 +118,4 @@ kscheme_t *kscheme_from_ischeme(ischeme_t *ischeme, faux_error_t *error_stack)
 	kscheme_nested_from_ischeme(kscheme, ischeme, error_stack);
 
 	return kscheme;
-}
+}

+ 11 - 8
klish/kscheme/kview.c

@@ -110,7 +110,7 @@ const char *kview_strerror(kview_error_e error)
 		str = "Memory allocation error";
 		break;
 	case KVIEW_ERROR_ATTR_NAME:
-		str = "Illegal attribute \"name\"";
+		str = "Illegal 'name' attribute";
 		break;
 	default:
 		str = "Unknown error";
@@ -123,19 +123,22 @@ const char *kview_strerror(kview_error_e error)
 
 bool_t kview_parse(kview_t *view, const iview_t *info, kview_error_e *error)
 {
-	view = view;
-	info = info;
-	error = error;
+	bool_t retval = BOOL_TRUE;
 
-	// Name
-	if (!faux_str_is_empty(info->name))
+	// Name [mandatory]
+	if (faux_str_is_empty(info->name)) {
+		if (error)
+			*error = KVIEW_ERROR_ATTR_NAME;
+		retval = BOOL_FALSE;
+	} else {
 		if (!kview_set_name(view, info->name)) {
 			if (error)
 				*error = KVIEW_ERROR_ATTR_NAME;
-			return BOOL_FALSE;
+			retval = BOOL_FALSE;
+		}
 	}
 
-	return BOOL_TRUE;
+	return retval;
 }