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 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 .