summaryrefslogtreecommitdiff
path: root/usr.bin/colrm
diff options
context:
space:
mode:
authorTim J. Robbins <tjr@FreeBSD.org>2004-07-29 09:09:22 +0000
committerTim J. Robbins <tjr@FreeBSD.org>2004-07-29 09:09:22 +0000
commitd10ab05ebd0f489ae3227e61675c91439c6b31e7 (patch)
tree8d401fad3c799a7f74c3bd9b71d8f3dc021d1de8 /usr.bin/colrm
parent866b1c7484331044ed9c4912edff1656cab65736 (diff)
downloadsrc-test2-d10ab05ebd0f489ae3227e61675c91439c6b31e7.tar.gz
src-test2-d10ab05ebd0f489ae3227e61675c91439c6b31e7.zip
Add support for multibyte characters. The output is questionable when a
character straddles the "start" or "stop" columns, but this should be quite uncommon.
Notes
Notes: svn path=/head/; revision=132831
Diffstat (limited to 'usr.bin/colrm')
-rw-r--r--usr.bin/colrm/colrm.16
-rw-r--r--usr.bin/colrm/colrm.c15
2 files changed, 11 insertions, 10 deletions
diff --git a/usr.bin/colrm/colrm.1 b/usr.bin/colrm/colrm.1
index 77782c2052db..76a86be1436b 100644
--- a/usr.bin/colrm/colrm.1
+++ b/usr.bin/colrm/colrm.1
@@ -32,7 +32,7 @@
.\" @(#)colrm.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
-.Dd July 15, 2004
+.Dd July 29, 2004
.Dt COLRM 1
.Os
.Sh NAME
@@ -78,7 +78,3 @@ The
.Nm
command appeared in
.Bx 3.0 .
-.Sh BUGS
-The
-.Nm
-utility does not recognize multibyte characters.
diff --git a/usr.bin/colrm/colrm.c b/usr.bin/colrm/colrm.c
index d39df099cc1d..52dda90086dd 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);
}
}