iuse utf8_col() instead of format() which used a buffer, remove -p flag - 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 1a73e9911476f01c8a4548f020b8def4e62bfe2b /scm/iomenu/commit/1a73e9911476f01c8a4548f020b8def4e62bfe2b.gph bitreich.org 70
1parent 00bb578f57d039ac6e6c2ce2835da575c78c76f3 /scm/iomenu/commit/00bb578f57d039ac6e6c2ce2835da575c78c76f3.gph bitreich.org 70
hAuthor: Josuah Demangeon <mail@josuah.net> URL:mailto:mail@josuah.net bitreich.org 70
iDate: Thu, 18 Jan 2018 23:43:01 +0100 Err bitreich.org 70
i Err bitreich.org 70
iuse utf8_col() instead of format() which used a buffer, remove -p flag Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M iomenu.1 | 51 +++++++++++++++++++++++++++---- Err bitreich.org 70
i M iomenu.c | 149 ++++++++++++------------------- Err bitreich.org 70
i M test.c | 6 +++--- Err bitreich.org 70
i M utf8.c | 4 ++-- Err bitreich.org 70
i Err bitreich.org 70
i4 files changed, 107 insertions(+), 103 deletions(-) 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@@ -1,81 +1,120 @@ Err bitreich.org 70
i .Dd aug 21, 2017 Err bitreich.org 70
i .Dt IOMENU 1 Err bitreich.org 70
i .Os Err bitreich.org 70
i+. 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 .Nd interactive selection menu Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i .Sh SYNOPSIS Err bitreich.org 70
i+. Err bitreich.org 70
i .Nm Err bitreich.org 70
i .Op Fl # Err bitreich.org 70
i-.Op Fl p Ar prompt 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 .Nm Err bitreich.org 70
i is an interactive filtering and selection tool for the terminal. Err bitreich.org 70
i+. Err bitreich.org 70
i .Pp Err bitreich.org 70
i It reads lines from standard input, and prompt for a selection. Err bitreich.org 70
i The selected line is printed to standard output. Err bitreich.org 70
i-.Bl -tag -width XXXXXXXXXXXXXXXX Err bitreich.org 70
i-.It Fl p Ar prompt Err bitreich.org 70
i-Set the prompt to display at the beginning of the input to Err bitreich.org 70
i-.Ar prompt . Err bitreich.org 70
i+. Err bitreich.org 70
i+.Bl -tag -width 6n Err bitreich.org 70
i+. Err bitreich.org 70
i .It Fl # Err bitreich.org 70
i If a line starts with Err bitreich.org 70
i .Li # , Err bitreich.org 70
i .Nm Err bitreich.org 70
i will interprete it as a header, which always matches, and can not be Err bitreich.org 70
i printed. Err bitreich.org 70
i-.Pp Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i .Sh KEY BINDINGS Err bitreich.org 70
i+. Err bitreich.org 70
i An active selection is highlighted, and can be controlled with keybindings. Err bitreich.org 70
i As printable keys are entered, the lines are filtered to match each Err bitreich.org 70
i word from the input. Err bitreich.org 70
i+. Err bitreich.org 70
i .Bl -tag -width XXXXXXXXXXXXXXX Err bitreich.org 70
i+. Err bitreich.org 70
i .It Ic Up Ns , Ic Down Ns , Ic Ctrl + p Ns , Ic Ctrl + n Err bitreich.org 70
i Move selection to the previous/next item. Err bitreich.org 70
i+. Err bitreich.org 70
i .It Ic PageUp Ns , Ic PageDown Ns , Ic Alt + v Ns , Ic Ctrl + v Err bitreich.org 70
i Move one page up or down. Err bitreich.org 70
i+. Err bitreich.org 70
i .It Ic Ctrl + m Ns , Ic Ctrl + j Ns , Ic Enter Err bitreich.org 70
i Print the selection to the standard output, and exit 0. Err bitreich.org 70
i+. Err bitreich.org 70
i .It Ic Ctrl + h Ns , Ic Bakcspace Err bitreich.org 70
i Remove last character from current input. Err bitreich.org 70
i+. Err bitreich.org 70
i .It Ic Ctrl + w Err bitreich.org 70
i Remove last word from current input. Err bitreich.org 70
i+. Err bitreich.org 70
i .It Ic Ctrl + u Err bitreich.org 70
i Remove the whole input string. Err bitreich.org 70
i+. Err bitreich.org 70
i .It Ic Ctrl + i Ns , Ic Tab Err bitreich.org 70
i Fill the input with current selection. Err bitreich.org 70
i+. Err bitreich.org 70
i .El Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i .Sh EXIT STATUS Err bitreich.org 70
i+. Err bitreich.org 70
i .Ex -std Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i .Sh EXAMPLES Err bitreich.org 70
i+. Err bitreich.org 70
i Go to a subdirectory: Err bitreich.org 70
i+. Err bitreich.org 70
i .Bd -literal -offset XX Err bitreich.org 70
i cd "$(find . -type d | iomenu)" Err bitreich.org 70
i .Ed Err bitreich.org 70
i+. Err bitreich.org 70
i .Pp Err bitreich.org 70
i Edit a file located in Err bitreich.org 70
i .Ev HOME : Err bitreich.org 70
i+. Err bitreich.org 70
i .Bd -literal -offset XX Err bitreich.org 70
i $EDITOR "$(find "$HOME" -type f | iomenu)" Err bitreich.org 70
i .Ed Err bitreich.org 70
i+. Err bitreich.org 70
i .Pp Err bitreich.org 70
i Play an audio file: Err bitreich.org 70
i+. Err bitreich.org 70
i .Bd -literal -offset XX Err bitreich.org 70
i mplayer "$(find ~/Music | iomenu)" Err bitreich.org 70
i .Ed Err bitreich.org 70
i+. Err bitreich.org 70
i .Pp Err bitreich.org 70
i Select a background job to attach to: Err bitreich.org 70
i+. Err bitreich.org 70
i .Bd -literal -offset XX Err bitreich.org 70
i fg "%$(jobs | iomenu | cut -c 2)" Err bitreich.org 70
i .Ed Err bitreich.org 70
i+. Err bitreich.org 70
i .Pp Err bitreich.org 70
i Filter "ps" output and print a process ID Err bitreich.org 70
i .Bd -literal -offset XX Err bitreich.org 70
i { printf '#'; ps ax; } | iomenu -# | sed -r 's/ *([0-9]*).*/\1/' Err bitreich.org 70
i .Ed Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i .Sh SEE ALSO Err bitreich.org 70
i+. Err bitreich.org 70
i .Xr dmenu 1 , Err bitreich.org 70
i .Xr slmenu 1 , Err bitreich.org 70
i .Xr vis-menu 1 Err bitreich.org 70
i+. Err bitreich.org 70
i+. Err bitreich.org 70
i .Sh AUTORS Err bitreich.org 70
i+. Err bitreich.org 70
i .An Josuah Demangeon Aq Mt mail@josuah.net Err bitreich.org 70
1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70
i@@ -31,7 +31,6 @@ char **linev = NULL, **matchv = NULL; Err bitreich.org 70
i char input[LINE_MAX], formatted[LINE_MAX * 8]; Err bitreich.org 70
i Err bitreich.org 70
i int flag_hs = 0; Err bitreich.org 70
i-char *flag_p = ""; Err bitreich.org 70
i Err bitreich.org 70
i static char * Err bitreich.org 70
i io_strstr(const char *str1, const char *str2) Err bitreich.org 70
i@@ -39,7 +38,7 @@ io_strstr(const char *str1, const char *str2) Err bitreich.org 70
i const char *s1; Err bitreich.org 70
i const char *s2; Err bitreich.org 70
i Err bitreich.org 70
i- while (1) { Err bitreich.org 70
i+ for (;;) { Err bitreich.org 70
i s1 = str1; Err bitreich.org 70
i s2 = str2; Err bitreich.org 70
i while (*s1 != '\0' && tolower(*s1) == tolower(*s2)) Err bitreich.org 70
i@@ -73,7 +72,7 @@ match_line(char *line, char **tokv) Err bitreich.org 70
i * Free the structures, reset the terminal state and exit with an error message. Err bitreich.org 70
i */ Err bitreich.org 70
i static void Err bitreich.org 70
i-die(const char *s) Err bitreich.org 70
i+err(const char *s) Err bitreich.org 70
i { Err bitreich.org 70
i tcsetattr(ttyfd, TCSANOW, &termios); Err bitreich.org 70
i close(ttyfd); Err bitreich.org 70
i@@ -96,10 +95,10 @@ split_lines(char *buf) Err bitreich.org 70
i linec = 1; Err bitreich.org 70
i for (b = buf; (b = strchr(b, '\n')) != NULL && b[1] != '\0'; b++) Err bitreich.org 70
i linec++; Err bitreich.org 70
i- if ((lv = linev = calloc(linec + 1, sizeof (char **))) == NULL) Err bitreich.org 70
i- die("calloc"); Err bitreich.org 70
i- if ((mv = matchv = calloc(linec + 1, sizeof (char **))) == NULL) Err bitreich.org 70
i- die("calloc"); Err bitreich.org 70
i+ if ((lv = linev = calloc(linec + 1, sizeof(char **))) == NULL) Err bitreich.org 70
i+ err("calloc"); Err bitreich.org 70
i+ if ((mv = matchv = calloc(linec + 1, sizeof(char **))) == NULL) Err bitreich.org 70
i+ err("calloc"); Err bitreich.org 70
i *mv = *lv = b = buf; Err bitreich.org 70
i while ((b = strchr(b, '\n')) != NULL) { Err bitreich.org 70
i *b = '\0'; Err bitreich.org 70
i@@ -120,13 +119,13 @@ read_stdin(void) Err bitreich.org 70
i size = BUFSIZ; Err bitreich.org 70
i off = 0; Err bitreich.org 70
i if ((buf = malloc(size)) == NULL) Err bitreich.org 70
i- die("malloc"); Err bitreich.org 70
i+ err("malloc"); Err bitreich.org 70
i while ((len = read(STDIN_FILENO, buf + off, size - off)) > 0) { Err bitreich.org 70
i off += len; Err bitreich.org 70
i if (off == size) { Err bitreich.org 70
i size *= 2; Err bitreich.org 70
i if ((buf = realloc(buf, size + 1)) == NULL) Err bitreich.org 70
i- die("realloc"); Err bitreich.org 70
i+ err("realloc"); Err bitreich.org 70
i } Err bitreich.org 70
i } Err bitreich.org 70
i buf[off] = '\0'; Err bitreich.org 70
i@@ -134,14 +133,14 @@ read_stdin(void) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-move(signed int sign) Err bitreich.org 70
i+move(int direction) Err bitreich.org 70
i { Err bitreich.org 70
i- extern char **matchv; Err bitreich.org 70
i- extern int matchc; Err bitreich.org 70
i+ extern char **matchv; Err bitreich.org 70
i+ extern int matchc; Err bitreich.org 70
i Err bitreich.org 70
i int i; Err bitreich.org 70
i Err bitreich.org 70
i- for (i = cur + sign; 0 <= i && i < matchc; i += sign) { Err bitreich.org 70
i+ for (i = cur + direction; 0 <= i && i < matchc; i += direction) { Err bitreich.org 70
i if (!flag_hs || matchv[i][0] != '#') { Err bitreich.org 70
i cur = i; Err bitreich.org 70
i break; Err bitreich.org 70
i@@ -171,7 +170,7 @@ filter(int searchc, char **searchv) Err bitreich.org 70
i extern int matchc, cur; Err bitreich.org 70
i Err bitreich.org 70
i int n; Err bitreich.org 70
i- char *tokv[sizeof(input) / 2 * sizeof(char *) + sizeof(NULL)]; Err bitreich.org 70
i+ char *tokv[sizeof(input) * sizeof(char *) + sizeof(NULL)]; Err bitreich.org 70
i char *s, buf[sizeof(input)]; Err bitreich.org 70
i Err bitreich.org 70
i strncpy(buf, input, sizeof(input)); Err bitreich.org 70
i@@ -329,71 +328,35 @@ top: Err bitreich.org 70
i return 1; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-static char * Err bitreich.org 70
i-format(char *str, int col) Err bitreich.org 70
i-{ Err bitreich.org 70
i- extern struct winsize ws; Err bitreich.org 70
i- extern char formatted[LINE_MAX * 8]; Err bitreich.org 70
i- Err bitreich.org 70
i- int c, n, w; Err bitreich.org 70
i- long rune = 0; Err bitreich.org 70
i- char *fmt; Err bitreich.org 70
i- Err bitreich.org 70
i- fmt = formatted; Err bitreich.org 70
i- for (c = 0; *str != '\0' && c < col; ) { Err bitreich.org 70
i- if (*str == '\t') { Err bitreich.org 70
i- int t = 8 - c % 8; Err bitreich.org 70
i- while (t-- && c < col) { Err bitreich.org 70
i- *fmt++ = ' '; Err bitreich.org 70
i- c++; Err bitreich.org 70
i- } Err bitreich.org 70
i- str++; Err bitreich.org 70
i- } else if ((n = utf8_torune(&rune, str)) > 0 && Err bitreich.org 70
i- (w = utf8_wcwidth(rune)) > 0) { Err bitreich.org 70
i- while (n--) Err bitreich.org 70
i- *fmt++ = *str++; Err bitreich.org 70
i- c += w; Err bitreich.org 70
i- } else { Err bitreich.org 70
i- *fmt++ = '?'; Err bitreich.org 70
i- str += n; Err bitreich.org 70
i- c ++; Err bitreich.org 70
i- } Err bitreich.org 70
i- } Err bitreich.org 70
i- *fmt = '\0'; Err bitreich.org 70
i- Err bitreich.org 70
i- return formatted; Err bitreich.org 70
i-} Err bitreich.org 70
i- Err bitreich.org 70
i static void Err bitreich.org 70
i print_line(char *line, int highlight) Err bitreich.org 70
i { Err bitreich.org 70
i extern struct winsize ws; Err bitreich.org 70
i Err bitreich.org 70
i- if (flag_hs && line[0] == '#') { Err bitreich.org 70
i- format(line + 1, ws.ws_col - 1); Err bitreich.org 70
i- fprintf(stderr, "\n\x1b[1m %s\x1b[m", formatted); Err bitreich.org 70
i- } else if (highlight) { Err bitreich.org 70
i- format(line, ws.ws_col - 1); Err bitreich.org 70
i- fprintf(stderr, "\n\x1b[47;30m\x1b[K %s\x1b[m", formatted); Err bitreich.org 70
i- } else { Err bitreich.org 70
i- format(line, ws.ws_col - 1); Err bitreich.org 70
i- fprintf(stderr, "\n %s", formatted); Err bitreich.org 70
i- } Err bitreich.org 70
i+ if (flag_hs && line[0] == '#') Err bitreich.org 70
i+ fprintf(stderr, "\n\x1b[1m\r%.*s\x1b[m", Err bitreich.org 70
i+ utf8_col(line + 1, ws.ws_col, 0), line + 1); Err bitreich.org 70
i+ else if (highlight) Err bitreich.org 70
i+ fprintf(stderr, "\n\x1b[47;30m\x1b[K\r%.*s\x1b[m", Err bitreich.org 70
i+ utf8_col(line, ws.ws_col, 0), line); Err bitreich.org 70
i+ else Err bitreich.org 70
i+ fprintf(stderr, "\n%.*s", Err bitreich.org 70
i+ utf8_col(line, ws.ws_col, 0), line); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i print_screen(void) Err bitreich.org 70
i { Err bitreich.org 70
i extern struct winsize ws; Err bitreich.org 70
i- extern char **matchv, *flag_p, input[LINE_MAX]; Err bitreich.org 70
i+ extern char **matchv, input[LINE_MAX]; Err bitreich.org 70
i extern int matchc; Err bitreich.org 70
i Err bitreich.org 70
i char **m; Err bitreich.org 70
i- int p, i, cols, rows; Err bitreich.org 70
i+ int p, i, c, cols, rows; Err bitreich.org 70
i Err bitreich.org 70
i- cols = ws.ws_col - 1; Err bitreich.org 70
i- rows = ws.ws_row - 1; Err bitreich.org 70
i- p = 0; Err bitreich.org 70
i+ cols = ws.ws_col; Err bitreich.org 70
i+ rows = ws.ws_row - 1; /* keep one line for user input */ Err bitreich.org 70
i+ p = c = 0; Err bitreich.org 70
i i = cur - cur % rows; Err bitreich.org 70
i m = matchv + i; Err bitreich.org 70
i fputs("\x1b[2J", stderr); Err bitreich.org 70
i@@ -402,13 +365,7 @@ print_screen(void) Err bitreich.org 70
i p++, i++, m++; Err bitreich.org 70
i } Err bitreich.org 70
i fputs("\x1b[H", stderr); Err bitreich.org 70
i- if (*flag_p) { Err bitreich.org 70
i- format(flag_p, cols - 2); Err bitreich.org 70
i- fprintf(stderr, "\x1b[30;47m %s \x1b[m", formatted); Err bitreich.org 70
i- cols -= strlen(formatted) + 2; Err bitreich.org 70
i- } Err bitreich.org 70
i- fputc(' ', stderr); Err bitreich.org 70
i- fputs(format(input, cols), stderr); Err bitreich.org 70
i+ fprintf(stderr, "%.*s", utf8_col(input, cols, c), input); Err bitreich.org 70
i fflush(stderr); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -448,7 +405,7 @@ sigwinch() Err bitreich.org 70
i extern struct winsize ws; Err bitreich.org 70
i Err bitreich.org 70
i if (ioctl(ttyfd, TIOCGWINSZ, &ws) < 0) Err bitreich.org 70
i- die("ioctl"); Err bitreich.org 70
i+ err("ioctl"); Err bitreich.org 70
i print_screen(); Err bitreich.org 70
i signal(SIGWINCH, sigwinch); Err bitreich.org 70
i } Err bitreich.org 70
i@@ -456,7 +413,7 @@ sigwinch() Err bitreich.org 70
i static void Err bitreich.org 70
i usage(void) Err bitreich.org 70
i { Err bitreich.org 70
i- fputs("usage: iomenu [-#] [-p flag_p]\n", stderr); Err bitreich.org 70
i+ fputs("usage: iomenu [-#]\n", stderr); Err bitreich.org 70
i exit(EXIT_FAILURE); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -466,17 +423,10 @@ usage(void) Err bitreich.org 70
i static void Err bitreich.org 70
i parse_opt(int argc, char *argv[]) Err bitreich.org 70
i { Err bitreich.org 70
i- extern char *flag_p; Err bitreich.org 70
i- Err bitreich.org 70
i for (argv++, argc--; argc > 0; argv++, argc--) { Err bitreich.org 70
i if (argv[0][0] != '-') Err bitreich.org 70
i usage(); Err bitreich.org 70
i switch ((*argv)[1]) { Err bitreich.org 70
i- case 'p': Err bitreich.org 70
i- if (!--argc) Err bitreich.org 70
i- usage(); Err bitreich.org 70
i- flag_p = *++argv; Err bitreich.org 70
i- break; Err bitreich.org 70
i case '#': Err bitreich.org 70
i flag_hs = 1; Err bitreich.org 70
i break; Err bitreich.org 70
i@@ -486,6 +436,26 @@ parse_opt(int argc, char *argv[]) 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+init(void) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ extern char input[LINE_MAX]; Err bitreich.org 70
i+ Err bitreich.org 70
i+ input[0] = '\0'; Err bitreich.org 70
i+ read_stdin(); Err bitreich.org 70
i+ filter(linec, linev); Err bitreich.org 70
i+ Err bitreich.org 70
i+ if (freopen("/dev/tty", "r", stdin) == NULL) Err bitreich.org 70
i+ err("freopen /dev/tty"); Err bitreich.org 70
i+ if (freopen("/dev/tty", "w", stderr) == NULL) Err bitreich.org 70
i+ err("freopen /dev/tty"); Err bitreich.org 70
i+ if ((ttyfd = open("/dev/tty", O_RDWR)) < 0) Err bitreich.org 70
i+ err("open /dev/tty"); Err bitreich.org 70
i+ Err bitreich.org 70
i+ set_terminal(); Err bitreich.org 70
i+ sigwinch(); Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i /* Err bitreich.org 70
i * Read stdin in a buffer, filling a table of lines, then re-open stdin to Err bitreich.org 70
i * /dev/tty for an interactive (raw) session to let the user filter and select Err bitreich.org 70
i@@ -494,23 +464,18 @@ parse_opt(int argc, char *argv[]) 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- extern char input[LINE_MAX]; Err bitreich.org 70
i- Err bitreich.org 70
i int exit_code; Err bitreich.org 70
i Err bitreich.org 70
i parse_opt(argc, argv); Err bitreich.org 70
i- read_stdin(); Err bitreich.org 70
i- filter(linec, linev); Err bitreich.org 70
i- if (!freopen("/dev/tty", "r", stdin)) Err bitreich.org 70
i- die("freopen /dev/tty"); Err bitreich.org 70
i- if (!freopen("/dev/tty", "w", stderr)) Err bitreich.org 70
i- die("freopen /dev/tty"); Err bitreich.org 70
i- ttyfd = open("/dev/tty", O_RDWR); Err bitreich.org 70
i- set_terminal(); Err bitreich.org 70
i- sigwinch(); Err bitreich.org 70
i- input[0] = '\0'; Err bitreich.org 70
i+ init(); Err bitreich.org 70
i+ Err bitreich.org 70
i+#ifdef __OpenBSD__ Err bitreich.org 70
i+ pledge("stdio tty", NULL); Err bitreich.org 70
i+#endif Err bitreich.org 70
i+ Err bitreich.org 70
i while ((exit_code = key(fgetc(stdin))) > 0) Err bitreich.org 70
i print_screen(); Err bitreich.org 70
i+ Err bitreich.org 70
i print_screen(); Err bitreich.org 70
i reset_terminal(); Err bitreich.org 70
i close(ttyfd); Err bitreich.org 70
1diff --git a/test.c b/test.c /scm/iomenu/file/test.c.gph bitreich.org 70
i@@ -6,10 +6,10 @@ int Err bitreich.org 70
i main(void) Err bitreich.org 70
i { Err bitreich.org 70
i int c, col, o, off; Err bitreich.org 70
i- char s[] = " 浪漫的夢想"; Err bitreich.org 70
i+ char s[] = "\t\t浪漫的夢想"; Err bitreich.org 70
i Err bitreich.org 70
i- for (off = 0; off < 10; off++) { Err bitreich.org 70
i- for (col = off + 1; col < 25; col++) { Err bitreich.org 70
i+ for (off = 0; off < 15; off++) { Err bitreich.org 70
i+ for (col = off + 1; col < 30; col++) { Err bitreich.org 70
i for (c = 0; c < col; c++) Err bitreich.org 70
i putchar(c % 8 == 0 ? '>' : '_'); Err bitreich.org 70
i printf(" %d\n", col); Err bitreich.org 70
1diff --git a/utf8.c b/utf8.c /scm/iomenu/file/utf8.c.gph bitreich.org 70
i@@ -173,14 +173,14 @@ utf8_col(char *str, int col, int off) Err bitreich.org 70
i long rune; Err bitreich.org 70
i char *pos, *s; Err bitreich.org 70
i Err bitreich.org 70
i- for (s = str; off < col;) { Err bitreich.org 70
i+ for (s = str; off <= col;) { Err bitreich.org 70
i pos = s; Err bitreich.org 70
i if (*s == '\0') Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i s += utf8_torune(&rune, s); Err bitreich.org 70
i if (rune == '\t') Err bitreich.org 70
i- off += 7 - (off) % 8; Err bitreich.org 70
i+ off += 8 - (off % 8); Err bitreich.org 70
i else Err bitreich.org 70
i off += utf8_wcwidth(rune); Err bitreich.org 70
i } Err bitreich.org 70
.
Response:
text/plain