Parcourir la source

scheme: Add forgotten khelper.h

Serj Kalichev il y a 3 ans
Parent
commit
bb28ee35b7
3 fichiers modifiés avec 121 ajouts et 13 suppressions
  1. 74 0
      klish/khelper.h
  2. 45 11
      klish/kscheme/kview.c
  3. 2 2
      klish/kview.h

+ 74 - 0
klish/khelper.h

@@ -0,0 +1,74 @@
+/** @file khelper.h
+ * @brief Macros for simplifying to write subsystem's service functions.
+ */
+
+#ifndef _khelper_h
+#define _khelper_h
+
+#include <faux/faux.h>
+#include <faux/str.h>
+
+// Function to get value from structure by name
+#define _KGET(obj, type, name) \
+	type obj##_##name(const obj##_t *inst)
+#define KGET(obj, type, name) \
+	_KGET(obj, type, name) { \
+		assert(inst); \
+		return inst->name; \
+	}
+
+#define _KGET_STR(obj, name) \
+	_KGET(obj, const char *, name)
+#define KGET_STR(obj, name) \
+	KGET(obj, const char *, name)
+
+#define _KGET_BOOL(obj, name) \
+	_KGET(obj, bool_t, name)
+#define KGET_BOOL(obj, name) \
+	KGET(obj, bool_t, name)
+
+// Function to set value to structure by name
+#define _KSET(obj, type, name) \
+	bool_t obj##_set_##name(obj##_t *inst, type val)
+#define KSET(obj, type, name) \
+	_KSET(obj, type, name) { \
+		assert(inst); \
+		inst->name = val; \
+		return BOOL_TRUE; \
+	}
+
+#define _KSET_ONCE(obj, type, name) \
+	_KSET(obj, type, name)
+#define KSET_ONCE(obj, type, name) \
+	_KSET_ONCE(obj, type, name) { \
+		assert(inst); \
+		assert(!inst->name); \
+		inst->name = val; \
+	}
+
+#define _KSET_STR(obj, name) \
+	_KSET(obj, const char *, name)
+#define KSET_STR(obj, name) \
+	_KSET_STR(obj, name) { \
+		assert(inst); \
+		faux_str_free(inst->name); \
+		inst->name = faux_str_dup(val); \
+		return BOOL_TRUE; \
+	}
+
+#define _KSET_STR_ONCE(obj, name) \
+	_KSET_STR(obj, name)
+#define KSET_STR_ONCE(obj, name) \
+	_KSET_STR_ONCE(obj, name) { \
+		assert(inst); \
+		assert(!inst->name); \
+		inst->name = faux_str_dup(val); \
+		return BOOL_TRUE; \
+	}
+
+#define _KSET_BOOL(obj, name) \
+	_KSET(obj, bool_t, name)
+#define KSET_BOOL(obj, name) \
+	KSET(obj, bool_t, name)
+
+#endif // _khelper_h

+ 45 - 11
klish/kscheme/kview.c

@@ -65,8 +65,11 @@ kview_t *kview_new(const iview_t *info, kview_error_e *error)
 
 	view = kview_new_empty();
 	assert(view);
-	if (!view)
+	if (!view) {
+		if (error)
+			*error = KVIEW_ERROR_ALLOC;
 		return NULL;
+	}
 
 	if (!info)
 		return view;
@@ -92,6 +95,47 @@ void kview_free(kview_t *view)
 }
 
 
+const char *kview_strerror(kview_error_e error)
+{
+	const char *str = NULL;
+
+	switch (error) {
+	case KVIEW_ERROR_OK:
+		str = "Ok";
+		break;
+	case KVIEW_ERROR_ALLOC:
+		str = "Memory allocation error";
+		break;
+	case KVIEW_ERROR_ATTR_NAME:
+		str = "Illegal attribute \"name\"";
+		break;
+	default:
+		str = "Unknown error";
+		break;
+	}
+
+	return str;
+}
+
+
+bool_t kview_parse(kview_t *view, const iview_t *info, kview_error_e *error)
+{
+	view = view;
+	info = info;
+	error = error;
+
+	// Name
+	if (!faux_str_is_empty(info->name))
+		if (!kview_set_name(view, info->name)) {
+			if (error)
+				*error = KVIEW_ERROR_ATTR_NAME;
+			return BOOL_FALSE;
+	}
+
+	return BOOL_TRUE;
+}
+
+
 bool_t kview_add_command(kview_t *view, kcommand_t *command)
 {
 	assert(view);
@@ -106,13 +150,3 @@ bool_t kview_add_command(kview_t *view, kcommand_t *command)
 
 	return BOOL_TRUE;
 }
-
-
-bool_t kview_parse(kview_t *view, const iview_t *info, kview_error_e *error)
-{
-	view = view;
-	info = info;
-	error = error;
-
-	return BOOL_TRUE;
-}

+ 2 - 2
klish/kview.h

@@ -19,8 +19,8 @@ typedef struct iview_s {
 
 typedef enum {
 	KVIEW_ERROR_OK,
-	KVIEW_ERROR_MALLOC,
-	KVIEW_ERROR_LIST
+	KVIEW_ERROR_ALLOC,
+	KVIEW_ERROR_ATTR_NAME,
 } kview_error_e;