i(broken) removing further code - iomenu - interactive terminal-based selection menu Err bitreich.org 70 hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70 1Log /scm/iomenu/log.gph bitreich.org 70 1Files /scm/iomenu/files.gph bitreich.org 70 1Refs /scm/iomenu/refs.gph bitreich.org 70 1Tags /scm/iomenu/tag bitreich.org 70 1README /scm/iomenu/file/README.gph bitreich.org 70 1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 6a1d1b6950adc20996a8bf22441762e08f1dabb8 /scm/iomenu/commit/6a1d1b6950adc20996a8bf22441762e08f1dabb8.gph bitreich.org 70 1parent 0a259537342b214215afbeb7625ba86142ba7e8f /scm/iomenu/commit/0a259537342b214215afbeb7625ba86142ba7e8f.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Mon, 13 Mar 2017 23:22:53 +0100 Err bitreich.org 70 i Err bitreich.org 70 i(broken) removing further code Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M buffer.c | 66 ++++++++++++++++---------------- Err bitreich.org 70 i M draw.c | 46 ++++++++++++++++---------------- Err bitreich.org 70 i M input.c | 109 +++++++++++++++---------------- Err bitreich.org 70 i M iomenu.c | 43 +++++++++++-------------------- Err bitreich.org 70 i M iomenu.h | 52 +++++++++++++++---------------- Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 149 insertions(+), 167 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/buffer.c b/buffer.c /scm/iomenu/file/buffer.c.gph bitreich.org 70 i@@ -10,7 +10,7 @@ Err bitreich.org 70 i * Fill the buffer apropriately with the lines Err bitreich.org 70 i */ Err bitreich.org 70 i Buffer * Err bitreich.org 70 i-fill_buffer(char *separator) Err bitreich.org 70 i+fill_buffer(void) Err bitreich.org 70 i { Err bitreich.org 70 i /* fill buffer with string */ Err bitreich.org 70 i char s[LINE_SIZE]; Err bitreich.org 70 i@@ -21,48 +21,48 @@ fill_buffer(char *separator) Err bitreich.org 70 i if (!fp) Err bitreich.org 70 i die("Can not open file for reading."); Err bitreich.org 70 i Err bitreich.org 70 i- buffer->input[0] = '\0'; Err bitreich.org 70 i- buffer->total = buffer->matching = 1; Err bitreich.org 70 i+ input[0] = '\0'; Err bitreich.org 70 i+ total = matching = 1; Err bitreich.org 70 i Err bitreich.org 70 i /* empty line in case no line come from stdin */ Err bitreich.org 70 i- buffer->first = buffer->current = malloc(sizeof(Line)); Err bitreich.org 70 i- buffer->first->next = buffer->first->prev = NULL; Err bitreich.org 70 i- buffer->last = NULL; Err bitreich.org 70 i+ first = buffer[current] = malloc(sizeof(Line)); Err bitreich.org 70 i+ first->next = first->prev = NULL; Err bitreich.org 70 i+ last = NULL; Err bitreich.org 70 i Err bitreich.org 70 i /* read the file into a doubly linked list of lines */ Err bitreich.org 70 i- for (l = 1; fgets(s, LINE_SIZE, fp); buffer->total++, l++) Err bitreich.org 70 i- buffer->last = add_line(buffer, l, s, separator, buffer->last); Err bitreich.org 70 i+ for (l = 1; fgets(s, LINE_SIZE, fp); total++, l++) Err bitreich.org 70 i+ last = add_line(l, s, last); Err bitreich.org 70 i Err bitreich.org 70 i return buffer; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Add a line to the end of the current buffer. Err bitreich.org 70 i+ * Add a line to the end of the buffer[current] buffer. Err bitreich.org 70 i */ Err bitreich.org 70 i Line * Err bitreich.org 70 i-add_line(Buffer *buffer, int number, char *s, char *separator, Line *prev) Err bitreich.org 70 i+add_line( int number, Line *prev) Err bitreich.org 70 i { Err bitreich.org 70 i /* allocate new line */ Err bitreich.org 70 i- buffer->last = new_line(s, separator); Err bitreich.org 70 i- buffer->last->number = number; Err bitreich.org 70 i- buffer->last->matches = 1; /* matches by default */ Err bitreich.org 70 i- buffer->matching++; Err bitreich.org 70 i+ last = new_line(s); Err bitreich.org 70 i+ last->number = number; Err bitreich.org 70 i+ last->matches = 1; /* matches by default */ Err bitreich.org 70 i+ matching++; Err bitreich.org 70 i Err bitreich.org 70 i /* interlink with previous line if exists */ Err bitreich.org 70 i if (prev) { Err bitreich.org 70 i- prev->next = buffer->last; Err bitreich.org 70 i- buffer->last->prev = prev; Err bitreich.org 70 i+ prev->next = last; Err bitreich.org 70 i+ last->prev = prev; Err bitreich.org 70 i } else { Err bitreich.org 70 i- buffer->first = buffer->last; Err bitreich.org 70 i+ first = last; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- return buffer->last; Err bitreich.org 70 i+ return last; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i Line * Err bitreich.org 70 i-new_line(char *s, char *separator) Err bitreich.org 70 i+new_line(char *s) Err bitreich.org 70 i { Err bitreich.org 70 i Line *line = malloc(sizeof(Line)); Err bitreich.org 70 i Err bitreich.org 70 i@@ -77,19 +77,19 @@ new_line(char *s, char *separator) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Free the buffer, also recursing the doubly linked list. Err bitreich.org 70 i+ * Free the also recursing the doubly linked list. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i free_buffer(Buffer *buffer) Err bitreich.org 70 i { Err bitreich.org 70 i Line *next = NULL; Err bitreich.org 70 i Err bitreich.org 70 i- while (buffer->first) { Err bitreich.org 70 i- next = buffer->first->next; Err bitreich.org 70 i+ while (first) { Err bitreich.org 70 i+ next = first->next; Err bitreich.org 70 i Err bitreich.org 70 i- free(buffer->first); Err bitreich.org 70 i+ free(first); Err bitreich.org 70 i Err bitreich.org 70 i- buffer->first = next; Err bitreich.org 70 i+ first = next; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i free(buffer); Err bitreich.org 70 i@@ -98,21 +98,21 @@ free_buffer(Buffer *buffer) Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i * Set the line->matching state according to the return value of match_line, Err bitreich.org 70 i- * and buffer->matching to number of matching candidates. Err bitreich.org 70 i+ * and matching to number of matching candidates. Err bitreich.org 70 i * Err bitreich.org 70 i * The incremental parameter sets whether check already matching or Err bitreich.org 70 i * non-matching lines only. This is for performance concerns. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-filter_lines(Buffer *buffer, int inc) Err bitreich.org 70 i+filter_lines( int inc) Err bitreich.org 70 i { Err bitreich.org 70 i- Line *line = buffer->first; Err bitreich.org 70 i+ Line *line = first; Err bitreich.org 70 i char **tokv = NULL; Err bitreich.org 70 i- char *s, buf[sizeof buffer->input]; Err bitreich.org 70 i+ char *s, buf[sizeof input]; Err bitreich.org 70 i size_t n = 0, tokc = 0; Err bitreich.org 70 i Err bitreich.org 70 i /* tokenize input from space characters, this comes from dmenu */ Err bitreich.org 70 i- strcpy(buf, buffer->input); Err bitreich.org 70 i+ strcpy(buf, input); Err bitreich.org 70 i for (s = strtok(buf, " "); s; s = strtok(NULL, " ")) { Err bitreich.org 70 i if (++tokc > n && !(tokv = realloc(tokv, ++n * sizeof(*tokv)))) Err bitreich.org 70 i die("cannot realloc memory for tokv\n"); Err bitreich.org 70 i@@ -121,14 +121,14 @@ filter_lines(Buffer *buffer, int inc) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* match lines */ Err bitreich.org 70 i- buffer->matching = 0; Err bitreich.org 70 i+ matching = 0; Err bitreich.org 70 i while (line) { Err bitreich.org 70 i- if (buffer->input[0] && !strcmp(buffer->input, line->content)) { Err bitreich.org 70 i+ if (input[0] && !strcmp(input, line->content)) { Err bitreich.org 70 i line->matches = 1; Err bitreich.org 70 i- buffer->current = line; Err bitreich.org 70 i+ buffer[current] = line; Err bitreich.org 70 i } else if ((inc && line->matches) || (!inc && !line->matches)) { Err bitreich.org 70 i line->matches = match_line(line, tokv, tokc); Err bitreich.org 70 i- buffer->matching += line->matches; Err bitreich.org 70 i+ matching += line->matches; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i line = line->next; Err bitreich.org 70 1diff --git a/draw.c b/draw.c /scm/iomenu/file/draw.c.gph bitreich.org 70 i@@ -10,21 +10,21 @@ Err bitreich.org 70 i * Print a line to stderr. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-draw_line(Line *line, int current, const int cols, Opt *opt) Err bitreich.org 70 i+draw_line(Line *line, const int cols) Err bitreich.org 70 i { Err bitreich.org 70 i- char output[LINE_SIZE * sizeof(char)] = "\033[K"; Err bitreich.org 70 i+ char output[LINE_SIZE] = "\033[K"; Err bitreich.org 70 i int n = 0; Err bitreich.org 70 i Err bitreich.org 70 i- if (opt->line_numbers) { Err bitreich.org 70 i- strcat(output, current ? "\033[1;37m" : "\033[1;30m"); Err bitreich.org 70 i+ if (opt_line_numbers) { Err bitreich.org 70 i+ strcat(output, buffer[current] ? "\033[1;37m" : "\033[1;30m"); Err bitreich.org 70 i sprintf(output + strlen(output), "%7d\033[m ", line->number); Err bitreich.org 70 i } else { Err bitreich.org 70 i- strcat(output, current ? "\033[1;31m > " : " "); Err bitreich.org 70 i+ strcat(output, buffer[current] ? "\033[1;31m > " : " "); Err bitreich.org 70 i } Err bitreich.org 70 i n += 8; Err bitreich.org 70 i Err bitreich.org 70 i- /* highlight current line */ Err bitreich.org 70 i- if (current) Err bitreich.org 70 i+ /* highlight buffer[current] line */ Err bitreich.org 70 i+ if (buffer[current]) Err bitreich.org 70 i strcat(output, "\033[1;33m"); Err bitreich.org 70 i Err bitreich.org 70 i /* content */ Err bitreich.org 70 i@@ -48,23 +48,23 @@ draw_line(Line *line, int current, const int cols, Opt *opt) Err bitreich.org 70 i * The total number oflines printed shall not excess 'count'. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-draw_lines(Buffer *buffer, int count, int cols, Opt *opt) Err bitreich.org 70 i+draw_lines( int count, int cols) Err bitreich.org 70 i { Err bitreich.org 70 i- Line *line = buffer->current; Err bitreich.org 70 i+ Line *line = buffer[current]; Err bitreich.org 70 i int i = 0; Err bitreich.org 70 i int j = 0; Err bitreich.org 70 i Err bitreich.org 70 i- /* seek back from current line to the first line to print */ Err bitreich.org 70 i+ /* seek back from buffer[current] line to the first line to print */ Err bitreich.org 70 i while (line && i < count - OFFSET) { Err bitreich.org 70 i i = line->matches ? i + 1 : i; Err bitreich.org 70 i line = line->prev; Err bitreich.org 70 i } Err bitreich.org 70 i- line = line ? line : buffer->first; Err bitreich.org 70 i+ line = line ? line : first; Err bitreich.org 70 i Err bitreich.org 70 i /* print up to count lines that match the input */ Err bitreich.org 70 i while (line && j < count) { Err bitreich.org 70 i if (line->matches) { Err bitreich.org 70 i- draw_line(line, line == buffer->current, cols, opt); Err bitreich.org 70 i+ draw_line(line, line == buffer[current], cols); Err bitreich.org 70 i j++; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -83,7 +83,7 @@ draw_lines(Buffer *buffer, int count, int cols, Opt *opt) Err bitreich.org 70 i * This also has to clear the previous lines. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-draw_screen(Buffer *buffer, int tty_fd, Opt *opt) Err bitreich.org 70 i+draw_screen( int tty_fd) Err bitreich.org 70 i { Err bitreich.org 70 i struct winsize w; Err bitreich.org 70 i int count; Err bitreich.org 70 i@@ -91,14 +91,14 @@ draw_screen(Buffer *buffer, int tty_fd, Opt *opt) Err bitreich.org 70 i if (ioctl(tty_fd, TIOCGWINSZ, &w) < 0) Err bitreich.org 70 i die("could not get terminal size"); Err bitreich.org 70 i Err bitreich.org 70 i- count = MIN(opt->lines, w.ws_row - 2); Err bitreich.org 70 i+ count = MIN(opt_lines, w.ws_row - 2); Err bitreich.org 70 i Err bitreich.org 70 i fputs("\n", stderr); Err bitreich.org 70 i- draw_lines(buffer, count, w.ws_col, opt); Err bitreich.org 70 i+ draw_lines(count, w.ws_col); Err bitreich.org 70 i Err bitreich.org 70 i /* go up to the prompt position and update it */ Err bitreich.org 70 i fprintf(stderr, "\033[%dA", count + 1); Err bitreich.org 70 i- draw_prompt(buffer, w.ws_col, opt); Err bitreich.org 70 i+ draw_prompt(w.ws_col); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -118,11 +118,11 @@ draw_clear(int lines) Err bitreich.org 70 i * match. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-draw_prompt(Buffer *buffer, int cols, Opt *opt) Err bitreich.org 70 i+draw_prompt(int cols) Err bitreich.org 70 i { Err bitreich.org 70 i size_t i; Err bitreich.org 70 i- int matching = buffer->matching; Err bitreich.org 70 i- int total = buffer->total; Err bitreich.org 70 i+ int matching = matching; Err bitreich.org 70 i+ int total = total; Err bitreich.org 70 i Err bitreich.org 70 i /* for the '/' separator between the numbers */ Err bitreich.org 70 i cols--; Err bitreich.org 70 i@@ -133,12 +133,12 @@ draw_prompt(Buffer *buffer, int cols, Opt *opt) Err bitreich.org 70 i cols -= !matching ? 1 : 0; /* 0 also has one digit*/ Err bitreich.org 70 i Err bitreich.org 70 i /* actual prompt */ Err bitreich.org 70 i- fprintf(stderr, "\r%-6s\033[K\033[1m>\033[m ", opt->prompt); Err bitreich.org 70 i- cols -= 2 + MAX(strlen(opt->prompt), 6); Err bitreich.org 70 i+ fprintf(stderr, "\r%-6s\033[K\033[1m>\033[m ", opt_prompt); Err bitreich.org 70 i+ cols -= 2 + MAX(strlen(opt_prompt), 6); Err bitreich.org 70 i Err bitreich.org 70 i /* input without overflowing terminal width */ Err bitreich.org 70 i- for (i = 0; i < strlen(buffer->input) && cols > 0; cols--, i++) Err bitreich.org 70 i- fputc(buffer->input[i], stderr); Err bitreich.org 70 i+ for (i = 0; i < strlen(input) && cols > 0; cols--, i++) Err bitreich.org 70 i+ fputc(input[i], stderr); Err bitreich.org 70 i Err bitreich.org 70 i /* save the cursor position at the end of the input */ Err bitreich.org 70 i fputs("\033[s", stderr); Err bitreich.org 70 1diff --git a/input.c b/input.c /scm/iomenu/file/input.c.gph bitreich.org 70 i@@ -11,7 +11,7 @@ Err bitreich.org 70 i * Listen for the user input and call the appropriate functions. Err bitreich.org 70 i */ Err bitreich.org 70 i int Err bitreich.org 70 i-input_get(Buffer *buffer, int tty_fd, Opt *opt) Err bitreich.org 70 i+input_get(int tty_fd) Err bitreich.org 70 i { Err bitreich.org 70 i FILE *tty_fp = fopen("/dev/tty", "r"); Err bitreich.org 70 i int exit_code; Err bitreich.org 70 i@@ -20,8 +20,8 @@ input_get(Buffer *buffer, int tty_fd, Opt *opt) Err bitreich.org 70 i struct termios termio_old = set_terminal(tty_fd); Err bitreich.org 70 i Err bitreich.org 70 i /* get input char by char from the keyboard. */ Err bitreich.org 70 i- while ((exit_code = input_key(tty_fp, buffer, opt)) == CONTINUE) Err bitreich.org 70 i- draw_screen(buffer, tty_fd, opt); Err bitreich.org 70 i+ while ((exit_code = input_key(tty_fp)) == CONTINUE) Err bitreich.org 70 i+ draw_screen(tty_fd); Err bitreich.org 70 i Err bitreich.org 70 i /* resets the terminal to the previous state. */ Err bitreich.org 70 i tcsetattr(tty_fd, TCSANOW, &termio_old); Err bitreich.org 70 i@@ -36,61 +36,62 @@ input_get(Buffer *buffer, int tty_fd, Opt *opt) Err bitreich.org 70 i * Perform action associated with key Err bitreich.org 70 i */ Err bitreich.org 70 i int Err bitreich.org 70 i-input_key(FILE *tty_fp, Buffer *buffer, Opt *opt) Err bitreich.org 70 i+input_key(FILE *tty_fp) Err bitreich.org 70 i { Err bitreich.org 70 i char key = fgetc(tty_fp); Err bitreich.org 70 i Err bitreich.org 70 i- if (key == opt->validate_key) { Err bitreich.org 70 i- action_print_selection(buffer, 0, opt); Err bitreich.org 70 i+ if (key == '\n') { Err bitreich.org 70 i+ action_print_selection(0); Err bitreich.org 70 i return EXIT_SUCCESS; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i switch (key) { Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('C'): Err bitreich.org 70 i- draw_clear(opt->lines); Err bitreich.org 70 i+ draw_clear(opt_lines); Err bitreich.org 70 i return EXIT_FAILURE; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('U'): Err bitreich.org 70 i- buffer->input[0] = '\0'; Err bitreich.org 70 i- buffer->current = buffer->first; Err bitreich.org 70 i- filter_lines(buffer, 0); Err bitreich.org 70 i- action_jump(buffer, 1); Err bitreich.org 70 i- action_jump(buffer, -1); Err bitreich.org 70 i+ input[0] = '\0'; Err bitreich.org 70 i+ buffer[current] = first; Err bitreich.org 70 i+ filter_lines(0); Err bitreich.org 70 i+ action_jump(1); Err bitreich.org 70 i+ action_jump(-1); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('W'): Err bitreich.org 70 i action_remove_word_input(buffer); Err bitreich.org 70 i- filter_lines(buffer, 0); Err bitreich.org 70 i+ filter_lines(0); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case 127: Err bitreich.org 70 i case CONTROL('H'): /* backspace */ Err bitreich.org 70 i- buffer->input[strlen(buffer->input) - 1] = '\0'; Err bitreich.org 70 i- filter_lines(buffer, 0); Err bitreich.org 70 i- action_jump(buffer, 0); Err bitreich.org 70 i+ input[strlen(input) - 1] = '\0'; Err bitreich.org 70 i+ filter_lines(0); Err bitreich.org 70 i+ action_jump(0); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('N'): Err bitreich.org 70 i- action_jump(buffer, 1); Err bitreich.org 70 i+ action_jump(1); Err bitreich.org 70 i+ extern char *input; Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('P'): Err bitreich.org 70 i- action_jump(buffer, -1); Err bitreich.org 70 i+ action_jump(-1); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('I'): /* tab */ Err bitreich.org 70 i- strcpy(buffer->input, buffer->current->content); Err bitreich.org 70 i- filter_lines(buffer, 1); Err bitreich.org 70 i+ strcpy(input, buffer[current]->content); Err bitreich.org 70 i+ filter_lines(1); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('J'): Err bitreich.org 70 i case CONTROL('M'): /* enter */ Err bitreich.org 70 i- action_print_selection(buffer, 0, opt); Err bitreich.org 70 i+ action_print_selection(0); Err bitreich.org 70 i return EXIT_SUCCESS; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('@'): /* ctrl + space */ Err bitreich.org 70 i- action_print_selection(buffer, 1, opt); Err bitreich.org 70 i+ action_print_selection(1); Err bitreich.org 70 i return EXIT_SUCCESS; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('['): /* escape */ Err bitreich.org 70 i@@ -100,11 +101,11 @@ input_key(FILE *tty_fp, Buffer *buffer, Opt *opt) Err bitreich.org 70 i switch (fgetc(tty_fp)) { Err bitreich.org 70 i Err bitreich.org 70 i case 'A': /* up */ Err bitreich.org 70 i- action_jump(buffer, -1); Err bitreich.org 70 i+ action_jump(-1); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case 'B': /* Down */ Err bitreich.org 70 i- action_jump(buffer, 1); Err bitreich.org 70 i+ action_jump(1); Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -117,11 +118,11 @@ input_key(FILE *tty_fp, Buffer *buffer, Opt *opt) Err bitreich.org 70 i switch (key) { Err bitreich.org 70 i Err bitreich.org 70 i case '5': /* page up */ Err bitreich.org 70 i- action_jump(buffer, -10); Err bitreich.org 70 i+ action_jump(-10); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case '6': /* page down */ Err bitreich.org 70 i- action_jump(buffer, 10); Err bitreich.org 70 i+ action_jump(10); Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -131,7 +132,7 @@ input_key(FILE *tty_fp, Buffer *buffer, Opt *opt) Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i default: Err bitreich.org 70 i- action_add_character(buffer, key); Err bitreich.org 70 i+ action_add_character(key); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i return CONTINUE; Err bitreich.org 70 i@@ -139,17 +140,17 @@ input_key(FILE *tty_fp, Buffer *buffer, Opt *opt) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Set the current line to next/previous/any matching line. Err bitreich.org 70 i+ * Set the buffer[current] line to next/previous/any matching line. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-action_jump(Buffer *buffer, int direction) Err bitreich.org 70 i+action_jump(int direction) Err bitreich.org 70 i { Err bitreich.org 70 i- Line * line = buffer->current; Err bitreich.org 70 i+ Line * line = buffer[current]; Err bitreich.org 70 i Line * result = line; Err bitreich.org 70 i Err bitreich.org 70 i- if (direction == 0 && !buffer->current->matches) { Err bitreich.org 70 i- line = matching_next(buffer->current); Err bitreich.org 70 i- line = line ? line : matching_prev(buffer->current); Err bitreich.org 70 i+ if (direction == 0 && !buffer[current]->matches) { Err bitreich.org 70 i+ line = matching_next(buffer[current]); Err bitreich.org 70 i+ line = line ? line : matching_prev(buffer[current]); Err bitreich.org 70 i result = line ? line : result; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -163,7 +164,7 @@ action_jump(Buffer *buffer, int direction) Err bitreich.org 70 i result = line ? line : result; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- buffer->current = result; Err bitreich.org 70 i+ buffer[current] = result; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -171,17 +172,17 @@ action_jump(Buffer *buffer, int direction) Err bitreich.org 70 i * Remove the last word from the buffer's input Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-action_remove_word_input(Buffer *buffer) Err bitreich.org 70 i+action_remove_word_input() Err bitreich.org 70 i { Err bitreich.org 70 i- size_t length = strlen(buffer->input) - 1; Err bitreich.org 70 i+ size_t length = strlen(input) - 1; Err bitreich.org 70 i int i; Err bitreich.org 70 i Err bitreich.org 70 i- for (i = length; i >= 0 && isspace(buffer->input[i]); i--) Err bitreich.org 70 i- buffer->input[i] = '\0'; Err bitreich.org 70 i+ for (i = length; i >= 0 && isspace(input[i]); i--) Err bitreich.org 70 i+ input[i] = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i- length = strlen(buffer->input) - 1; Err bitreich.org 70 i- for (i = length; i >= 0 && !isspace(buffer->input[i]); i--) Err bitreich.org 70 i- buffer->input[i] = '\0'; Err bitreich.org 70 i+ length = strlen(input) - 1; Err bitreich.org 70 i+ for (i = length; i >= 0 && !isspace(input[i]); i--) Err bitreich.org 70 i+ input[i] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -189,18 +190,18 @@ action_remove_word_input(Buffer *buffer) Err bitreich.org 70 i * Add a character to the buffer input and filter lines again. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-action_add_character(Buffer *buffer, char key) Err bitreich.org 70 i+action_add_character(char key) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t length = strlen(buffer->input); Err bitreich.org 70 i+ size_t length = strlen(input); Err bitreich.org 70 i Err bitreich.org 70 i if (isprint(key)) { Err bitreich.org 70 i- buffer->input[length] = key; Err bitreich.org 70 i- buffer->input[length + 1] = '\0'; Err bitreich.org 70 i+ input[length] = key; Err bitreich.org 70 i+ input[length + 1] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- filter_lines(buffer, 1); Err bitreich.org 70 i+ filter_lines(1); Err bitreich.org 70 i Err bitreich.org 70 i- action_jump(buffer, 0); Err bitreich.org 70 i+ action_jump(0); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -208,20 +209,16 @@ action_add_character(Buffer *buffer, char key) Err bitreich.org 70 i * Send the selection to stdout. Err bitreich.org 70 i */ Err bitreich.org 70 i void Err bitreich.org 70 i-action_print_selection(Buffer *buffer, int return_input, Opt *opt) Err bitreich.org 70 i+action_print_selection(int return_input) Err bitreich.org 70 i { Err bitreich.org 70 i Line *line = NULL; Err bitreich.org 70 i Err bitreich.org 70 i fputs("\r\033[K", stderr); Err bitreich.org 70 i Err bitreich.org 70 i- if (opt->print_number) { Err bitreich.org 70 i- if (buffer->matching > 0) Err bitreich.org 70 i- printf("%d\n", buffer->current->number); Err bitreich.org 70 i+ if (return_input || !matching) { Err bitreich.org 70 i+ puts(input); Err bitreich.org 70 i Err bitreich.org 70 i- } else if (return_input || !buffer->matching) { Err bitreich.org 70 i- puts(buffer->input); Err bitreich.org 70 i- Err bitreich.org 70 i- } else if (buffer->matching > 0) { Err bitreich.org 70 i- puts(buffer->current->content); Err bitreich.org 70 i+ } else if (matching > 0) { Err bitreich.org 70 i+ puts(buffer[current]->content); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -1,3 +1,8 @@ Err bitreich.org 70 i+opt_line_numbers = 0; Err bitreich.org 70 i+opt_print_number = 0; Err bitreich.org 70 i+opt_lines = 30; Err bitreich.org 70 i+opt_prompt = ""; Err bitreich.org 70 i+ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -43,7 +48,7 @@ set_terminal(int tty_fd) Err bitreich.org 70 i termio_new = termio_old; Err bitreich.org 70 i termio_new.c_lflag &= ~(ICANON | ECHO | IGNBRK); Err bitreich.org 70 i Err bitreich.org 70 i- /* apply this state to current terminal now (TCSANOW) */ Err bitreich.org 70 i+ /* apply this state to buffer[current] terminal now (TCSANOW) */ Err bitreich.org 70 i tcsetattr(tty_fd, TCSANOW, &termio_new); Err bitreich.org 70 i Err bitreich.org 70 i return termio_old; Err bitreich.org 70 i@@ -53,8 +58,7 @@ set_terminal(int tty_fd) Err bitreich.org 70 i void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fputs("usage: iomenu [-n] [-N] [-k key] [-s separator] ", stderr); Err bitreich.org 70 i- fputs("[-p prompt] [-l lines]\n", stderr); Err bitreich.org 70 i+ fputs("usage: iomenu [-n] [-p prompt] [-l lines]\n", stderr); Err bitreich.org 70 i Err bitreich.org 70 i exit(EXIT_FAILURE); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -67,12 +71,6 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Buffer *buffer = NULL; Err bitreich.org 70 i Opt *opt = malloc(sizeof(Opt)); Err bitreich.org 70 i Err bitreich.org 70 i- opt->line_numbers = 0; Err bitreich.org 70 i- opt->print_number = 0; Err bitreich.org 70 i- opt->validate_key = CONTROL('M'); Err bitreich.org 70 i- opt->separator = NULL; Err bitreich.org 70 i- opt->lines = 30; Err bitreich.org 70 i- opt->prompt = ""; Err bitreich.org 70 i Err bitreich.org 70 i /* command line arguments */ Err bitreich.org 70 i for (i = 1; i < argc; i++) { Err bitreich.org 70 i@@ -81,27 +79,16 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i switch (argv[i][1]) { Err bitreich.org 70 i case 'n': Err bitreich.org 70 i- opt->line_numbers = 1; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'N': Err bitreich.org 70 i- opt->print_number = 1; Err bitreich.org 70 i- opt->line_numbers = 1; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'k': Err bitreich.org 70 i- opt->validate_key = (argv[++i][0] == '^') ? Err bitreich.org 70 i- CONTROL(toupper(argv[i][1])): argv[i][0]; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 's': Err bitreich.org 70 i- opt->separator = argv[++i]; Err bitreich.org 70 i+ opt_line_numbers = 1; Err bitreich.org 70 i break; Err bitreich.org 70 i case 'l': Err bitreich.org 70 i- if (sscanf(argv[++i], "%d", &opt->lines) <= 0) Err bitreich.org 70 i+ if (sscanf(argv[++i], "%d", &opt_lines) <= 0) Err bitreich.org 70 i die("wrong number format after -l"); Err bitreich.org 70 i break; Err bitreich.org 70 i case 'p': Err bitreich.org 70 i if (++i >= argc) Err bitreich.org 70 i- die("wrong string format after -p"); Err bitreich.org 70 i- opt->prompt = argv[i]; Err bitreich.org 70 i+ die("missing string after -p"); Err bitreich.org 70 i+ opt_prompt = argv[i]; Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i@@ -109,15 +96,15 @@ main(int argc, char *argv[]) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* command line arguments */ Err bitreich.org 70 i- buffer = fill_buffer(opt->separator); Err bitreich.org 70 i+ buffer = fill_buffer(); Err bitreich.org 70 i Err bitreich.org 70 i /* set the interface */ Err bitreich.org 70 i- draw_screen(buffer, tty_fd, opt); Err bitreich.org 70 i+ draw_screen(tty_fd); Err bitreich.org 70 i Err bitreich.org 70 i /* listen and interact to input */ Err bitreich.org 70 i- exit_code = input_get(buffer, tty_fd, opt); Err bitreich.org 70 i+ exit_code = input_get(tty_fd); Err bitreich.org 70 i Err bitreich.org 70 i- draw_clear(opt->lines); Err bitreich.org 70 i+ draw_clear(opt_lines); Err bitreich.org 70 i Err bitreich.org 70 i /* close files descriptors and pointers, and free memory */ Err bitreich.org 70 i close(tty_fd); Err bitreich.org 70 1diff --git a/iomenu.h b/iomenu.h /scm/iomenu/file/iomenu.h.gph bitreich.org 70 i@@ -8,19 +8,6 @@ Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Options from the command line, to pass to each function that need some Err bitreich.org 70 i- */ Err bitreich.org 70 i-typedef struct Opt { Err bitreich.org 70 i- int line_numbers; Err bitreich.org 70 i- int print_number; Err bitreich.org 70 i- char validate_key; Err bitreich.org 70 i- char *separator; Err bitreich.org 70 i- int lines; Err bitreich.org 70 i- char *prompt; Err bitreich.org 70 i-} Opt; Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i * Line coming from stdin Err bitreich.org 70 i */ Err bitreich.org 70 i typedef struct Line { Err bitreich.org 70 i@@ -29,6 +16,17 @@ typedef struct Line { Err bitreich.org 70 i } Line; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i+/* buffer */ Err bitreich.org 70 i+Line *buffer[]; Err bitreich.org 70 i+int current, matching, total; Err bitreich.org 70 i+Line *first, *last; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* flags */ Err bitreich.org 70 i+int opt_line_numbers; Err bitreich.org 70 i+int opt_lines; Err bitreich.org 70 i+char *opt_prompt, *input; Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i /* iomenu */ Err bitreich.org 70 i Err bitreich.org 70 i void die(const char *); Err bitreich.org 70 i@@ -38,30 +36,30 @@ void usage(void); Err bitreich.org 70 i Err bitreich.org 70 i /* buffer */ Err bitreich.org 70 i Err bitreich.org 70 i-Buffer * fill_buffer(char *); Err bitreich.org 70 i-void free_buffer(Buffer *); Err bitreich.org 70 i-Line * add_line(Buffer *, int, char *, char *, Line *); Err bitreich.org 70 i+Line ** fill_buffer(char *); Err bitreich.org 70 i+void free_buffer(); Err bitreich.org 70 i+Line * add_line(int, char *, char *, Line *); Err bitreich.org 70 i Line * new_line(char *, char *); Err bitreich.org 70 i Line * matching_next(Line *); Err bitreich.org 70 i Line * matching_prev(Line *); Err bitreich.org 70 i int match_line(Line *, char **, size_t); Err bitreich.org 70 i-void filter_lines(Buffer *, int); Err bitreich.org 70 i+void filter_lines(int); Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* draw */ Err bitreich.org 70 i Err bitreich.org 70 i-void draw_screen(Buffer *, int, Opt *); Err bitreich.org 70 i+void draw_screen(int); Err bitreich.org 70 i void draw_clear(int); Err bitreich.org 70 i-void draw_line(Line *, int, int, Opt *); Err bitreich.org 70 i-void draw_lines(Buffer *, int, int, Opt *); Err bitreich.org 70 i-void draw_prompt(Buffer *, int, Opt *); Err bitreich.org 70 i+void draw_line(Line *, int); Err bitreich.org 70 i+void draw_lines(int, int); Err bitreich.org 70 i+void draw_prompt(int); Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* input */ Err bitreich.org 70 i Err bitreich.org 70 i-int input_get(Buffer *, int, Opt *); Err bitreich.org 70 i-int input_key(FILE *, Buffer *, Opt *); Err bitreich.org 70 i-void action_jump(Buffer *, int); Err bitreich.org 70 i-void action_print_selection(Buffer *,int, Opt *); Err bitreich.org 70 i-void action_remove_word_input(Buffer *); Err bitreich.org 70 i-void action_add_character(Buffer *, char); Err bitreich.org 70 i+int input_get(int); Err bitreich.org 70 i+int input_key(FILE *); Err bitreich.org 70 i+void action_jump(int); Err bitreich.org 70 i+void action_print_selection(int); Err bitreich.org 70 i+void action_remove_word_input(); Err bitreich.org 70 i+void action_add_character(char); Err bitreich.org 70 .