Date: Thu, 5 Dec 1996 02:45:20 -0800 (PST) From: iwasaki@pc.jaring.my To: freebsd-gnats-submit@freebsd.org Subject: bin/2161: Bugs in mklocale(1) make isgraph(3) confused in the Japanese EUC locale!! Message-ID: <199612051045.CAA29752@freefall.freebsd.org> Resent-Message-ID: <199612051050.CAA29915@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 2161
>Category: bin
>Synopsis: Bugs in mklocale(1) make isgraph(3) confused in the Japanese EUC locale!!
>Confidential: no
>Severity: critical
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Thu Dec 5 02:50:01 PST 1996
>Last-Modified:
>Originator: Mitsuru IWASAKI
>Organization:
AISDEL; SIRIM
>Release: 2.1.6 and 3.0-current
>Environment:
N/A
>Description:
NOTE: This problem is relating with I18N col(1) for
the Japanese manual pages project which is aiming at
2.2-RELEASE (as the xperimnt).
We would like this patch applied to 2.2!!
Bugs in mklocale(1) can make isgraph(3) confused
in the Japanese EUC locale.
If we have a correct /usr/share/locale/ja_JP.EUC/LC_CTYPE,
we can see messages from following test program, "OK,OK,OK...",
but unfortunately our FreeBSD have bugs in mklocale(1)
(which is derived from 4.4BSD-Lite).
The bugs can isgraph(3) to be confused during handling
the Japanese scripts because of corrupted ja_JP.EUC/LC_CTYPE.
>How-To-Repeat:
To compile and execute the following test program.
% cc testeuc.c -o testeuc -lxpg4
% testeuc (Oops!, "NG" messages for some characters.)
----CUT----CUT----CUT----CUT----CUT----CUT----CUT----CUT----
#include <stdio.h>
#include <locale.h>
#include <rune.h>
#include <limits.h>
testeuc(string)
char const *string;
{
char const *result;
rune_t ch;
printf("Japanese characters [%s]\n", string);
while ((ch = sgetrune(string, MB_LEN_MAX, &result))) {
string = result == string ? string + 1 : result;
/*
all of the characters in this test program should be
printing characters.
*/
if (isgraph(ch)) {
printf("OK\n");
} else {
/* The Japanese LOCALE_CTYPE is corrupted!! */
printf("NG\n");
}
}
}
void main()
{
/* These are printing characters, so should be OK (cf. man euc). */
/* But, some of the characters cannot be handled correctly. */
/* NOTE: each samples has four characters in the Japanese EUC locale. */
static char *euc_codeset_1_ok = "AZ09\0";
static char *euc_codeset_2_ok = "\xa4\xa2\xa5\xa2\xb0\xa1\xa1\xbc\0";
static char *euc_codeset_2_ng = "\xa1\xa2\xa1\xa3\xa3\xc1\xa3\xda\0";
(void) setlocale(LC_CTYPE, "ja_JP.EUC");
printf("euc_codeset_1_ok\n"); testeuc(euc_codeset_1_ok);
printf("euc_codeset_2_ok\n"); testeuc(euc_codeset_2_ok);
printf("euc_codeset_2_ng\n"); testeuc(euc_codeset_2_ng);
}
>Fix:
To solve this problem, after applying following patch to
/usr/src/usr.bin/mklocale/yacc.y, and
type ''make cleandir obj depend all'' in /usr/src/usr.bin/mklocale, then
``make install'' to re-install the new LC_CTYPE for ja_JP.EUC
created by the fixed mklocale(1).
To confirm, please try testeuc again!
----CUT----CUT----CUT----CUT----CUT----CUT----CUT----CUT----
--- yacc.y.orig.1204 Thu Dec 5 00:42:55 1996
+++ yacc.y Thu Dec 5 00:44:11 1996
@@ -479,7 +479,7 @@
for (i = r->max+1; i <= list->max; ++i)
r->types[i - r->min] = flag;
}
- r->max = r->max;
+ r->max = list->max;
free(list);
}
@@ -661,7 +661,7 @@
list->types[x] = htonl(list->types[x]);
if (!list->map) {
- if (fwrite((char *)&list->types,
+ if (fwrite((char *)list->types,
(list->max - list->min + 1) * sizeof(unsigned long),
1, fp) != 1) {
perror(locale_file);
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199612051045.CAA29752>
