i(broken) removing a lot of 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 0a259537342b214215afbeb7625ba86142ba7e8f /scm/iomenu/commit/0a259537342b214215afbeb7625ba86142ba7e8f.gph bitreich.org 70 1parent b327379ab041e7fbd37f3246b1affe7014109135 /scm/iomenu/commit/b327379ab041e7fbd37f3246b1affe7014109135.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Mon, 13 Mar 2017 22:10:01 +0100 Err bitreich.org 70 i Err bitreich.org 70 i(broken) removing a lot of code Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 8 +------- Err bitreich.org 70 i M buffer.c | 52 +++++-------------------------- Err bitreich.org 70 i M draw.c | 38 ++++++++----------------------- Err bitreich.org 70 i M input.c | 12 +----------- Err bitreich.org 70 i M iomenu.1 | 5 +++-- Err bitreich.org 70 i A iomenu.c | 128 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A iomenu.h | 67 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i D main.c | 91 ------------------------------- Err bitreich.org 70 i D main.h | 95 ------------------------------ Err bitreich.org 70 i D nohup.out | 92 ------------------------------- Err bitreich.org 70 i D util.c | 73 ------------------------------- Err bitreich.org 70 i Err bitreich.org 70 i11 files changed, 218 insertions(+), 443 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/iomenu/file/Makefile.gph bitreich.org 70 i@@ -1,17 +1,11 @@ Err bitreich.org 70 i CFLAGS = -std=c89 -pedantic -Wall -Wextra -g -static Err bitreich.org 70 i-SRC = main.c buffer.c util.c draw.c input.c Err bitreich.org 70 i OBJ = ${SRC:.c=.o} Err bitreich.org 70 i Err bitreich.org 70 i MANPREFIX = $(PREFIX) Err bitreich.org 70 i Err bitreich.org 70 i all: clean iomenu Err bitreich.org 70 i Err bitreich.org 70 i-.c.o: Err bitreich.org 70 i- ${CC} -c ${CFLAGS} $< Err bitreich.org 70 i- Err bitreich.org 70 i-iomenu: ${OBJ} Err bitreich.org 70 i- ${CC} -o $@ ${OBJ} ${LDFLAGS} Err bitreich.org 70 i- rm -f *.o Err bitreich.org 70 i+iomenu: buffer.c draw.c input.c Err bitreich.org 70 i Err bitreich.org 70 i clean: Err bitreich.org 70 i rm -f iomenu ${OBJ} Err bitreich.org 70 1diff --git a/buffer.c b/buffer.c /scm/iomenu/file/buffer.c.gph bitreich.org 70 i@@ -3,18 +3,18 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i-#include "main.h" Err bitreich.org 70 i+#include "iomenu.h" Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i- * Fill the buffer apropriately with the lines and headers. 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 { Err bitreich.org 70 i /* fill buffer with string */ Err bitreich.org 70 i char s[LINE_SIZE]; Err bitreich.org 70 i- Buffer *buffer = malloc(sizeof(Buffer)); Err bitreich.org 70 i+ Line **buffer = malloc(sizeof(Line)); Err bitreich.org 70 i FILE *fp = stdin; Err bitreich.org 70 i int l; Err bitreich.org 70 i Err bitreich.org 70 i@@ -26,22 +26,13 @@ fill_buffer(char *separator) 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->content = buffer->first->comment = ""; 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 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+ 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 Err bitreich.org 70 i- l = buffer->last->header ? 0 : l; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- /* prevent initial current line to be a header */ Err bitreich.org 70 i- buffer->current = buffer->first; Err bitreich.org 70 i- while (buffer->current->next && buffer->current->header) Err bitreich.org 70 i- buffer->current = buffer->current->next; 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@@ -70,40 +61,16 @@ add_line(Buffer *buffer, int number, char *s, char *separator, Line *prev) 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- * Parse the line content to determine if it is a header and identify the Err bitreich.org 70 i- * separator if any. 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 { Err bitreich.org 70 i Line *line = malloc(sizeof(Line)); Err bitreich.org 70 i- char *sep = separator ? strstr(s, separator) : NULL; Err bitreich.org 70 i- int pos = sep ? (int) (sep - s) : (int) strlen(s) - 1; Err bitreich.org 70 i- Err bitreich.org 70 i- /* header is when separator is the first character of the line */ Err bitreich.org 70 i- line->header = (sep == s); Err bitreich.org 70 i Err bitreich.org 70 i /* strip trailing newline */ Err bitreich.org 70 i s[strlen(s) - 1] = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i /* fill line->content */ Err bitreich.org 70 i- line->content = malloc((pos + 1) * sizeof(char)); Err bitreich.org 70 i- strncpy(line->content, s, pos); Err bitreich.org 70 i- Err bitreich.org 70 i- /* fill line->comment */ Err bitreich.org 70 i- line->comment = malloc((strlen(s) - pos) * sizeof(char)); Err bitreich.org 70 i- if (sep) { Err bitreich.org 70 i- strcpy(line->comment, s + pos + strlen(separator)); Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- /* strip trailing whitespaces from line->content */ Err bitreich.org 70 i- for (pos--; pos > 0 && isspace(line->content[pos]); pos--) Err bitreich.org 70 i- line->content[pos] = '\0'; Err bitreich.org 70 i- Err bitreich.org 70 i- /* strip leading whitespaces from line->comment */ Err bitreich.org 70 i- for (pos = 0; isspace(line->comment[pos]); pos++); Err bitreich.org 70 i- line->comment += pos; Err bitreich.org 70 i+ line->content = s; Err bitreich.org 70 i Err bitreich.org 70 i return line; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -161,7 +128,7 @@ filter_lines(Buffer *buffer, int inc) 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->header ? 0 : line->matches; Err bitreich.org 70 i+ buffer->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 i@@ -177,9 +144,6 @@ match_line(Line *line, char **tokv, size_t tokc) Err bitreich.org 70 i { Err bitreich.org 70 i size_t i, match = 1, offset = 0; Err bitreich.org 70 i Err bitreich.org 70 i- if (line->header) Err bitreich.org 70 i- return 1; Err bitreich.org 70 i- Err bitreich.org 70 i for (i = 0; i < tokc && match; i++) Err bitreich.org 70 i match = !!strstr(line->content + offset, tokv[i]); Err bitreich.org 70 i Err bitreich.org 70 i@@ -193,7 +157,7 @@ match_line(Line *line, char **tokv, size_t tokc) Err bitreich.org 70 i Line * Err bitreich.org 70 i matching_prev(Line *line) Err bitreich.org 70 i { Err bitreich.org 70 i- while ((line = line->prev) && (!line->matches || line->header)); Err bitreich.org 70 i+ while ((line = line->prev) && !line->matches); Err bitreich.org 70 i return line; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -204,6 +168,6 @@ matching_prev(Line *line) Err bitreich.org 70 i Line * Err bitreich.org 70 i matching_next(Line *line) Err bitreich.org 70 i { Err bitreich.org 70 i- while ((line = line->next) && (!line->matches || line->header)); Err bitreich.org 70 i+ while ((line = line->next) && !line->matches); Err bitreich.org 70 i return line; Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/draw.c b/draw.c /scm/iomenu/file/draw.c.gph bitreich.org 70 i@@ -3,7 +3,7 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i-#include "main.h" Err bitreich.org 70 i+#include "iomenu.h" Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -12,12 +12,10 @@ 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 { Err bitreich.org 70 i- char *content = expand_tabs(line->content); Err bitreich.org 70 i- char *comment = expand_tabs(line->comment); Err bitreich.org 70 i char output[LINE_SIZE * sizeof(char)] = "\033[K"; Err bitreich.org 70 i int n = 0; Err bitreich.org 70 i Err bitreich.org 70 i- if (opt->line_numbers && !line->header) { 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 sprintf(output + strlen(output), "%7d\033[m ", line->number); Err bitreich.org 70 i } else { Err bitreich.org 70 i@@ -25,34 +23,22 @@ draw_line(Line *line, int current, const int cols, Opt *opt) Err bitreich.org 70 i } Err bitreich.org 70 i n += 8; Err bitreich.org 70 i 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 strcat(output, "\033[1;33m"); Err bitreich.org 70 i Err bitreich.org 70 i /* content */ Err bitreich.org 70 i- strncat(output, content, cols - n); Err bitreich.org 70 i- n += strlen(content); Err bitreich.org 70 i- Err bitreich.org 70 i- /* align comment */ Err bitreich.org 70 i- if (!line->header && line->comment[0] != '\0') { Err bitreich.org 70 i- /* MAX with '1' as \033[0C still move 1 to the right */ Err bitreich.org 70 i- sprintf(output + strlen(output), "\033[%dC", Err bitreich.org 70 i- MAX(1, 40 - n)); Err bitreich.org 70 i- n += MAX(1, 40 - n); Err bitreich.org 70 i- } else if (line->header) Err bitreich.org 70 i- Err bitreich.org 70 i- /* comment */ Err bitreich.org 70 i- strcat(output, "\033[1;30m"); Err bitreich.org 70 i- strncat(output, comment, cols - n); Err bitreich.org 70 i- n += strlen(comment); Err bitreich.org 70 i+ strncat(output, line->content, cols - n); Err bitreich.org 70 i+ n += strlen(line->content); Err bitreich.org 70 i Err bitreich.org 70 i+ /* MAX with '1' as \033[0C still move 1 to the right */ Err bitreich.org 70 i+ sprintf(output + strlen(output), "\033[%dC", Err bitreich.org 70 i+ MAX(1, 40 - n)); Err bitreich.org 70 i+ n += MAX(1, 40 - n); Err bitreich.org 70 i strcat(output, "\033[m\n"); Err bitreich.org 70 i Err bitreich.org 70 i fputs(output, stderr); Err bitreich.org 70 i Err bitreich.org 70 i- free(content); Err bitreich.org 70 i- free(comment); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -137,8 +123,6 @@ draw_prompt(Buffer *buffer, int cols, Opt *opt) 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- char *input = expand_tabs(buffer->input); Err bitreich.org 70 i- char *suggest = expand_tabs(buffer->current->content); 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@@ -153,8 +137,8 @@ draw_prompt(Buffer *buffer, int cols, Opt *opt) 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(input) && cols > 0; cols--, i++) Err bitreich.org 70 i- fputc(input[i], stderr); 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 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 i@@ -171,6 +155,4 @@ draw_prompt(Buffer *buffer, int cols, Opt *opt) Err bitreich.org 70 i /* restore cursor position at the end of the input */ Err bitreich.org 70 i fputs("\033[m\033[u", stderr); Err bitreich.org 70 i Err bitreich.org 70 i- free(input); Err bitreich.org 70 i- free(suggest); Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/input.c b/input.c /scm/iomenu/file/input.c.gph bitreich.org 70 i@@ -4,7 +4,7 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i-#include "main.h" Err bitreich.org 70 i+#include "iomenu.h" Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -214,16 +214,6 @@ action_print_selection(Buffer *buffer, int return_input, Opt *opt) 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_header) { Err bitreich.org 70 i- for (line = buffer->current; line; line = line->prev) { Err bitreich.org 70 i- if (line->header) { Err bitreich.org 70 i- fputs(line->comment, stdout); Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i- fputc((int) '\t', stdout); Err bitreich.org 70 i- } 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 1diff --git a/iomenu.1 b/iomenu.1 /scm/iomenu/file/iomenu.1.gph bitreich.org 70 i@@ -1,11 +1,12 @@ Err bitreich.org 70 i-.Dd $Mdocdate: October 16 2016 $ Err bitreich.org 70 i+.Dd Mars 16 2016 Err bitreich.org 70 i .Dt IOMENU 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i+. Err bitreich.org 70 i .Sh NAME Err bitreich.org 70 i+. Err bitreich.org 70 i .Nm iomenu Err bitreich.org 70 i .Op Fl nNHksl Err bitreich.org 70 i . Err bitreich.org 70 i-. Err bitreich.org 70 i .Sh DESCRIPTION Err bitreich.org 70 i . Err bitreich.org 70 i The Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -0,0 +1,128 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "iomenu.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Reset the terminal state and exit with error. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+void Err bitreich.org 70 i+die(const char *s) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ /* tcsetattr(STDIN_FILENO, TCSANOW, &termio_old); */ Err bitreich.org 70 i+ fprintf(stderr, "%s\n", s); Err bitreich.org 70 i+ exit(EXIT_FAILURE); 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+ * Set terminal to send one char at a time for interactive mode, and return the Err bitreich.org 70 i+ * last terminal state. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+struct termios Err bitreich.org 70 i+set_terminal(int tty_fd) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct termios termio_old; Err bitreich.org 70 i+ struct termios termio_new; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* set the terminal to send one key at a time. */ Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* get the terminal's state */ Err bitreich.org 70 i+ if (tcgetattr(tty_fd, &termio_old) < 0) Err bitreich.org 70 i+ die("Can not get terminal attributes with tcgetattr()."); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* create a new modified state by switching the binary flags */ 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+ tcsetattr(tty_fd, TCSANOW, &termio_new); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return termio_old; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ 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+ Err bitreich.org 70 i+ exit(EXIT_FAILURE); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+main(int argc, char *argv[]) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int i, exit_code, tty_fd = open("/dev/tty", O_RDWR); 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+ if (argv[i][0] != '-' || strlen(argv[i]) != 2) Err bitreich.org 70 i+ usage(); 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+ 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+ 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+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } 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+ Err bitreich.org 70 i+ /* set the interface */ Err bitreich.org 70 i+ draw_screen(buffer, tty_fd, opt); 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+ 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 i+ free(opt); Err bitreich.org 70 i+ free_buffer(buffer); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return exit_code; Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/iomenu.h b/iomenu.h /scm/iomenu/file/iomenu.h.gph bitreich.org 70 i@@ -0,0 +1,67 @@ Err bitreich.org 70 i+#define LINE_SIZE 1024 Err bitreich.org 70 i+#define OFFSET 5 Err bitreich.org 70 i+#define CONTINUE 2 /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#define CONTROL(char) (char ^ 0x40) Err bitreich.org 70 i+#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) Err bitreich.org 70 i+#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) 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+ char *content; /* sent as output and matched by input */ Err bitreich.org 70 i+ int matches; /* whether it matches buffer's input */ Err bitreich.org 70 i+} Line; 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+struct termios set_terminal(int); Err bitreich.org 70 i+void usage(void); Err bitreich.org 70 i+ 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 * 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+ 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_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+ 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 1diff --git a/main.c b/main.c /scm/iomenu/file/main.c.gph bitreich.org 70 i@@ -1,91 +0,0 @@ Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i- Err bitreich.org 70 i-#include "main.h" Err bitreich.org 70 i- Err bitreich.org 70 i- 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- Err bitreich.org 70 i- exit(EXIT_FAILURE); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i-int Err bitreich.org 70 i-main(int argc, char *argv[]) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int i, exit_code, tty_fd = open("/dev/tty", O_RDWR); 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- if (argv[i][0] != '-' || strlen(argv[i]) != 2) Err bitreich.org 70 i- usage(); 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 'H': Err bitreich.org 70 i- opt->print_header = 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- 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- 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- break; Err bitreich.org 70 i- default: Err bitreich.org 70 i- usage(); Err bitreich.org 70 i- } 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- Err bitreich.org 70 i- /* set the interface */ Err bitreich.org 70 i- draw_screen(buffer, tty_fd, opt); 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- 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 i- free(opt); Err bitreich.org 70 i- free_buffer(buffer); Err bitreich.org 70 i- Err bitreich.org 70 i- return exit_code; Err bitreich.org 70 i-} Err bitreich.org 70 1diff --git a/main.h b/main.h /scm/iomenu/file/main.h.gph bitreich.org 70 i@@ -1,95 +0,0 @@ Err bitreich.org 70 i-#define LINE_SIZE 1024 Err bitreich.org 70 i-#define OFFSET 5 Err bitreich.org 70 i-#define CONTINUE 2 /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */ Err bitreich.org 70 i- Err bitreich.org 70 i-#define CONTROL(char) (char ^ 0x40) Err bitreich.org 70 i-#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) Err bitreich.org 70 i-#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) 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- int print_header; 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, wrapped in a header. Err bitreich.org 70 i- */ Err bitreich.org 70 i-typedef struct Line { Err bitreich.org 70 i- char *content; /* sent as output and matched by input */ Err bitreich.org 70 i- char *comment; /* displayed at the right of the content */ Err bitreich.org 70 i- Err bitreich.org 70 i- int number; /* set here as order will not change */ Err bitreich.org 70 i- int matches; /* whether it matches buffer's input */ Err bitreich.org 70 i- int header; /* whether the line is a header */ Err bitreich.org 70 i- Err bitreich.org 70 i- struct Line *prev; /* doubly linked list structure */ Err bitreich.org 70 i- struct Line *next; Err bitreich.org 70 i-} Line; Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Buffer containing a doubly linked list of headers Err bitreich.org 70 i- */ Err bitreich.org 70 i-typedef struct Buffer { Err bitreich.org 70 i- int total; /* total number of line in buffer */ Err bitreich.org 70 i- int matching; /* number lines matching the input */ Err bitreich.org 70 i- Err bitreich.org 70 i- char input[LINE_SIZE]; /* string from user's keyboard */ Err bitreich.org 70 i- Err bitreich.org 70 i- Line *current; /* selected line, highlighted */ Err bitreich.org 70 i- Line *first; /* boundaries of the linked list */ Err bitreich.org 70 i- Line *last; Err bitreich.org 70 i-} Buffer; Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i-/* main */ Err bitreich.org 70 i- Err bitreich.org 70 i-void usage(void); Err bitreich.org 70 i- 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 * 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- 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_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- 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- Err bitreich.org 70 i- Err bitreich.org 70 i-/* util */ Err bitreich.org 70 i- Err bitreich.org 70 i-void die(const char *); Err bitreich.org 70 i-struct termios set_terminal(int); Err bitreich.org 70 i-char * expand_tabs(char *); Err bitreich.org 70 1diff --git a/nohup.out b/nohup.out /scm/iomenu/file/nohup.out.gph bitreich.org 70 i@@ -1,92 +0,0 @@ Err bitreich.org 70 i-build: Installing tmux Err bitreich.org 70 i-checking for a BSD-compatible install... /usr/bin/install -c Err bitreich.org 70 i-checking whether build environment is sane... yes Err bitreich.org 70 i-checking for a thread-safe mkdir -p... /bin/mkdir -p Err bitreich.org 70 i-checking for gawk... no Err bitreich.org 70 i-checking for mawk... mawk Err bitreich.org 70 i-checking whether make sets $(MAKE)... yes Err bitreich.org 70 i-checking whether make supports nested variables... yes Err bitreich.org 70 i-checking build system type... x86_64-unknown-linux-gnu Err bitreich.org 70 i-checking host system type... x86_64-unknown-linux-gnu Err bitreich.org 70 i-checking for gcc... gcc Err bitreich.org 70 i-checking whether the C compiler works... yes Err bitreich.org 70 i-checking for C compiler default output file name... a.out Err bitreich.org 70 i-checking for suffix of executables... Err bitreich.org 70 i-checking whether we are cross compiling... no Err bitreich.org 70 i-checking for suffix of object files... o Err bitreich.org 70 i-checking whether we are using the GNU C compiler... yes Err bitreich.org 70 i-checking whether gcc accepts -g... yes Err bitreich.org 70 i-checking for gcc option to accept ISO C89... none needed Err bitreich.org 70 i-checking whether gcc understands -c and -o together... yes Err bitreich.org 70 i-checking for style of include used by make... GNU Err bitreich.org 70 i-checking dependency style of gcc... gcc3 Err bitreich.org 70 i-checking how to run the C preprocessor... gcc -E Err bitreich.org 70 i-checking for grep that handles long lines and -e... /bin/grep Err bitreich.org 70 i-checking for egrep... /bin/grep -E Err bitreich.org 70 i-checking for pkg-config... /usr/bin/pkg-config Err bitreich.org 70 i-checking pkg-config is at least version 0.9.0... yes Err bitreich.org 70 i-checking for glibc... yes Err bitreich.org 70 i-checking for ANSI C header files... yes Err bitreich.org 70 i-checking for sys/types.h... yes Err bitreich.org 70 i-checking for sys/stat.h... yes Err bitreich.org 70 i-checking for stdlib.h... yes Err bitreich.org 70 i-checking for string.h... yes Err bitreich.org 70 i-checking for memory.h... yes Err bitreich.org 70 i-checking for strings.h... yes Err bitreich.org 70 i-checking for inttypes.h... yes Err bitreich.org 70 i-checking for stdint.h... yes Err bitreich.org 70 i-checking for unistd.h... yes Err bitreich.org 70 i-checking bitstring.h usability... no Err bitreich.org 70 i-checking bitstring.h presence... no Err bitreich.org 70 i-checking for bitstring.h... no Err bitreich.org 70 i-checking dirent.h usability... yes Err bitreich.org 70 i-checking dirent.h presence... yes Err bitreich.org 70 i-checking for dirent.h... yes Err bitreich.org 70 i-checking fcntl.h usability... yes Err bitreich.org 70 i-checking fcntl.h presence... yes Err bitreich.org 70 i-checking for fcntl.h... yes Err bitreich.org 70 i-checking for inttypes.h... (cached) yes Err bitreich.org 70 i-checking libutil.h usability... no Err bitreich.org 70 i-checking libutil.h presence... no Err bitreich.org 70 i-checking for libutil.h... no Err bitreich.org 70 i-checking ndir.h usability... no Err bitreich.org 70 i-checking ndir.h presence... no Err bitreich.org 70 i-checking for ndir.h... no Err bitreich.org 70 i-checking paths.h usability... yes Err bitreich.org 70 i-checking paths.h presence... yes Err bitreich.org 70 i-checking for paths.h... yes Err bitreich.org 70 i-checking pty.h usability... yes Err bitreich.org 70 i-checking pty.h presence... yes Err bitreich.org 70 i-checking for pty.h... yes Err bitreich.org 70 i-checking for stdint.h... (cached) yes Err bitreich.org 70 i-checking sys/dir.h usability... yes Err bitreich.org 70 i-checking sys/dir.h presence... yes Err bitreich.org 70 i-checking for sys/dir.h... yes Err bitreich.org 70 i-checking sys/ndir.h usability... no Err bitreich.org 70 i-checking sys/ndir.h presence... no Err bitreich.org 70 i-checking for sys/ndir.h... no Err bitreich.org 70 i-checking sys/tree.h usability... no Err bitreich.org 70 i-checking sys/tree.h presence... no Err bitreich.org 70 i-checking for sys/tree.h... no Err bitreich.org 70 i-checking term.h usability... no Err bitreich.org 70 i-checking term.h presence... no Err bitreich.org 70 i-checking for term.h... no Err bitreich.org 70 i-checking util.h usability... no Err bitreich.org 70 i-checking util.h presence... no Err bitreich.org 70 i-checking for util.h... no Err bitreich.org 70 i-checking for library containing flock... none required Err bitreich.org 70 i-checking for dirfd... yes Err bitreich.org 70 i-checking for flock... yes Err bitreich.org 70 i-checking for prctl... yes Err bitreich.org 70 i-checking for sysconf... yes Err bitreich.org 70 i-checking for cfmakeraw... yes Err bitreich.org 70 i-checking for library containing clock_gettime... none required Err bitreich.org 70 i-checking for LIBEVENT... no Err bitreich.org 70 i-checking for library containing event_init... no Err bitreich.org 70 i-checking event.h usability... no Err bitreich.org 70 i-checking event.h presence... no Err bitreich.org 70 i-checking for event.h... no Err bitreich.org 70 i-configure: error: "libevent not found" Err bitreich.org 70 i-make: *** No rule to make target 'install'. Stop. Err bitreich.org 70 i-build: Updating index in /home/josuah/.local/tmux Err bitreich.org 70 i-build: Removing broken links from /home/josuah/.local Err bitreich.org 70 1diff --git a/util.c b/util.c /scm/iomenu/file/util.c.gph bitreich.org 70 i@@ -1,73 +0,0 @@ Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i-#include Err bitreich.org 70 i- Err bitreich.org 70 i-#include "main.h" Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * Reset the terminal state and exit with error. Err bitreich.org 70 i- */ Err bitreich.org 70 i-void Err bitreich.org 70 i-die(const char *s) Err bitreich.org 70 i-{ Err bitreich.org 70 i- /* tcsetattr(STDIN_FILENO, TCSANOW, &termio_old); */ Err bitreich.org 70 i- fprintf(stderr, "%s\n", s); Err bitreich.org 70 i- exit(EXIT_FAILURE); 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- * Set terminal to send one char at a time for interactive mode, and return the Err bitreich.org 70 i- * last terminal state. Err bitreich.org 70 i- */ Err bitreich.org 70 i-struct termios Err bitreich.org 70 i-set_terminal(int tty_fd) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct termios termio_old; Err bitreich.org 70 i- struct termios termio_new; Err bitreich.org 70 i- Err bitreich.org 70 i- /* set the terminal to send one key at a time. */ Err bitreich.org 70 i- Err bitreich.org 70 i- /* get the terminal's state */ Err bitreich.org 70 i- if (tcgetattr(tty_fd, &termio_old) < 0) Err bitreich.org 70 i- die("Can not get terminal attributes with tcgetattr()."); Err bitreich.org 70 i- Err bitreich.org 70 i- /* create a new modified state by switching the binary flags */ 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- tcsetattr(tty_fd, TCSANOW, &termio_new); Err bitreich.org 70 i- Err bitreich.org 70 i- return termio_old; 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- * Replace tab as a multiple of 8 spaces in a line. Err bitreich.org 70 i- * Err bitreich.org 70 i- * Allocates memory. Err bitreich.org 70 i- */ Err bitreich.org 70 i-char * Err bitreich.org 70 i-expand_tabs(char *line) Err bitreich.org 70 i-{ Err bitreich.org 70 i- size_t i, n; Err bitreich.org 70 i- char *converted = malloc(sizeof(char) * (strlen(line) * 8 + 1)); Err bitreich.org 70 i- Err bitreich.org 70 i- for (i = 0, n = 0; i < strlen(line); i++, n++) { Err bitreich.org 70 i- if (line[i] == '\t') { Err bitreich.org 70 i- for (; n == 0 || n % 8 != 0; n++) Err bitreich.org 70 i- converted[n] = ' '; Err bitreich.org 70 i- n--; Err bitreich.org 70 i- } else { Err bitreich.org 70 i- converted[n] = line[i]; Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- converted[n] = '\0'; Err bitreich.org 70 i- Err bitreich.org 70 i- return converted; Err bitreich.org 70 i-} Err bitreich.org 70 .