From nobody Fri Nov 27 10:50:21 1998 X-From-Line: owner-FreeBSD-tech-jp@jp.freebsd.org Fri Nov 27 00:22:42 1998 Return-Path: Received: from jaz.jp.freebsd.org (jaz.jp.freebsd.org [133.11.156.38]) by jazz.snu.ac.kr (8.9.0/8.9.0) with ESMTP id AAA14362 for ; Fri, 27 Nov 1998 00:22:41 +0900 (KST) Received: (from daemon@localhost) by jaz.jp.freebsd.org (8.9.1+3.1W/8.7.3/smtpfeed 0.87) id AAA10105; Fri, 27 Nov 1998 00:22:56 +0900 (JST) (envelope-from owner-FreeBSD-tech-jp@jp.FreeBSD.org) Received: from mana.s.notwork.org (tok135.airnet.ne.jp [210.159.88.135]) by jaz.jp.freebsd.org (8.9.1+3.1W/8.7.3) with SMTP id AAA10095 for ; Fri, 27 Nov 1998 00:22:52 +0900 (JST) (envelope-from mrt@notwork.org) Received: (qmail 23526 invoked from network); 26 Nov 1998 15:22:27 -0000 Received: from kotonoha.s.notwork.org (192.168.1.1) by mana.s.notwork.org with SMTP; 26 Nov 1998 15:22:27 -0000 To: FreeBSD-tech-jp@jp.freebsd.org X-cite: xcite 1.20 References: <199811261111.UAA00535@lavender.yy.cs.keio.ac.jp> MIME-Version: 1.0 (generated by WEMI 1.11.1 - "Shimizu") Content-Type: text/plain; charset=ISO-2022-JP From: Murata Shuuichirou Date: 27 Nov 1998 00:22:52 +0900 In-Reply-To: <199811261111.UAA00535@lavender.yy.cs.keio.ac.jp> (MIHIRA Yoshiro's message of "Thu, 26 Nov 1998 20:11:59 +0900 (JST)") Message-ID: <873e76xyur.fsf@kotonoha.s.notwork.org> User-Agent: T-gnus/6.10.040 (based on Pterodactyl Gnus 0.54) WEMI/1.11.1 (Shimizu) FLIM/1.12.0 (Amagatsuji) MULE XEmacs/21.2 (Aglaia) (i386-unknown-freebsd3.0) Reply-To: FreeBSD-tech-jp@jp.freebsd.org Precedence: list X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+981115 X-Sequence: FreeBSD-tech-jp 1919 Subject: [FreeBSD-tech-jp 1919] Re: ansi.c patch for ja-netscape Errors-To: owner-FreeBSD-tech-jp@jp.freebsd.org Sender: owner-FreeBSD-tech-jp@jp.freebsd.org X-Originator: mrt@kotonoha.s.notwork.org Status: RO X-Status: Lines: 343 Xref: jazz.snu.ac.kr list.freebsd.tech-jp:1166 In message <199811261111.UAA00535@lavender.yy.cs.keio.ac.jp>, `sanpei@sanpei.org' wrote: > Netscape が不安定になる問題ですが. そういえば、locale に手をいれたのを外に出すのをすっかり忘れてい ました。このメイルにつける diff は 1. mbstowcs(), wcstombs() あたりがまともっぽく動く 2. netscape navigator/communicator が安定する気がする の*どちらか*を実現するものです。デフォルトでは 2 になっています が、マクロ NETSCAPE_BUG を 0 に define しておくと 1 の動作にな ります。diff を適用したのちに、libxpg4 と libc を作りなおしてく ださい。 -current からの diff になっていますので、-stable にはそのままで はあたりません。ansi.c だけあらかじめ -current からもってきてお けば大丈夫だと思います。 -- むらたしゅういちろう Index: locale/ansi.c =================================================================== RCS file: /usr/home/cvs/src/lib/libc/locale/ansi.c,v retrieving revision 1.3 diff -u -r1.3 ansi.c --- ansi.c 1998/10/25 05:06:42 1.3 +++ ansi.c 1998/11/26 14:59:26 @@ -43,6 +43,10 @@ #include #include +#ifndef NETSCAPE_BUG +#define NETSCAPE_BUG 1 +#endif + int mblen(s, n) const char *s; @@ -53,8 +57,10 @@ if (s == 0 || *s == 0) return (0); /* No support for state dependent encodings. */ - if (sgetrune(s, n, &e) == _INVALID_RUNE) - return (s - e); + if (sgetrune(s, n > MB_CUR_MAX? MB_CUR_MAX: n, &e) == _INVALID_RUNE) { + /* errno = EILSEQ; */ + return (-1); + } return (e - s); } @@ -70,8 +76,10 @@ if (s == 0 || *s == 0) return (0); /* No support for state dependent encodings. */ - if ((r = sgetrune(s, n, &e)) == _INVALID_RUNE) - return (s - e); + if ((r = sgetrune(s, n > MB_CUR_MAX? MB_CUR_MAX: n, &e)) == _INVALID_RUNE) { + /* errno = EILSEQ; */ + return (-1); + } if (pwc) *pwc = r; return (e - s); @@ -103,16 +111,25 @@ size_t n; { char const *e; + rune_t r; int cnt = 0; - if (!pwcs || !s) + if (!s) return (-1); +#if NETSCAPE_BUG while (n-- > 0) { - *pwcs = sgetrune(s, MB_LEN_MAX, &e); - if (*pwcs == _INVALID_RUNE) +#else + while (n-- > 0 || !pwcs) { +#endif + r = sgetrune(s, MB_CUR_MAX, &e); + if (r == _INVALID_RUNE) { + /* errno = EILSEQ; */ return (-1); - if (*pwcs++ == 0) + } + if (pwcs) + *pwcs++ = r; + if (r == 0) break; s = e; ++cnt; @@ -127,25 +144,47 @@ size_t n; { char *e; - int cnt, nb; + int cnt = 0; - if (!pwcs || !s || n > INT_MAX) + if (!pwcs) return (-1); + +#if NETSCAPE_BUG + if (s && n >= 3) + s[2] = 0; + if (s && n >= 4) + s[3] = 0; + if (*pwcs & ~0xffff) { + fprintf(stderr, "Oops! netscape bug is encountered.\n"); + fprintf(stderr, "wcs %x\n", *pwcs); + strncpy(s, (char *)pwcs, n); + return s[n - 1]? n: strlen(s); + } +#endif - nb = n; - cnt = 0; - while (nb > 0) { +#if NETSCAPE_BUG + while (n > 0) { +#else + while (n > 0 || !s) { +#endif if (*pwcs == 0) { - *s = 0; + if (s) + *s = 0; break; } - if (!sputrune(*pwcs++, s, nb, &e)) + if (!sputrune(*pwcs++, s, s? n: MB_CUR_MAX, &e)) { + /* errno = EILSEQ; */ return (-1); /* encoding error */ - if (!e) /* too long */ + } + if (!e) { /* too long */ + if (s) + *s = 0; return (cnt); + } cnt += e - s; - nb -= e - s; - s = e; + n -= e - s; + if (s) + s = e; } return (cnt); } Index: locale/big5.c =================================================================== RCS file: /usr/home/cvs/src/lib/libc/locale/big5.c,v retrieving revision 1.2 diff -u -r1.2 big5.c --- big5.c 1998/08/15 20:53:34 1.2 +++ big5.c 1998/11/23 12:25:45 @@ -75,14 +75,14 @@ char const **result; { rune_t rune = 0; - int len; + size_t len; if (n < 1 || (len = _big5_check(*string)) > n) { if (result) *result = string; return (_INVALID_RUNE); } - while (len-- >= 0) + while (len-- > 0) rune = (rune << 8) | ((u_int)(*string++) & 0xff); if (result) *result = string + len; @@ -95,26 +95,22 @@ char *string, **result; size_t n; { - if (c & 0x8000) { - if (n >= 2) { - string[0] = (c >> 8) & 0xff; - string[1] = c & 0xff; - if (result) - *result = string + 2; - return (2); - } - } - else { - if (n >= 1) { - *string = c & 0xff; - if (result) - *result = string + 1; - return (1); - } + size_t i, len; + + if (c & 0x8000) + i = len = 2; + else + i = len =1; + if (n >= len) { + if (string) + while (i-- > 0) + *string++ = (c >> (i << 3)) & 0xff; + if (result) + *result = string? string: (char *)len; + return len; } if (result) - *result = string; - return (0); - + *result = NULL; + return len; } #endif /* XPG4 */ Index: locale/euc.c =================================================================== RCS file: /usr/home/cvs/src/lib/libc/locale/euc.c,v retrieving revision 1.3 diff -u -r1.3 euc.c --- euc.c 1998/01/14 08:14:56 1.3 +++ euc.c 1998/11/23 17:26:37 @@ -169,55 +169,61 @@ { rune_t m = c & CEI->mask; rune_t nm = c & ~m; - int i, len; + size_t i, len; if (m == CEI->bits[1]) { CodeSet1: /* Codeset 1: The first byte must have 0x80 in it. */ i = len = CEI->count[1]; - if (n >= len) { + if (n < len) { if (result) - *result = string + len; + *result = NULL; + return (len); + } + if (string) while (i-- > 0) - *string++ = (nm >> (i << 3)) | 0x80; - } else + *string++ = ((nm >> (i << 3)) & 0xff) | 0x80; + } else if (m == CEI->bits[0]) { + i = len = CEI->count[0]; + if (n < len) { if (result) - *result = (char *) 0; + *result = NULL; + return (len); + } + if (string) + while (i-- > 0) + *string++ = (nm >> (i << 3)) & 0xff; } else { - if (m == CEI->bits[0]) { - i = len = CEI->count[0]; + if (m == CEI->bits[2]) { + i = len = CEI->count[2]; if (n < len) { if (result) *result = NULL; return (len); } - } else - if (m == CEI->bits[2]) { - i = len = CEI->count[2]; - if (n < len) { - if (result) - *result = NULL; - return (len); - } + if (string) { *string++ = _SS2; --i; - } else - if (m == CEI->bits[3]) { - i = len = CEI->count[3]; - if (n < len) { - if (result) - *result = NULL; - return (len); - } - *string++ = _SS3; - --i; - } else - goto CodeSet1; /* Bletch */ - while (i-- > 0) - *string++ = (nm >> (i << 3)) & 0xff; - if (result) - *result = string; + } + } else if (m == CEI->bits[3]) { + i = len = CEI->count[3]; + if (n < len) { + if (result) + *result = NULL; + return (len); + } + if (string) { + *string++ = _SS3; + --i; + } + } else + goto CodeSet1; /* Bletch */ + if (string) + while (i-- > 0) + *string++ = ((nm >> (i << 3)) & 0xff) | 0x80; } + if (result) + *result = string? string: (char *)len; return (len); } #endif /* XPG4 */ Index: locale/mskanji.c =================================================================== RCS file: /usr/home/cvs/src/lib/libc/locale/mskanji.c,v retrieving revision 1.2 diff -u -r1.2 mskanji.c --- mskanji.c 1997/09/25 23:20:26 1.2 +++ mskanji.c 1998/11/22 17:12:05 @@ -98,9 +98,10 @@ if ( result ) *result = (char *) 0; } else { if ( result ) *result = string + len; - for ( i = len; i-- > 0; ) { - *( string++ ) = c >> ( i << 3 ); - } + if (string) + for ( i = len; i-- > 0; ) { + *( string++ ) = c >> ( i << 3 ); + } } return len; }