Przeglądaj źródła

scheme: strerror for kview

Serj Kalichev 3 lat temu
rodzic
commit
84d2ec792f
6 zmienionych plików z 96 dodań i 15 usunięć
  1. 11 2
      bin/klishd/klishd.c
  2. 12 4
      klish/kscheme.h
  3. 40 7
      klish/kscheme/ischeme.c
  4. 28 2
      klish/kscheme/kscheme.c
  5. 3 0
      klish/kscheme/kview.c
  6. 2 0
      klish/kview.h

+ 11 - 2
bin/klishd/klishd.c

@@ -153,8 +153,17 @@ int main(int argc, char **argv)
 	}
 
 	// Load scheme
-	scheme = kscheme_new();
-	kscheme_from_ischeme(scheme, &sch, NULL);
+	{
+//	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);
+	}
 
 	// Listen socket
 	syslog(LOG_DEBUG, "Create listen UNIX socket: %s\n", opts->unix_socket_path);

+ 12 - 4
klish/kscheme.h

@@ -6,6 +6,7 @@
 #ifndef _klish_kscheme_h
 #define _klish_kscheme_h
 
+#include <faux/error.h>
 
 #include <klish/kptype.h>
 #include <klish/kaction.h>
@@ -32,16 +33,23 @@ typedef struct ischeme_s {
 } ischeme_t;
 
 
+typedef enum {
+	KSCHEME_ERROR_OK,
+	KSCHEME_ERROR_INTERNAL,
+	KSCHEME_ERROR_ALLOC,
+} kscheme_error_e;
+
+
 C_DECL_BEGIN
 
-kscheme_t *kscheme_new(void);
+kscheme_t *kscheme_new(kscheme_error_e *error);
 void kscheme_free(kscheme_t *scheme);
+
+const char *kscheme_strerror(kscheme_error_e error);
 bool_t kscheme_add_view(kscheme_t *scheme, kview_t *view);
 kview_t *kscheme_find_view(const kscheme_t *scheme, const char *name);
 
-
-kscheme_t *kscheme_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme, faux_list_t *error_stack);
-
+kscheme_t *kscheme_from_ischeme(ischeme_t *ischeme, faux_error_t *error_stack);
 
 C_DECL_END
 

+ 40 - 7
klish/kscheme/ischeme.c

@@ -5,26 +5,59 @@
 
 #include <faux/str.h>
 #include <faux/list.h>
+#include <faux/error.h>
 #include <klish/kview.h>
 #include <klish/kscheme.h>
 
 
-kscheme_t *kscheme_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme, faux_list_t *error_stack)
+bool_t kscheme_nested_from_ischeme(kscheme_t *kscheme, ischeme_t *ischeme,
+	faux_error_t *error_stack)
 {
+	if (!kscheme || !ischeme) {
+		if (error_stack)
+			faux_error_add(error_stack,
+				kscheme_strerror(KSCHEME_ERROR_INTERNAL));
+		return BOOL_FALSE;
+	}
 
-	if (!kscheme)
-		return NULL;
-
+	// View list
 	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;
+			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));
+				continue;
+			}
+//			kview_from_iview
 			printf("view %p %s\n", iview, iview->name);
-			kview = kview;
 		}
 	}
 
-	error_stack = error_stack;
-	return NULL;
+	return BOOL_TRUE;
+}
+
+
+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) {
+		if (error_stack)
+			faux_error_add(error_stack,
+				kscheme_strerror(kscheme_error));
+		return NULL;
+	}
+
+	kscheme_nested_from_ischeme(kscheme, ischeme, error_stack);
+
+	return kscheme;
 }

+ 28 - 2
klish/kscheme/kscheme.c

@@ -32,14 +32,17 @@ static int kscheme_view_kcompare(const void *key, const void *list_item)
 }
 
 
-kscheme_t *kscheme_new(void)
+kscheme_t *kscheme_new(kscheme_error_e *error)
 {
 	kscheme_t *scheme = NULL;
 
 	scheme = faux_zmalloc(sizeof(*scheme));
 	assert(scheme);
-	if (!scheme)
+	if (!scheme) {
+		if (error)
+			*error = KSCHEME_ERROR_ALLOC;
 		return NULL;
+	}
 
 	// Initialize
 	scheme->views = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
@@ -61,6 +64,29 @@ void kscheme_free(kscheme_t *scheme)
 }
 
 
+const char *kscheme_strerror(kscheme_error_e error)
+{
+	const char *str = NULL;
+
+	switch (error) {
+	case KSCHEME_ERROR_OK:
+		str = "Ok";
+		break;
+	case KSCHEME_ERROR_INTERNAL:
+		str = "Internal error";
+		break;
+	case KVIEW_ERROR_ALLOC:
+		str = "Memory allocation error";
+		break;
+	default:
+		str = "Unknown error";
+		break;
+	}
+
+	return str;
+}
+
+
 bool_t kscheme_add_view(kscheme_t *scheme, kview_t *view)
 {
 	assert(scheme);

+ 3 - 0
klish/kscheme/kview.c

@@ -103,6 +103,9 @@ const char *kview_strerror(kview_error_e error)
 	case KVIEW_ERROR_OK:
 		str = "Ok";
 		break;
+	case KVIEW_ERROR_INTERNAL:
+		str = "Internal error";
+		break;
 	case KVIEW_ERROR_ALLOC:
 		str = "Memory allocation error";
 		break;

+ 2 - 0
klish/kview.h

@@ -19,6 +19,7 @@ typedef struct iview_s {
 
 typedef enum {
 	KVIEW_ERROR_OK,
+	KVIEW_ERROR_INTERNAL,
 	KVIEW_ERROR_ALLOC,
 	KVIEW_ERROR_ATTR_NAME,
 } kview_error_e;
@@ -29,6 +30,7 @@ C_DECL_BEGIN
 kview_t *kview_new(const iview_t *info, kview_error_e *error);
 void kview_free(kview_t *view);
 bool_t kview_parse(kview_t *view, const iview_t *info, kview_error_e *error);
+const char *kview_strerror(kview_error_e error);
 
 const char *kview_name(const kview_t *view);
 bool_t kview_set_name(kview_t *view, const char *name);