working horizontal scrolling - iomenu - interactive terminal-based selection menu
HTML git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
DIR commit a74019ac53549e4017a2aa36bd377c1e0c2c9fc7
DIR parent d445637975d35e90023bcf4c7ebe73367b8b66e3
HTML Author: Josuah Demangeonā ā µ <mail@josuah.net>
Date: Sun, 19 Mar 2017 01:35:48 +0100
working horizontal scrolling
Diffstat:
M iomenu.c | 60 ++++++++++++++++----------------
1 file changed, 30 insertions(+), 30 deletions(-)
---
DIR diff --git a/iomenu.c b/iomenu.c
@@ -18,15 +18,15 @@
char input[BUFSIZ];
-size_t current = 0, offset = 0, prev = 0, next = 0;
-size_t linec = 0, matchc = 0;
+int current = 0, offset = 0, prev = 0, next = 0;
+int linec = 0, matchc = 0;
char **linev = NULL, **matchv = NULL;
char *opt_prompt = "";
int opt_lines = 0;
void
-free_v(char **v, size_t c)
+free_v(char **v, int c)
{
for (; c > 0; c--)
free(v[c - 1]);
@@ -53,7 +53,7 @@ set_terminal(int tty_fd)
if (tcgetattr(tty_fd, &termio_old) < 0)
die("Can not get terminal attributes with tcgetattr().");
- termio_new = termio_old;
+ termio_new = termio_old;
termio_new.c_lflag &= ~(ICANON | ECHO | IGNBRK);
tcsetattr(tty_fd, TCSANOW, &termio_new);
@@ -66,7 +66,7 @@ void
read_lines(void)
{
char buffer[BUFSIZ];
- size_t size = 1 << 6;
+ int size = 1 << 6;
linev = malloc(sizeof (char **) * size);
matchv = malloc(sizeof (char **) * size);
@@ -77,7 +77,7 @@ read_lines(void)
/* read the file into an array of lines */
for (; fgets(buffer, sizeof buffer, stdin); linec++, matchc++) {
- size_t len = strlen(buffer);
+ int len = strlen(buffer);
if (len > 0 && buffer[len - 1] == '\n')
buffer[len - 1] = '\0';
@@ -100,9 +100,9 @@ read_lines(void)
int
-match_line(char *line, char **tokv, size_t tokc)
+match_line(char *line, char **tokv, int tokc)
{
- for (size_t i = 0; i < tokc; i++)
+ for (int i = 0; i < tokc; i++)
if (strstr(line, tokv[i]) == NULL)
return 0;
@@ -114,7 +114,7 @@ void
filter_lines(void)
{
char **tokv = NULL, *s, buffer[sizeof (input)];
- size_t tokc = 0, n = 0;
+ int tokc = 0, n = 0;
current = offset = prev = next = 0;
@@ -133,7 +133,7 @@ filter_lines(void)
}
matchc = 0;
- for (size_t i = 0; i < linec; i++)
+ for (int i = 0; i < linec; i++)
if (match_line(linev[i], tokv, tokc))
matchv[matchc++] = linev[i];
@@ -147,17 +147,16 @@ print_string(char *str, int current)
fputs(current ? "\033[30;47m" : "", stderr);
fputs(opt_lines ? "\033[K " : " ", stderr);
fprintf(stderr, "%s \033[m", str);
- fputs(" \033[m", stderr);
}
void
-print_lines(size_t count, size_t cols)
+print_lines(int count, int cols)
{
- size_t p = 0; /* amount of lines printed */
+ int p = 0; /* amount of lines printed */
offset = current / count * count;
- for (size_t i = offset; p < count && i < matchc; p++, i++) {
+ for (int i = offset; p < count && i < matchc; p++, i++) {
fputc('\n', stderr);
print_string(matchv[i], i == current);
}
@@ -168,24 +167,25 @@ print_lines(size_t count, size_t cols)
void
-update_pages(size_t pos, size_t cols)
+update_pages(int pos, int cols)
{
- size_t col;
+ int col;
for (prev = pos, col = 0; prev > 0; prev--)
if ((col += strlen(matchv[prev]) + 2) > cols)
break;
- for (next = pos, col = 0; next < matchc; next++)
+ for (next = pos, col = 0; next <= matchc; next++)
if ((col += strlen(matchv[next]) + 2) > cols)
break;
+ next++;
next--;
}
void
-print_columns(size_t cols)
+print_columns(int cols)
{
if (current < offset) {
offset = prev;
@@ -196,22 +196,22 @@ print_columns(size_t cols)
update_pages(offset, cols - 30 - 1);
}
- for (size_t i = offset; i < next && i < matchc; i++)
+ for (int i = offset; i < next && i < matchc; i++)
print_string(matchv[i], i == current);
if (next < matchc)
- fprintf(stderr, "\033[%ldC>", cols);
+ fprintf(stderr, "\033[%dC>", cols);
}
void
-print_prompt(size_t cols)
+print_prompt(int cols)
{
- size_t limit = opt_lines ? cols : 30;
+ int limit = opt_lines ? cols : 30;
fputc('\r', stderr);
- for (size_t i = 0; i < limit - 2; i++)
+ for (int i = 0; i < limit - 2; i++)
fputc(' ', stderr);
fputs(offset > 0 ? "< " : " ", stderr);
@@ -224,7 +224,7 @@ void
print_screen(int tty_fd)
{
struct winsize w;
- size_t count;
+ int count;
if (ioctl(tty_fd, TIOCGWINSZ, &w) < 0)
die("could not get terminal size");
@@ -235,7 +235,7 @@ print_screen(int tty_fd)
if (opt_lines) {
print_lines(count, w.ws_col);
- fprintf(stderr, "\033[%ldA", count + 1);
+ fprintf(stderr, "\033[%dA", count + 1);
} else {
fputs("\033[30C", stderr);
print_columns(w.ws_col);
@@ -246,18 +246,18 @@ print_screen(int tty_fd)
void
-print_clear(size_t lines)
+print_clear(int lines)
{
- for (size_t i = 0; i < lines + 1; i++)
+ for (int i = 0; i < lines + 1; i++)
fputs("\r\033[K\n", stderr);
- fprintf(stderr, "\033[%ldA", lines + 1);
+ fprintf(stderr, "\033[%dA", lines + 1);
}
void
remove_word_input()
{
- size_t len = strlen(input) - 1;
+ int len = strlen(input) - 1;
for (int i = len; i >= 0 && isspace(input[i]); i--)
input[i] = '\0';
@@ -273,7 +273,7 @@ remove_word_input()
void
add_character(char key)
{
- size_t len = strlen(input);
+ int len = strlen(input);
if (isprint(key)) {
input[len] = key;