more descriptive names - 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 5ac10691e817e4bfb903449a99614a1184d03a7e
DIR parent 8614ad4e2b6c08fcf82366637ee1cdf7662434f4
HTML Author: Josuah Demangeon <josuah.demangeon@gandi.net>
Date: Sun, 3 Sep 2017 12:04:49 +0200
more descriptive names
Diffstat:
M iomenu.c | 125 +++++++++++++++++--------------
M utf8.c | 20 ++++++++++----------
M utf8.h | 12 ++++++------
3 files changed, 86 insertions(+), 71 deletions(-)
---
DIR diff --git a/iomenu.c b/iomenu.c
@@ -31,7 +31,7 @@ static int opt[128], rows = 0;
static char *prompt = "";
static void
-freelines(void)
+free_lines(void)
{
if (linev) {
for (; linec > 0; linec--)
@@ -47,13 +47,13 @@ die(const char *s)
{
tcsetattr(ttyfd, TCSANOW, &termios);
close(ttyfd);
- freelines();
+ free_lines();
perror(s);
exit(EXIT_FAILURE);
}
static void
-setterminal(void)
+set_terminal(void)
{
struct termios new;
@@ -72,7 +72,7 @@ setterminal(void)
}
static void
-resetterminal(void)
+reset_terminal(void)
{
int i;
@@ -88,7 +88,7 @@ resetterminal(void)
}
static void
-readlines(void)
+read_lines(void)
{
int size = 0;
size_t len;
@@ -115,41 +115,53 @@ readlines(void)
} while (++linec, ++matchc);
}
+static size_t
+string_width(char *s)
+{
+ int width = 0;
+
+ while (*s)
+ if (*s++ == '\t')
+ width += (width + 7) % 8;
+
+ return width;
+}
+
static char *
-format(char *s, int cols)
+format(char *str, int cols)
{
- int i = 0;
- long r = 0;
- char *f = formatted;
-
- while (*s && i < cols) {
- if (*s == '\t') {
- int t = 8 - i % 8;
- while (t-- && i < cols) {
- *f++ = ' ';
- i++;
+ int col = 0;
+ long rune = 0;
+ char *fmt = formatted;
+
+ while (*str && col < cols) {
+ if (*str == '\t') {
+ int t = 8 - col % 8;
+ while (t-- && col < cols) {
+ *fmt++ = ' ';
+ col++;
}
- s++;
-
- } else if (utf8torune(&r, s) && utf8isprint(r)) {
- int j = utf8len(s);
- while (j--)
- *f++ = *s++;
- i++;
-
- } else {
- *f++ = '?';
- i++;
- s++;
+ str++;
+
+ } else if (utf8_to_rune(&rune, str) && rune_is_print(rune)) {
+ int i = utf8_len(str);
+ while (i--)
+ *fmt++ = *str++;
+ col++;
+
+ } else {
+ *fmt++ = '?';
+ col++;
+ str++;
}
}
- *f = '\0';
+ *fmt = '\0';
return formatted;
}
static void
-printlines(void)
+print_lines(void)
{
int printed = 0, i = current - current % rows;
@@ -172,13 +184,13 @@ printlines(void)
}
static void
-printscreen(void)
+print_screen(void)
{
int cols = ws.ws_col - 1;
fputs("\r\033[K", stderr);
- printlines();
+ print_lines();
fprintf(stderr, "\033[%dA\r", rows);
if (*prompt) {
@@ -194,7 +206,7 @@ printscreen(void)
}
static int
-matchline(char *line, char **tokv, int tokc)
+match_line(char *line, char **tokv, int tokc)
{
if (opt['#'] && line[0] == '#')
return 2;
@@ -220,10 +232,13 @@ move(signed int sign)
}
static void
-movepg(signed int sign)
+move_page(signed int sign)
{
int i = current - current % rows + rows * sign;
+ if (!opt['l'])
+ return;
+
if (0 > i || i > matchc)
return;
@@ -255,7 +270,7 @@ filter(void)
matchc = 0;
for (i = 0; i < linec; i++)
- if (matchline(linev[i], tokv, tokc))
+ if (match_line(linev[i], tokv, tokc))
matchv[matchc++] = linev[i];
free(tokv);
@@ -265,7 +280,7 @@ filter(void)
}
static void
-removeword()
+remove_word()
{
int len = strlen(input) - 1, i;
@@ -280,7 +295,7 @@ removeword()
}
static void
-addchar(char key)
+add_char(char key)
{
int len = strlen(input);
@@ -293,7 +308,7 @@ addchar(char key)
}
static void
-printselection(void)
+print_selection(void)
{
if (opt['#']) {
char **match = matchv + current;
@@ -334,7 +349,7 @@ top:
break;
case CTL('W'):
- removeword();
+ remove_word();
break;
case 127:
@@ -357,14 +372,14 @@ top:
if (fgetc(stdin) != '~') break;
/* FALLTHROUGH */
case ALT('v'):
- movepg(-1);
+ move_page(-1);
break;
case CSI('6'): /* page down */
if (fgetc(stdin) != '~') break;
/* FALLTHROUGH */
case CTL('V'):
- movepg(+1);
+ move_page(+1);
break;
case CTL('I'): /* tab */
@@ -375,7 +390,7 @@ top:
case CTL('J'): /* enter */
case CTL('M'):
- printselection();
+ print_selection();
return EXIT_SUCCESS;
case ALT('['):
@@ -387,7 +402,7 @@ top:
goto top;
default:
- addchar((char) key);
+ add_char((char) key);
}
return CONTINUE;
@@ -400,7 +415,7 @@ sigwinch()
die("ioctl");
rows = MIN(opt['l'], ws.ws_row - 1);
- printscreen();
+ print_screen();
signal(SIGWINCH, sigwinch);
}
@@ -413,7 +428,7 @@ usage(void)
}
static void
-parseopt(int argc, char *argv[])
+parse_opt(int argc, char *argv[])
{
memset(opt, 0, 128 * sizeof (int));
@@ -454,11 +469,11 @@ parseopt(int argc, char *argv[])
int
main(int argc, char *argv[])
{
- int exitcode;
+ int exit_code;
- parseopt(argc, argv);
+ parse_opt(argc, argv);
- readlines();
+ read_lines();
filter();
if (!freopen("/dev/tty", "r", stdin) ||
@@ -466,17 +481,17 @@ main(int argc, char *argv[])
die("freopen");
ttyfd = open("/dev/tty", O_RDWR);
- setterminal();
+ set_terminal();
sigwinch();
input[0] = '\0';
- while ((exitcode = key()) == CONTINUE)
- printscreen();
- printscreen();
+ while ((exit_code = key()) == CONTINUE)
+ print_screen();
+ print_screen();
- resetterminal();
+ reset_terminal();
close(ttyfd);
- freelines();
+ free_lines();
- return exitcode;
+ return exit_code;
}
DIR diff --git a/utf8.c b/utf8.c
@@ -34,7 +34,7 @@
* or 0 if ti is misencoded.
*/
size_t
-utf8len(char *s)
+utf8_len(char *s)
{
unsigned char *sp = (unsigned char *) s;
int i, len = (*sp < 0x80) ? 1 : /* 0xxxxxxx < 10000000 */
@@ -62,7 +62,7 @@ utf8len(char *s)
* 0 if rune is too long.
*/
size_t
-utf8runelen(long r)
+rune_len(long r)
{
return (r <= 0x0000007f) ? 1 : (r <= 0x000007ff) ? 2 :
(r <= 0x0000ffff) ? 3 : (r <= 0x001fffff) ? 4 :
@@ -76,10 +76,10 @@ utf8runelen(long r)
* Return the number of bytes read or 0 if the string is misencoded.
*/
size_t
-utf8torune(long *r, char *s)
+utf8_to_rune(long *r, char *s)
{
char mask[] = { 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01 };
- size_t i, len = utf8len(s);
+ size_t i, len = utf8_len(s);
if (len == 0 || len > 6 || (size_t) len > strlen(s))
return 0;
@@ -92,7 +92,7 @@ utf8torune(long *r, char *s)
*r = (*r << 6) | (*s++ & 0x3f); /* 10xxxxxx */
/* overlong sequences */
- if (utf8runelen(*r) != len)
+ if (rune_len(*r) != len)
return 0;
return len;
@@ -103,7 +103,7 @@ utf8torune(long *r, char *s)
* Returns 1 if the rune is a valid unicode code point and 0 if not.
*/
int
-utf8runeisunicode(long r)
+rune_is_unicode(long r)
{
return !(
(r > 0x10ffff) || /* outside range */
@@ -125,14 +125,14 @@ utf8runeisunicode(long r)
* code points.
*/
int
-utf8check(char *s)
+utf8_check(char *s)
{
size_t shift, len = strlen(s);
long r = 0;
while (len > 0) {
- shift = utf8torune(&r, s);
- if (!shift || !utf8runeisunicode(r))
+ shift = utf8_to_rune(&r, s);
+ if (!shift || !rune_is_unicode(r))
return 0;
s += shift;
@@ -146,7 +146,7 @@ utf8check(char *s)
* Return 1 if the rune is a printable character, and 0 otherwise.
*/
int
-utf8isprint(long r)
+rune_is_print(long r)
{
return (0x1f < r && r != 0x7f && r < 0x80) || 0x9f < r;
}
DIR diff --git a/utf8.h b/utf8.h
@@ -1,6 +1,6 @@
-size_t utf8len(char *);
-size_t utf8runelen(long);
-size_t utf8torune(long *, char *);
-int utf8isunicode(long);
-int utf8check(char *);
-int utf8isprint(long);
+size_t utf8_len(char *);
+size_t rune_len(long);
+size_t utf8_to_rune(long *, char *);
+int utf8_is_unicode(long);
+int utf8_check(char *);
+int rune_is_print(long);