From 13a52cdc0e0e2aff67f1faedfce35837fde328fa Mon Sep 17 00:00:00 2001 From: tjr Date: Thu, 24 Jun 2004 13:42:26 +0000 Subject: Add support for multibyte characters and for characters that take up more than one column position. --- usr.bin/expand/expand.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'usr.bin/expand') diff --git a/usr.bin/expand/expand.c b/usr.bin/expand/expand.c index 927c3ab..6c99db8 100644 --- a/usr.bin/expand/expand.c +++ b/usr.bin/expand/expand.c @@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include /* * expand - expand tabs to equivalent spaces @@ -64,9 +66,12 @@ static void usage(void); int main(int argc, char *argv[]) { + const char *curfile; + wint_t wc; int c, column; int n; int rval; + int width; setlocale(LC_CTYPE, ""); @@ -100,22 +105,24 @@ main(int argc, char *argv[]) argc--, argv++; continue; } + curfile = argv[0]; argc--, argv++; - } + } else + curfile = "stdin"; column = 0; - while ((c = getchar()) != EOF) { - switch (c) { + while ((wc = getwchar()) != WEOF) { + switch (wc) { case '\t': if (nstops == 0) { do { - putchar(' '); + putwchar(' '); column++; } while (column & 07); continue; } if (nstops == 1) { do { - putchar(' '); + putwchar(' '); column++; } while (((column - 1) % tabstops[0]) != (tabstops[0] - 1)); continue; @@ -124,12 +131,12 @@ main(int argc, char *argv[]) if (tabstops[n] > column) break; if (n == nstops) { - putchar(' '); + putwchar(' '); column++; continue; } while (column < tabstops[n]) { - putchar(' '); + putwchar(' '); column++; } continue; @@ -137,21 +144,25 @@ main(int argc, char *argv[]) case '\b': if (column) column--; - putchar('\b'); + putwchar('\b'); continue; default: - putchar(c); - if (isprint(c)) - column++; + putwchar(wc); + if ((width = wcwidth(wc)) > 0) + column += width; continue; case '\n': - putchar(c); + putwchar(wc); column = 0; continue; } } + if (ferror(stdin)) { + warn("%s", curfile); + rval = 1; + } } while (argc > 0); exit(rval); } -- cgit v1.1