From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/11154 Path: news.gmane.org!.POSTED!not-for-mail From: Rich Felker Newsgroups: gmane.linux.lib.musl.general Subject: Re: [setlocale]: return only one copy if all six parts of locale are same Date: Sat, 18 Mar 2017 08:33:35 -0400 Message-ID: <20170318123335.GO1693@brightrain.aerifal.cx> References: Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: blaine.gmane.org 1489840429 14910 195.159.176.226 (18 Mar 2017 12:33:49 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 18 Mar 2017 12:33:49 +0000 (UTC) User-Agent: Mutt/1.5.21 (2010-09-15) To: musl@lists.openwall.com Original-X-From: musl-return-11169-gllmg-musl=m.gmane.org@lists.openwall.com Sat Mar 18 13:33:46 2017 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1cpDYF-00037o-1c for gllmg-musl@m.gmane.org; Sat, 18 Mar 2017 13:33:43 +0100 Original-Received: (qmail 30488 invoked by uid 550); 18 Mar 2017 12:33:47 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 30467 invoked from network); 18 Mar 2017 12:33:47 -0000 Content-Disposition: inline In-Reply-To: Original-Sender: Rich Felker Xref: news.gmane.org gmane.linux.lib.musl.general:11154 Archived-At: On Sat, Mar 18, 2017 at 07:37:57AM +0000, He X wrote: > As i suggest on IRC, here's the patch. > --- musl-1.1.16/src/locale/setlocale.c 2017-03-17 17:49:15.767952411 +0000 > +++ musl-1.1.16/src/locale/setlocale.c 2017-03-17 17:49:15.767952411 +0000 > @@ -48,16 +48,33 @@ > } > } > char *s = buf; > - for (i=0; i + const struct __locale_map *flm = > + libc.global_locale.cat[0]; > + const char *fpart = flm ? flm->name : "C"; > + size_t l = strlen(fpart); > + memcpy(s, fpart, l); > + s[l] = 0; > + i=1; > + do { > const struct __locale_map *lm = > libc.global_locale.cat[i]; > const char *part = lm ? lm->name : "C"; > - size_t l = strlen(part); > - memcpy(s, part, l); > - s[l] = ';'; > - s += l+1; > + if (strcmp(s, part)) break; > + i++; > + } while (i + > + if (i != LC_ALL) { > + for (i=0; i + const struct __locale_map *lm = > + libc.global_locale.cat[i]; > + const char *part = lm ? lm->name : "C"; > + size_t l = strlen(part); > + memcpy(s, part, l); > + s[l] = ';'; > + s += l+1; > + } > + *--s = 0; > } > - *--s = 0; > UNLOCK(lock); > return buf; > } I think the results of this patch can be achieved much more simply. Just compare lm pointers (rather than string contents) for equality at each iteration in the current loop, counting how many were equal to libc.global_locale.cat[0]. If that number equals LC_ALL, return libc.global_locale.cat[0]->name (or "C" if the lm is null) rather than buf. Rich