From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6483 invoked by alias); 17 May 2002 17:16:03 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 6457 invoked by uid 71); 17 May 2002 17:16:02 -0000 Resent-Date: 17 May 2002 17:16:02 -0000 Resent-Message-ID: <20020517171602.6456.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-To: nobody@gcc.gnu.org Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, dale@peakall.net Received:(qmail 990 invoked by uid 61); 17 May 2002 17:12:06 -0000 Message-Id:<20020517171206.988.qmail@sources.redhat.com> Date: Fri, 17 May 2002 10:16:00 -0000 From: dale@peakall.net Reply-To: dale@peakall.net To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version:gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: libstdc++/6701: do_narrow on range is fubar X-SW-Source: 2002-05/txt/msg00513.txt.bz2 List-Id: >Number: 6701 >Category: libstdc++ >Synopsis: do_narrow on range is fubar >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri May 17 10:16:00 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Dale Peakall >Release: gcc 3.1 20020510 (prerelease) >Organization: >Environment: solaris 8 >Description: The implementation of do_narrow in ctype.cc for a range: 1) always changes the first character to the default char 2) doesn't narrow the whole string if a non-ascii char is found 22.2.1.1.2 para 13 of the C++ standard states: The second form [range form] transforms each character *p in the range [low, high), placing the result (or dfault if no simple transformation is readily available) in dest[p-low]. >How-To-Repeat: std::wstring wide(L"wibble"); std::vector narrow_chars(wide.length() + 1); std::locale loc; std::use_facet >(loc).narrow( &wide[0], &wide[wide.length()], '?', &narrow_chars[0]); >Fix: const wchar_t* ctype:: do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, char* __dest) const { size_t __offset = 0; for(;;) { const wchar_t* __start = __lo + __offset; size_t __len = __hi - __start; mbstate_t __state; memset(static_cast(&__state), 0, sizeof(mbstate_t)); size_t __conv = wcsrtombs(__dest + __offset, &__start, __len, &__state); if(__conv != __len && __start != 0) { __offset = __start - __lo; __dest[__offset++] = __dfault; } else break; } return __hi; } >Release-Note: >Audit-Trail: >Unformatted: