summaryrefslogtreecommitdiffstats
path: root/usr.bin/expand
diff options
context:
space:
mode:
authortjr <tjr@FreeBSD.org>2004-06-24 13:42:26 +0000
committertjr <tjr@FreeBSD.org>2004-06-24 13:42:26 +0000
commit13a52cdc0e0e2aff67f1faedfce35837fde328fa (patch)
tree33fa4f6262f1d0b0103fad7bd11b3b8608a11fa8 /usr.bin/expand
parent9b721035eab6f424210a6eb2d282c9e1f7d22425 (diff)
downloadFreeBSD-src-13a52cdc0e0e2aff67f1faedfce35837fde328fa.zip
FreeBSD-src-13a52cdc0e0e2aff67f1faedfce35837fde328fa.tar.gz
Add support for multibyte characters and for characters that take up
more than one column position.
Diffstat (limited to 'usr.bin/expand')
-rw-r--r--usr.bin/expand/expand.c35
1 files changed, 23 insertions, 12 deletions
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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <wchar.h>
+#include <wctype.h>
/*
* 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);
}
OpenPOWER on IntegriCloud