summaryrefslogtreecommitdiffstats
path: root/usr.bin/colrm/colrm.c
diff options
context:
space:
mode:
authortjr <tjr@FreeBSD.org>2004-07-29 09:09:22 +0000
committertjr <tjr@FreeBSD.org>2004-07-29 09:09:22 +0000
commit0b3301069c7bff1e6de387451ce93de4de8f0469 (patch)
tree8d401fad3c799a7f74c3bd9b71d8f3dc021d1de8 /usr.bin/colrm/colrm.c
parent0b69ed438f29176def8cc37e895d3cee5efd7d1b (diff)
downloadFreeBSD-src-0b3301069c7bff1e6de387451ce93de4de8f0469.zip
FreeBSD-src-0b3301069c7bff1e6de387451ce93de4de8f0469.tar.gz
Add support for multibyte characters. The output is questionable when a
character straddles the "start" or "stop" columns, but this should be quite uncommon.
Diffstat (limited to 'usr.bin/colrm/colrm.c')
-rw-r--r--usr.bin/colrm/colrm.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/usr.bin/colrm/colrm.c b/usr.bin/colrm/colrm.c
index d39df09..52dda90 100644
--- a/usr.bin/colrm/colrm.c
+++ b/usr.bin/colrm/colrm.c
@@ -50,10 +50,12 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <errno.h>
#include <limits.h>
+#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <wchar.h>
#define TAB 8
@@ -64,9 +66,11 @@ int
main(int argc, char *argv[])
{
u_long column, start, stop;
- int ch;
+ int ch, width;
char *p;
+ setlocale(LC_ALL, "");
+
while ((ch = getopt(argc, argv, "")) != -1)
switch(ch) {
case '?':
@@ -98,8 +102,8 @@ main(int argc, char *argv[])
errx(1, "illegal start and stop columns");
for (column = 0;;) {
- switch (ch = getchar()) {
- case EOF:
+ switch (ch = getwchar()) {
+ case WEOF:
check(stdin);
break;
case '\b':
@@ -113,12 +117,13 @@ main(int argc, char *argv[])
column = (column + TAB) & ~(TAB - 1);
break;
default:
- ++column;
+ if ((width = wcwidth(ch)) > 0)
+ column += width;
break;
}
if ((!start || column < start || (stop && column > stop)) &&
- putchar(ch) == EOF)
+ putwchar(ch) == WEOF)
check(stdout);
}
}
OpenPOWER on IntegriCloud