From thinker@master.branda.to  Thu May 16 08:58:44 2002
Return-Path: <thinker@master.branda.to>
Received: from master.branda.to (branda.netlab.cse.yzu.edu.tw [140.138.145.30])
	by hub.freebsd.org (Postfix) with SMTP id 1124837B491
	for <FreeBSD-gnats-submit@freebsd.org>; Thu, 16 May 2002 08:58:00 -0700 (PDT)
Received: (qmail 12544 invoked by uid 1000); 16 May 2002 15:51:21 -0000
Message-Id: <20020516155121.12543.qmail@master.branda.to>
Date: 16 May 2002 15:51:21 -0000
From: thinker <thinker@master.branda.to>
Reply-To: thinker <thinker@master.branda.to>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject:
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         38152
>Category:       bin
>Synopsis:       ls improvments
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    ache
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu May 16 09:00:07 PDT 2002
>Closed-Date:    Sun Sep 15 09:15:39 PDT 2002
>Last-Modified:  Sun Sep 15 09:15:39 PDT 2002
>Originator:     thinker
>Release:        FreeBSD 5.0-CURRENT i386
>Organization:
YZU	
>Environment:
System: FreeBSD master.branda.to 5.0-CURRENT FreeBSD 5.0-CURRENT #0: Wed Jan 16 14:10:31 CST 2002 thinker@master.branda.to:/mnt/src/sys/i386/compile/thk i386


	
>Description:
	/bin/ls could not deal about mb language.
>How-To-Repeat:
	
>Fix:



--- util.c.orig	Thu May 16 23:37:22 2002
+++ util.c	Thu May 16 23:43:19 2002
@@ -52,6 +52,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <rune.h>
+#include <wctype.h>
 
 #include "ls.h"
 #include "extern.h"
@@ -60,15 +62,33 @@
 prn_printable(s)
 	const char *s;
 {
-	unsigned char c;
-	int n;
+	const char *p1, *p2;
+	char *r, *ri;
+	int len, dc;
+	rune_t c;
 
-	for (n = 0; (c = *s) != '\0'; ++s, ++n)
-		if (isprint(c))
-			putchar(c);
-		else
-			putchar('?');
-	return n;
+	p1 = s;
+	dc = len = strlen(s);
+	ri = r = (char *)malloc(len + 1);
+	while(*p1 != 0) {
+		c = sgetrune(p1, dc, &p2);
+		if(c == _INVALID_RUNE) {
+			p1++;
+			dc--;
+			*ri++ = '?';
+		} else {
+			dc -= p2 - p1;
+			if(isprint(c))
+				while(p1 != p2)
+					*ri++ = *p1++;
+			else
+				while(p1 != p2)
+					*ri++ = '?';
+		}
+	}
+	*ri = 0;
+	printf("%s", r);
+	return len;
 }
 
 /*

>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->ache 
Responsible-Changed-By: dwmalone 
Responsible-Changed-When: Sun Sep 15 08:47:19 PDT 2002 
Responsible-Changed-Why:  
Seems to be a NLS/8-bit issue, so Andrey is likely to understand it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=38152 
State-Changed-From-To: open->closed 
State-Changed-By: ache 
State-Changed-When: Sun Sep 15 09:12:42 PDT 2002 
State-Changed-Why:  
Rune interface is depricated, use POSIX / ANSI C wc* functions instead. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=38152 
>Unformatted:
