iimport from repo.or.cz (sadly) - 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 d0e21509afe9e6ebf8e3f0e75ce31d9799905c7a /scm/iomenu/commit/d0e21509afe9e6ebf8e3f0e75ce31d9799905c7a.gph bitreich.org 70 hAuthor: Josuah Demangeon⠠⠵ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Sat, 11 Mar 2017 11:18:03 +0100 Err bitreich.org 70 i Err bitreich.org 70 iimport from repo.or.cz (sadly) Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A LICENSE | 21 +++++++++++++++++++++ Err bitreich.org 70 i A Makefile | 22 ++++++++++++++++++++++ Err bitreich.org 70 i A README | 90 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A TODO | 8 ++++++++ Err bitreich.org 70 i A buffer.c | 209 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A draw.c | 176 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A input.c | 237 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A io-abduco | 15 +++++++++++++++ Err bitreich.org 70 i A io-files | 58 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i A io-grep | 16 ++++++++++++++++ Err bitreich.org 70 i A io-man | 9 +++++++++ Err bitreich.org 70 i A io-mblaze | 16 ++++++++++++++++ Err bitreich.org 70 i A io-run | 100 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A io-setfont | 11 +++++++++++ Err bitreich.org 70 i A iomenu.1 | 77 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A main.c | 91 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A main.h | 95 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i A nohup.out | 92 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A util.c | 73 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i19 files changed, 1416 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/LICENSE b/LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i@@ -0,0 +1,21 @@ Err bitreich.org 70 i+MIT License Err bitreich.org 70 i+ Err bitreich.org 70 i+Copyright (c) 2016 Josuah Demangeon⠠⠵ Err bitreich.org 70 i+ Err bitreich.org 70 i+Permission is hereby granted, free of charge, to any person obtaining a copy Err bitreich.org 70 i+of this software and associated documentation files (the "Software"), to deal Err bitreich.org 70 i+in the Software without restriction, including without limitation the rights Err bitreich.org 70 i+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell Err bitreich.org 70 i+copies of the Software, and to permit persons to whom the Software is Err bitreich.org 70 i+furnished to do so, subject to the following conditions: Err bitreich.org 70 i+ Err bitreich.org 70 i+The above copyright notice and this permission notice shall be included in all Err bitreich.org 70 i+copies or substantial portions of the Software. Err bitreich.org 70 i+ Err bitreich.org 70 i+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR Err bitreich.org 70 i+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, Err bitreich.org 70 i+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE Err bitreich.org 70 i+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER Err bitreich.org 70 i+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, Err bitreich.org 70 i+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE Err bitreich.org 70 i+SOFTWARE. Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/iomenu/file/Makefile.gph bitreich.org 70 i@@ -0,0 +1,22 @@ 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+ Err bitreich.org 70 i+clean: Err bitreich.org 70 i+ rm -f iomenu ${OBJ} Err bitreich.org 70 i+ Err bitreich.org 70 i+install: iomenu Err bitreich.org 70 i+ mkdir -p $(PREFIX)/bin $(MANPREFIX)/man/man1 Err bitreich.org 70 i+ cp *.1 $(MANPREFIX)/man/man1/ Err bitreich.org 70 i+ cp iomenu io-* $(PREFIX)/bin/ Err bitreich.org 70 1diff --git a/README b/README /scm/iomenu/file/README.gph bitreich.org 70 i@@ -0,0 +1,90 @@ Err bitreich.org 70 i+iomenu - Filter lines from stdin with an interactive menu 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+________________________________________________________________________________ Err bitreich.org 70 i+ Err bitreich.org 70 i+ iomenu is a terminal tool to interactively select lines from stdin, and Err bitreich.org 70 i+ print them out to the standard output. Err bitreich.org 70 i+ Err bitreich.org 70 i+ You can use scripts made for dmenu [1], as iomenu mostly the same way. Err bitreich.org 70 i+ Err bitreich.org 70 i+ Thanks to the authors of dmenu [1], sandy [2], vis-menu[3], pep[4], ... Err bitreich.org 70 i+ that taught me C by writing some. Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Getting started Err bitreich.org 70 i+________________________________________________________________________________ Err bitreich.org 70 i+ Err bitreich.org 70 i+ You can install iomenu by running: Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ make install Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ Err bitreich.org 70 i+ You can optionnaly set a "PREFIX" variable to set the path to Err bitreich.org 70 i+ install to: Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ make PREFIX="$HOME/bin" install Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ Err bitreich.org 70 i+ All you need to build it is a C compiler: It is plain C89 source Err bitreich.org 70 i+ code without external dependencies. Err bitreich.org 70 i+ Err bitreich.org 70 i+ All usage details are written in the man page, "iomenu.1". Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Examples Err bitreich.org 70 i+________________________________________________________________________________ Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Open a bookmark from a list in a text file Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ iomenu < bookmarks-urls.txt | xargs firefox Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Go to a subdirectory Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ cd "$(find . -type d | iomenu)" Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Edit a file located in ~ Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ $EDITOR "$(find -type f | iomenu)" Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Play an audio file Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ mplayer "$(find ~/Music | iomenu)" Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Select a background job to attach to Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ fg "%$(jobs | iomenu | cut -c 2)" Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+Filter "ps" output and print a process ID Err bitreich.org 70 i+ Err bitreich.org 70 i+ """ Err bitreich.org 70 i+ { printf '#'; ps ax; } | iomenu -s '#' | sed -r 's/ *([0-9]*).*/\1/' 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+ Err bitreich.org 70 i+1 http://git.suckless.org/dmenu/tree/dmenu.c Err bitreich.org 70 i+2 http://git.suckless.org/sandy/tree/sandy.c Err bitreich.org 70 i+3 http://github.com/martanne/vis/blob/master/vis-menu.c Err bitreich.org 70 i+4 http://github.com/charles-l/pep/blob/master/pep.c Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/iomenu/file/TODO.gph bitreich.org 70 i@@ -0,0 +1,8 @@ Err bitreich.org 70 i+- Check return values for every function that may fail. Err bitreich.org 70 i+ Err bitreich.org 70 i+- Add support for a default input string (when I will need it or if Err bitreich.org 70 i+ someone ask for it). Err bitreich.org 70 i+ Err bitreich.org 70 i+- Fix the input shifting the line count by 1. Err bitreich.org 70 i+ Err bitreich.org 70 i+- Case insensitive match. Err bitreich.org 70 1diff --git a/buffer.c b/buffer.c /scm/iomenu/file/buffer.c.gph bitreich.org 70 i@@ -0,0 +1,209 @@ 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+ * Fill the buffer apropriately with the lines and headers. 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+ FILE *fp = stdin; Err bitreich.org 70 i+ int l; Err bitreich.org 70 i+ 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+ 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+ 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+ 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+ */ 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+{ 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+ 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+ } else { Err bitreich.org 70 i+ buffer->first = buffer->last; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return buffer->last; 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+ Err bitreich.org 70 i+ return line; 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+ * Free the buffer, 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+ Err bitreich.org 70 i+ free(buffer->first); Err bitreich.org 70 i+ Err bitreich.org 70 i+ buffer->first = next; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ free(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+ * 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+ * 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+{ Err bitreich.org 70 i+ Line *line = buffer->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+ 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+ 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+ Err bitreich.org 70 i+ tokv[tokc - 1] = s; 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+ while (line) { Err bitreich.org 70 i+ if (buffer->input[0] && !strcmp(buffer->input, line->content)) { Err bitreich.org 70 i+ line->matches = 1; 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+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ line = line->next; 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+/* Err bitreich.org 70 i+ * Return whecher the line matches every string from tokv. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+int Err bitreich.org 70 i+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+ return match; 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+ * Seek the previous matching line, or NULL if none matches. Err bitreich.org 70 i+ */ 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+ return line; 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+ * Seek the next matching line, or NULL if none matches. Err bitreich.org 70 i+ */ 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+ 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@@ -0,0 +1,176 @@ 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+ * 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+{ 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+ 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+ strcat(output, 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+ 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+ 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+/* Err bitreich.org 70 i+ * Print all the lines from an array of pointer to lines. Err bitreich.org 70 i+ * 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+{ 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+ 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+ 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+ j++; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ line = line->next; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* continue up to the end of the screen clearing it */ Err bitreich.org 70 i+ for (; j < count; j++) Err bitreich.org 70 i+ fputs("\r\033[K\n", stderr); 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+ * Update the screen interface and print all candidates. Err bitreich.org 70 i+ * 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+{ Err bitreich.org 70 i+ struct winsize w; Err bitreich.org 70 i+ int count; Err bitreich.org 70 i+ 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+ 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+ 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+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+draw_clear(int lines) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < lines + 1; i++) Err bitreich.org 70 i+ fputs("\r\033[K\n", stderr); Err bitreich.org 70 i+ fprintf(stderr, "\033[%dA", lines + 1); 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+ * Print the prompt, before the input, with the number of candidates that 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+{ 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+ Err bitreich.org 70 i+ /* number of digits */ Err bitreich.org 70 i+ for (i = matching; i; i /= 10, cols--); Err bitreich.org 70 i+ for (i = total; i; i /= 10, cols--); 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+ 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+ 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+ Err bitreich.org 70 i+ /* grey */ Err bitreich.org 70 i+ fputs("\033[1;30m", stderr); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* go to the end of the line */ Err bitreich.org 70 i+ fprintf(stderr, "\033[%dC", cols); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* total match and line count at the end of the line */ Err bitreich.org 70 i+ fprintf(stderr, "%d/%d", matching, total); Err bitreich.org 70 i+ 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@@ -0,0 +1,237 @@ 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+ * 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+{ 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+ Err bitreich.org 70 i+ /* receive one character at a time from the terminal */ 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+ 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+ Err bitreich.org 70 i+ fclose(tty_fp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return exit_code; 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+ * 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+{ 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+ 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+ 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+ 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+ 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+ 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+ 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+ 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+ 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+ 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+ return EXIT_SUCCESS; Err bitreich.org 70 i+ Err bitreich.org 70 i+ case CONTROL('['): /* escape */ Err bitreich.org 70 i+ switch (fgetc(tty_fp)) { Err bitreich.org 70 i+ Err bitreich.org 70 i+ case 'O': /* arrow keys */ 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+ 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+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ Err bitreich.org 70 i+ case '[': /* page control */ Err bitreich.org 70 i+ key = fgetc(tty_fp); Err bitreich.org 70 i+ switch(fgetc(tty_fp)) { Err bitreich.org 70 i+ Err bitreich.org 70 i+ case '~': 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+ 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+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } 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+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ return CONTINUE; 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 the 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+{ 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+ result = line ? line : result; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (; direction < 0 && line; direction++) { Err bitreich.org 70 i+ line = matching_prev(line); Err bitreich.org 70 i+ result = line ? line : result; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (; direction > 0 && line; direction--) { Err bitreich.org 70 i+ line = matching_next(line); 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+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+/* 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+{ Err bitreich.org 70 i+ size_t length = strlen(buffer->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+ 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+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+/* 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+{ Err bitreich.org 70 i+ size_t length = strlen(buffer->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+ } Err bitreich.org 70 i+ Err bitreich.org 70 i+ filter_lines(buffer, 1); Err bitreich.org 70 i+ Err bitreich.org 70 i+ action_jump(buffer, 0); 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+ * 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+{ 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_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 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+ } Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/io-abduco b/io-abduco /scm/iomenu/file/io-abduco.gph bitreich.org 70 i@@ -0,0 +1,15 @@ Err bitreich.org 70 i+# Prompt for an abduco session to attach to Err bitreich.org 70 i+ Err bitreich.org 70 i+if [ "$ABDUCO" ] Err bitreich.org 70 i+then Err bitreich.org 70 i+ printf 'session already active: %s\n' "$ABDUCO" Err bitreich.org 70 i+ exit 1 Err bitreich.org 70 i+fi Err bitreich.org 70 i+ Err bitreich.org 70 i+name="$(printf '#%s' "$( Err bitreich.org 70 i+ abduco | sed -r 's/(.*)\t(.*)/\2 # \1/' Err bitreich.org 70 i+)" | iomenu -s '#')" Err bitreich.org 70 i+ Err bitreich.org 70 i+[ "$SSH_CLIENT$SSH_TTY$SSH_CONNECTION" ] && e='^\' || e='^Z' Err bitreich.org 70 i+ Err bitreich.org 70 i+TERM=screen ABDUCO="$name" exec abduco -e "$e" -A "$name" "$SHELL" Err bitreich.org 70 1diff --git a/io-files b/io-files /scm/iomenu/file/io-files.gph bitreich.org 70 i@@ -0,0 +1,58 @@ Err bitreich.org 70 i+# Prompt a file to open in PAGER, with an history. In less(1), 'v' to edit. Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+CACHE="${XDG_CACHE_HOME:-$HOME/.cache}" Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+path() Err bitreich.org 70 i+( Err bitreich.org 70 i+ if [ "$1" ] Err bitreich.org 70 i+ then Err bitreich.org 70 i+ printf '%s\n' "$(cd "${1%/*}"; pwd)/${1##*/}" Err bitreich.org 70 i+ else Err bitreich.org 70 i+ { Err bitreich.org 70 i+ printf '#\n# Recent files\n' Err bitreich.org 70 i+ [ -f "$CACHE/iomenu/files" ] && Err bitreich.org 70 i+ tac "$CACHE/iomenu/files" Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf '#\n# Current directory\n' Err bitreich.org 70 i+ find "$PWD" -maxdepth 1 -type f Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf '#\n# All files\n' Err bitreich.org 70 i+ find ~ -type f ! -path '*/.cache/*' ! -path '*/.git/*' Err bitreich.org 70 i+ Err bitreich.org 70 i+ } | sed "s|$HOME|~|" | iomenu -l 256 -s '#' | sed "s|~|$HOME|" Err bitreich.org 70 i+ Err bitreich.org 70 i+ fi | tee -a "$CACHE/iomenu/files" Err bitreich.org 70 i+) Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+history() Err bitreich.org 70 i+( Err bitreich.org 70 i+ sort "$CACHE/iomenu/files" | uniq -d | while IFS='' read -r f Err bitreich.org 70 i+ do Err bitreich.org 70 i+ printf '%s\n' "$( Err bitreich.org 70 i+ grep -Fxv "$f" "$CACHE/iomenu/files" Err bitreich.org 70 i+ )" "$f" > "$CACHE/iomenu/files" Err bitreich.org 70 i+ done Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf '%s\n' "$(tail "$CACHE/iomenu/files")" > "$CACHE/iomenu/files" Err bitreich.org 70 i+) 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+ mkdir -p "$CACHE/iomenu" Err bitreich.org 70 i+ Err bitreich.org 70 i+ file="$(path "$1")" Err bitreich.org 70 i+ Err bitreich.org 70 i+ # terminal name Err bitreich.org 70 i+ printf '\033]0;%s\007' "$(printf %s "$file" | sed "s|$HOME|~|")" Err bitreich.org 70 i+ Err bitreich.org 70 i+ history Err bitreich.org 70 i+ Err bitreich.org 70 i+ [ "$file" ] && [ -d "${file%/*}" ] && exec $EDITOR "$file" Err bitreich.org 70 i+) Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+main "$@" Err bitreich.org 70 1diff --git a/io-grep b/io-grep /scm/iomenu/file/io-grep.gph bitreich.org 70 i@@ -0,0 +1,16 @@ Err bitreich.org 70 i+directory="$( Err bitreich.org 70 i+ cd "$HOME" Err bitreich.org 70 i+ find . -type d ! -path '*/.git/*' ! -name '.git' | Err bitreich.org 70 i+ sed 's/^./~/' | iomenu -l 256 Err bitreich.org 70 i+)" Err bitreich.org 70 i+ Err bitreich.org 70 i+directory="$HOME${directory#\~}" Err bitreich.org 70 i+ Err bitreich.org 70 i+grep -rL '\x00' "$directory" | while IFS='' read -r path Err bitreich.org 70 i+do Err bitreich.org 70 i+ printf '#io-grep %s\n' "~${path#$HOME}" Err bitreich.org 70 i+ cat "$path" Err bitreich.org 70 i+done | iomenu -s '#io-grep' -H -N -l 256 | { Err bitreich.org 70 i+ IFS=' ' read -r path line Err bitreich.org 70 i+ exec $EDITOR +"$line"g "$HOME${path#\~}" Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/io-man b/io-man /scm/iomenu/file/io-man.gph bitreich.org 70 i@@ -0,0 +1,9 @@ Err bitreich.org 70 i+# prompt a man page to open Err bitreich.org 70 i+ Err bitreich.org 70 i+man "$( Err bitreich.org 70 i+ IFS=':' Err bitreich.org 70 i+ find $(manpath -q) ! -type d | Err bitreich.org 70 i+ sed -r 's/.*\/(.*).[0-9](.gz)?$/\1/' | Err bitreich.org 70 i+ sort -u | Err bitreich.org 70 i+ iomenu Err bitreich.org 70 i+)" Err bitreich.org 70 1diff --git a/io-mblaze b/io-mblaze /scm/iomenu/file/io-mblaze.gph bitreich.org 70 i@@ -0,0 +1,16 @@ Err bitreich.org 70 i+T=' ' Err bitreich.org 70 i+choice="$( Err bitreich.org 70 i+ mdirs "${MAIL%/*}" | while IFS='' read -r dir Err bitreich.org 70 i+ do Err bitreich.org 70 i+ printf '#\n# %s\n' "${dir##*/}" Err bitreich.org 70 i+ Err bitreich.org 70 i+ mlist "$dir" | mpick :u | msort -d | mthread | Err bitreich.org 70 i+ mscan -f '%D %24f %u%t%2i%120S' Err bitreich.org 70 i+ Err bitreich.org 70 i+ done | iomenu -N -H -s '#' -l 255 Err bitreich.org 70 i+)" Err bitreich.org 70 i+ Err bitreich.org 70 i+[ "$choice" ] || exit 0 Err bitreich.org 70 i+ Err bitreich.org 70 i+mlist "${MAIL%/*}/${choice%%$T*}" | mpick :u | msort -d | mthread | Err bitreich.org 70 i+sed -n "${choice#*$T}p" | mshow | $PAGER Err bitreich.org 70 1diff --git a/io-run b/io-run /scm/iomenu/file/io-run.gph bitreich.org 70 i@@ -0,0 +1,100 @@ Err bitreich.org 70 i+# Prompt for a programs to run Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+CACHE="${XDG_CACHE_HOME:-$HOME/.cache}" Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+usage() Err bitreich.org 70 i+{ Err bitreich.org 70 i+ printf 'Usage: %s [cmd [args...] [+]] Err bitreich.org 70 i+ Err bitreich.org 70 i+cmd do not prompt for a command and run cmd right away Err bitreich.org 70 i+args do not prompt for arguments neither and use arg Err bitreich.org 70 i++ if present after the arguments, prompt for a path\n' "${0##*/}" 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+# Update the cache and get the command to run. Err bitreich.org 70 i+# Err bitreich.org 70 i+update_cache() Err bitreich.org 70 i+( Err bitreich.org 70 i+ IFS=':' u=0 Err bitreich.org 70 i+ Err bitreich.org 70 i+ for dir in $PATH Err bitreich.org 70 i+ do Err bitreich.org 70 i+ [ "$CACHE/dmenu_run" -ot "$dir" ] && u=1 Err bitreich.org 70 i+ done Err bitreich.org 70 i+ Err bitreich.org 70 i+ [ "$u" -eq 1 ] && find -L $PATH -type f -exec test -x {} \; -print | Err bitreich.org 70 i+ sed 's|.*/||' | sort -u > "$CACHE/dmenu_run" 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+# Prompt for options for a given command and log it to an history file Err bitreich.org 70 i+# Err bitreich.org 70 i+get_options() Err bitreich.org 70 i+( Err bitreich.org 70 i+ local command="$1" Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf '%s ' "$command" >> "$CACHE/iomenu/run" Err bitreich.org 70 i+ Err bitreich.org 70 i+ while read -r cmd opt Err bitreich.org 70 i+ do Err bitreich.org 70 i+ [ "$command" = "$cmd" ] && printf '%s\n' "$opt" Err bitreich.org 70 i+ done < "$CACHE/iomenu/run" | Err bitreich.org 70 i+ iomenu -p "$command" | tee -a "$CACHE/iomenu/run" Err bitreich.org 70 i+ Err bitreich.org 70 i+ sort -u "$CACHE/iomenu/run" -o "$CACHE/iomenu/run" 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+# Prompt for a file path in $HOME and print it. Err bitreich.org 70 i+# Err bitreich.org 70 i+get_path() Err bitreich.org 70 i+( Err bitreich.org 70 i+ find "$HOME" ! -path "$CACHE" ! -path '*/.git/*' | Err bitreich.org 70 i+ sed -r "s/.{${#HOME}}/~/" | iomenu -l 256 | sed 's/^~//' 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+# Get the options according to the command and run it Err bitreich.org 70 i+# Err bitreich.org 70 i+run() Err bitreich.org 70 i+( Err bitreich.org 70 i+ command="${1:-$(iomenu -l 256 -s '#' < "$CACHE/dmenu_run")}" Err bitreich.org 70 i+ Err bitreich.org 70 i+ [ -z "$command" ] && exit 1 Err bitreich.org 70 i+ Err bitreich.org 70 i+ options="$(get_options "$command")" Err bitreich.org 70 i+ Err bitreich.org 70 i+ if [ "$options" ] && [ -z "${options%%*+}" ] Err bitreich.org 70 i+ then Err bitreich.org 70 i+ path="$(get_path)" options="${options%+}" Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ Err bitreich.org 70 i+ if [ "$path" ] Err bitreich.org 70 i+ then exec $command $options "$path" Err bitreich.org 70 i+ else exec $command $options Err bitreich.org 70 i+ fi Err bitreich.org 70 i+) 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+ mkdir -p "$CACHE/iomenu" Err bitreich.org 70 i+ Err bitreich.org 70 i+ if [ $# -gt 0 ] && [ -z "${1##-*}" ] Err bitreich.org 70 i+ then Err bitreich.org 70 i+ usage Err bitreich.org 70 i+ else Err bitreich.org 70 i+ update_cache Err bitreich.org 70 i+ run "$@" Err bitreich.org 70 i+ fi Err bitreich.org 70 i+) Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+main "$@" Err bitreich.org 70 1diff --git a/io-setfont b/io-setfont /scm/iomenu/file/io-setfont.gph bitreich.org 70 i@@ -0,0 +1,11 @@ Err bitreich.org 70 i+setfont "$( Err bitreich.org 70 i+ find /usr/share ~ -type d -name consolefonts | while IFS='' read -r path Err bitreich.org 70 i+ do Err bitreich.org 70 i+ cd "$path" || exit 1 Err bitreich.org 70 i+ Err bitreich.org 70 i+ fonts="$(find . -type f | cut -c 3-)" Err bitreich.org 70 i+ Err bitreich.org 70 i+ [ "$fonts" ] && printf '#\n# %s\n%s\n' "$path" "$fonts" Err bitreich.org 70 i+ Err bitreich.org 70 i+ done | iomenu -l 256 -s '#' -H | sed 's/\t/\//' Err bitreich.org 70 i+)" Err bitreich.org 70 1diff --git a/iomenu.1 b/iomenu.1 /scm/iomenu/file/iomenu.1.gph bitreich.org 70 i@@ -0,0 +1,77 @@ Err bitreich.org 70 i+.Dd $Mdocdate: October 16 2016 $ Err bitreich.org 70 i+.Dt IOMENU 1 Err bitreich.org 70 i+.Os Err bitreich.org 70 i+.Sh NAME 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 i+.Nm Err bitreich.org 70 i+utility filters lines form stdin interactively with the keyboard, and print Err bitreich.org 70 i+the selected line to stdout. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+Lower case switches are for the interface, uppercase switches are for Err bitreich.org 70 i+input/output. Err bitreich.org 70 i+.Bl -tag Err bitreich.org 70 i+.It Fl n Err bitreich.org 70 i+Display line numbers in interface. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl N Err bitreich.org 70 i+Return the line number rather than the match. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl H Err bitreich.org 70 i+Return the current header that the selection belongs to in addition to the Err bitreich.org 70 i+match, delimited by a tab. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl k Cm key Err bitreich.org 70 i+Key to use to validate current selection in addition to Enter. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl s Cm separator Err bitreich.org 70 i+Character separating the content from the comments. Every character after Err bitreich.org 70 i+the separator will be considered as comment and will be grayed and aligned Err bitreich.org 70 i+in the interface. Err bitreich.org 70 i+.Pp Err bitreich.org 70 i+If a separator is at the beginning of a line (without leading space), the Err bitreich.org 70 i+line is considered as a section header, and it will always be displayed Err bitreich.org 70 i+regardless if it matches or not. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Fl l Cm lines Err bitreich.org 70 i+Number of lines to display at once. Default is 30. Err bitreich.org 70 i+.El Err bitreich.org 70 i+. Err bitreich.org 70 i+. Err bitreich.org 70 i+.Sh KEYBINDINGS Err bitreich.org 70 i+. Err bitreich.org 70 i+.Bl -tag Err bitreich.org 70 i+.It Cm ^M, ^J, Enter Err bitreich.org 70 i+Print the matched line to stdout and exit. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm ^@, ^Space Err bitreich.org 70 i+Print the content of the input rather than the matched line to stdout and exit. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm ^P / ^N, Up / Down Err bitreich.org 70 i+Navigate to the previous / next line. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm PageUp / PageDown Err bitreich.org 70 i+Navigate 10 lines up / down. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm ^I, Tab Err bitreich.org 70 i+Set input to the currently highlighted candidate, then cycle through candidate Err bitreich.org 70 i+list. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm ^H, Backspace Err bitreich.org 70 i+Delete one char backward, but if there is no char Err bitreich.org 70 i+backward, it should return an error code of 1. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm ^C Err bitreich.org 70 i+Cancel, and make filter return the error code of 1. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm ^W Err bitreich.org 70 i+Deletes the last entered word. Err bitreich.org 70 i+. Err bitreich.org 70 i+.It Cm ^U Err bitreich.org 70 i+Deletes the entire input and jump to the first line. Err bitreich.org 70 i+.El Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/iomenu/file/main.c.gph bitreich.org 70 i@@ -0,0 +1,91 @@ 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@@ -0,0 +1,95 @@ 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@@ -0,0 +1,92 @@ 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@@ -0,0 +1,73 @@ 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 .