and add a 'find' ops.

Signed-off-by: Daniel Lezcano <daniel.lezc...@linaro.org>
---
 clocks.c  |   87 ++++++++++++++++++++++++++++++++++--------------------------
 display.c |   17 ++++++++++--
 display.h |    1 +
 3 files changed, 64 insertions(+), 41 deletions(-)

diff --git a/clocks.c b/clocks.c
index 59db8a7..2ae2f5a 100644
--- a/clocks.c
+++ b/clocks.c
@@ -159,28 +159,6 @@ static int dump_all_parents(char *clkarg)
        return tree_for_each_parent(tree, dump_clock_cb, NULL);
 }
 
-void find_parents_for_clock(char *clkname, int complete)
-{
-       char name[256];
-
-       name[0] = '\0';
-       if (!complete) {
-               char str[256];
-
-               strcat(name, clkname);
-               sprintf(str, "Enter Clock Name : %s\n", name);
-               display_reset_cursor(CLOCK);
-               display_print_line(CLOCK, 0, str, 1, NULL);
-               display_refresh_pad(CLOCK);
-               return;
-       }
-       sprintf(name, "Parents for \"%s\" Clock : \n", clkname);
-       display_reset_cursor(CLOCK);
-       display_print_line(CLOCK, 0, name, 1, NULL);
-       display_refresh_pad(CLOCK);
-       dump_all_parents(clkname);
-}
-
 static inline int read_clock_cb(struct tree *t, void *data)
 {
        struct clock_info *clk = t->private;
@@ -192,9 +170,9 @@ static inline int read_clock_cb(struct tree *t, void *data)
        return 0;
 }
 
-static int read_clock_info(void)
+static int read_clock_info(struct tree *tree)
 {
-       return tree_for_each(clock_tree, read_clock_cb, NULL);
+       return tree_for_each(tree, read_clock_cb, NULL);
 }
 
 static int fill_clock_cb(struct tree *t, void *data)
@@ -259,20 +237,12 @@ free_clkname:
        return clkline;
 }
 
-static int clock_print_info_cb(struct tree *t, void *data)
+static int _clock_print_info_cb(struct tree *t, void *data)
 {
        struct clock_info *clock = t->private;
        int *line = data;
        char *buffer;
 
-        /* we skip the root node of the tree */
-       if (!t->parent)
-               return 0;
-
-        /* show the clock when *all* its parent is expanded */
-       if (tree_for_each_parent(t->parent, is_collapsed, NULL))
-               return 0;
-
        buffer = clock_line(t);
        if (!buffer)
                return -1;
@@ -286,6 +256,19 @@ static int clock_print_info_cb(struct tree *t, void *data)
        return 0;
 }
 
+static int clock_print_info_cb(struct tree *t, void *data)
+{
+        /* we skip the root node of the tree */
+       if (!t->parent)
+               return 0;
+
+        /* show the clock when *all* its parent is expanded */
+       if (tree_for_each_parent(t->parent, is_collapsed, NULL))
+               return 0;
+
+       return _clock_print_info_cb(t, data);
+}
+
 static int clock_print_header(void)
 {
        char *buf;
@@ -302,7 +285,7 @@ static int clock_print_header(void)
        return ret;
 }
 
-static int clock_print_info(void)
+static int clock_print_info(struct tree *tree)
 {
        int ret, line = 0;
 
@@ -310,7 +293,7 @@ static int clock_print_info(void)
 
        clock_print_header();
 
-       ret = tree_for_each(clock_tree, clock_print_info_cb, &line);
+       ret = tree_for_each(tree, clock_print_info_cb, &line);
 
        display_refresh_pad(CLOCK);
 
@@ -334,10 +317,37 @@ static int clock_toggle_expanded(void)
  */
 static int clock_display(void)
 {
-       if (read_clock_info())
+       if (read_clock_info(clock_tree))
                return -1;
 
-       return clock_print_info();
+       return clock_print_info(clock_tree);
+}
+
+int clock_find(const char *name)
+{
+       struct tree **ptree = NULL;
+       int i, nr, line = 0, ret = 0;
+
+       nr = tree_finds(clock_tree, name, &ptree);
+
+       display_reset_cursor(CLOCK);
+
+       for (i = 0; i < nr; i++) {
+
+               ret = read_clock_info(ptree[i]);
+               if (ret)
+                       break;
+
+               ret = _clock_print_info_cb(ptree[i], &line);
+               if (ret)
+                       break;
+       }
+
+       display_refresh_pad(CLOCK);
+
+       free(ptree);
+
+       return ret;
 }
 
 /*
@@ -350,7 +360,7 @@ int clock_dump(char *clk)
 {
        int ret;
 
-       if (read_clock_info())
+       if (read_clock_info(clock_tree))
                return -1;
 
        if (clk) {
@@ -370,6 +380,7 @@ int clock_dump(char *clk)
 static struct display_ops clock_ops = {
        .display = clock_display,
        .select  = clock_toggle_expanded,
+       .find    = clock_find,
 };
 
 /*
diff --git a/display.c b/display.c
index 12eb052..1dc11dd 100644
--- a/display.c
+++ b/display.c
@@ -16,6 +16,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <ctype.h>
 #include <ncurses.h>
 #include <sys/types.h>
 #include <regex.h>
@@ -424,7 +425,6 @@ static int display_find_keystroke(int fd, void *data)
        regex_t *reg = findd->reg;
        char *string = findd->string;
        int keystroke = getch();
-
        char match[2] = { [0] = (char)keystroke, [1] = '\0' };
        regmatch_t m[1];
 
@@ -434,6 +434,14 @@ static int display_find_keystroke(int fd, void *data)
                display_find_form_fini(findd);
                return display_switch_to_main(fd);
 
+       case KEY_DOWN:
+               display_next_line();
+               break;
+
+       case KEY_UP:
+               display_prev_line();
+               break;
+
        case KEY_BACKSPACE:
                if (strlen(string))
                        string[strlen(string) - 1] = '\0';
@@ -455,10 +463,13 @@ static int display_find_keystroke(int fd, void *data)
                break;
        }
 
-       if (display_show_header(current_win))
+       if (!windata[current_win].ops || !windata[current_win].ops->find)
+               return 0;
+
+       if (windata[current_win].ops->find(string))
                return -1;
 
-       if (display_refresh(current_win))
+       if (display_show_header(current_win))
                return -1;
 
        if (display_show_footer(current_win, strlen(string) ? string :
diff --git a/display.h b/display.h
index f9a762c..fe084cb 100644
--- a/display.h
+++ b/display.h
@@ -18,6 +18,7 @@ enum { CLOCK, REGULATOR, SENSOR };
 struct display_ops {
        int (*display)(void);
        int (*select)(void);
+       int (*find)(const char *);
 };
 
 extern int display_print_line(int window, int line, char *str,
-- 
1.7.1


_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to