From owner-freebsd-bugs Thu May 16 9: 0:59 2002 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by hub.freebsd.org (Postfix) with ESMTP id 01B3337B417 for ; Thu, 16 May 2002 09:00:08 -0700 (PDT) Received: (from gnats@localhost) by freefall.freebsd.org (8.11.6/8.11.6) id g4GG07v92496; Thu, 16 May 2002 09:00:07 -0700 (PDT) (envelope-from gnats) 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 ; 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 Reply-To: thinker To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: bin/38152: Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org >Number: 38152 >Category: bin >Synopsis: >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Thu May 16 09:00:07 PDT 2002 >Closed-Date: >Last-Modified: >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 #include #include +#include +#include #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: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message