Signed-off-by: Daniel Lezcano <daniel.lezc...@linaro.org>
---
 display.c |  121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 113 insertions(+), 8 deletions(-)

diff --git a/display.c b/display.c
index be78ce0..12eb052 100644
--- a/display.c
+++ b/display.c
@@ -17,7 +17,8 @@
 #include <string.h>
 #include <stdlib.h>
 #include <ncurses.h>
-#include <form.h>
+#include <sys/types.h>
+#include <regex.h>
 #include "powerdebug.h"
 #include "mainloop.h"
 #include "regulator.h"
@@ -98,11 +99,11 @@ static int display_show_header(int win)
 #define footer_label " Q (Quit)  R (Refresh) Other Keys: 'Left', " \
        "'Right' , 'Up', 'Down', 'enter', , 'Esc'"
 
-static int display_show_footer(int win)
+static int display_show_footer(int win, char *string)
 {
        werase(footer_win);
        wattron(footer_win, A_REVERSE);
-       mvwprintw(footer_win, 0, 0, "%s", footer_label);
+       mvwprintw(footer_win, 0, 0, "%s", string ? string : footer_label);
        wattroff(footer_win, A_REVERSE);
        wrefresh(footer_win);
 
@@ -274,12 +275,78 @@ int display_print_line(int win, int line, char *str, int 
bold, void *data)
 
 static int display_find_keystroke(int fd, void *data);
 
+struct find_data {
+       size_t len;
+       char *string;
+       regex_t *reg;
+};
+
+struct find_data *display_find_form_init(void)
+{
+       const char *regexp = "^[a-z|0-9|_|-|.]";
+       struct find_data *findd;
+       const size_t len = 64;
+       regex_t *reg;
+       char *search4;
+       int maxx, maxy;
+
+       getmaxyx(stdscr, maxy, maxx);
+
+       reg = malloc(sizeof(*reg));
+       if (!reg)
+               return NULL;
+
+       if (regcomp(reg, regexp, REG_ICASE))
+               goto out_free_reg;
+
+       search4 = malloc(len);
+       if (!search4)
+               goto out_free_regcomp;
+       memset(search4, '\0', len);
+
+       findd = malloc(sizeof(*findd));
+       if (!findd)
+               goto out_free_search4;
+
+       findd->string = search4;
+       findd->reg = reg;
+       findd->len = len;
+out:
+       return findd;
+
+out_free_search4:
+       free(search4);
+out_free_regcomp:
+       regfree(reg);
+out_free_reg:
+       free(reg);
+
+       goto out;
+}
+
+static void display_find_form_fini(struct find_data *fd)
+{
+       regfree(fd->reg);
+       free(fd->string);
+       free(fd);
+       curs_set(0);
+}
+
 static int display_switch_to_find(int fd)
 {
+       struct find_data *findd;
+
+       findd = display_find_form_init();
+       if (!findd)
+               return -1;
+
        if (mainloop_del(fd))
                return -1;
 
-       if (mainloop_add(fd, display_find_keystroke, NULL))
+       if (mainloop_add(fd, display_find_keystroke, findd))
+               return -1;
+
+       if (display_show_footer(current_win, "find (esc to exit)?"))
                return -1;
 
        return 0;
@@ -342,24 +409,62 @@ static int display_switch_to_main(int fd)
        if (mainloop_add(fd, display_keystroke, NULL))
                return -1;
 
-       display_refresh(current_win);
+       if (display_show_header(current_win))
+               return -1;
 
-       return 0;
-}
+       if (display_show_footer(current_win, NULL))
+               return -1;
 
+       return display_refresh(current_win);
+}
 
 static int display_find_keystroke(int fd, void *data)
 {
+       struct find_data *findd = 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];
+
        switch (keystroke) {
 
        case '\e':
+               display_find_form_fini(findd);
                return display_switch_to_main(fd);
+
+       case KEY_BACKSPACE:
+               if (strlen(string))
+                       string[strlen(string) - 1] = '\0';
+               break;
+
+       case KEY_ENTER:
+               /* next patch */
+               break;
+
        default:
+
+               /* We don't want invalid characters for a name */
+               if (regexec(reg, match, 1, m, 0))
+                       return 0;
+
+               if (strlen(string) < findd->len - 1)
+                       string[strlen(string)] = (char)keystroke;
+
                break;
        }
 
+       if (display_show_header(current_win))
+               return -1;
+
+       if (display_refresh(current_win))
+               return -1;
+
+       if (display_show_footer(current_win, strlen(string) ? string :
+                               "find (esc to exit)?"))
+               return -1;
+
        return 0;
 }
 
@@ -423,7 +528,7 @@ int display_init(int wdefault)
        if (display_show_header(wdefault))
                return -1;
 
-       if (display_show_footer(wdefault))
+       if (display_show_footer(wdefault, NULL))
                return -1;
 
        return display_refresh(wdefault);
-- 
1.7.1


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

Reply via email to