|
@@ -4,15 +4,36 @@
|
|
|
#include <assert.h>
|
|
|
|
|
|
#include <faux/str.h>
|
|
|
+#include <faux/list.h>
|
|
|
+#include <klish/kcommand.h>
|
|
|
#include <klish/kview.h>
|
|
|
|
|
|
|
|
|
struct kview_s {
|
|
|
bool_t is_static;
|
|
|
kview_info_t info;
|
|
|
+ faux_list_t *commands;
|
|
|
};
|
|
|
|
|
|
|
|
|
+static int kview_command_compare(const void *first, const void *second)
|
|
|
+{
|
|
|
+ const kcommand_t *f = (const kcommand_t *)first;
|
|
|
+ const kcommand_t *s = (const kcommand_t *)second;
|
|
|
+
|
|
|
+ return strcmp(kcommand_name(f), kcommand_name(s));
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int kview_command_kcompare(const void *key, const void *list_item)
|
|
|
+{
|
|
|
+ const char *f = (const char *)key;
|
|
|
+ const kcommand_t *s = (const kcommand_t *)list_item;
|
|
|
+
|
|
|
+ return strcmp(f, kcommand_name(s));
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static kview_t *kview_new_internal(kview_info_t info, bool_t is_static)
|
|
|
{
|
|
|
kview_t *view = NULL;
|
|
@@ -26,6 +47,11 @@ static kview_t *kview_new_internal(kview_info_t info, bool_t is_static)
|
|
|
view->is_static = is_static;
|
|
|
view->info = info;
|
|
|
|
|
|
+ view->commands = faux_list_new(FAUX_LIST_SORTED, FAUX_LIST_UNIQUE,
|
|
|
+ kview_command_compare, kview_command_kcompare,
|
|
|
+ (void (*)(void *))kcommand_free);
|
|
|
+ assert(view->commands);
|
|
|
+
|
|
|
return view;
|
|
|
}
|
|
|
|
|
@@ -50,6 +76,7 @@ void kview_free(kview_t *view)
|
|
|
if (!view->is_static) {
|
|
|
faux_str_free(view->info.name);
|
|
|
}
|
|
|
+ faux_list_free(view->commands);
|
|
|
|
|
|
faux_free(view);
|
|
|
}
|
|
@@ -63,3 +90,19 @@ const char *kview_name(const kview_t *view)
|
|
|
|
|
|
return view->info.name;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+bool_t kview_add_command(kview_t *view, kcommand_t *command)
|
|
|
+{
|
|
|
+ assert(view);
|
|
|
+ if (!view)
|
|
|
+ return BOOL_FALSE;
|
|
|
+ assert(command);
|
|
|
+ if (!command)
|
|
|
+ return BOOL_FALSE;
|
|
|
+
|
|
|
+ if (!faux_list_add(view->commands, command))
|
|
|
+ return BOOL_FALSE;
|
|
|
+
|
|
|
+ return BOOL_TRUE;
|
|
|
+}
|