From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/11156 Path: news.gmane.org!.POSTED!not-for-mail From: He X 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 21:48:41 +0800 Message-ID: References: <20170318123335.GO1693@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a11478dd0838964054b018e5f X-Trace: blaine.gmane.org 1489844958 30872 195.159.176.226 (18 Mar 2017 13:49:18 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 18 Mar 2017 13:49:18 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-11171-gllmg-musl=m.gmane.org@lists.openwall.com Sat Mar 18 14:49:14 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 1cpEjF-00078J-L7 for gllmg-musl@m.gmane.org; Sat, 18 Mar 2017 14:49:09 +0100 Original-Received: (qmail 21969 invoked by uid 550); 18 Mar 2017 13:49:14 -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 21948 invoked from network); 18 Mar 2017 13:49:13 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=c6AmJ4SEUaarlT7TKXZQnNL4V9uocTv7iiqnGlf4gIE=; b=KvUNk/N1xKjmEVCSC/4jS7AOTJItKaNfinU2qvZwRWkCtw9EGHRXOKL6f3l65RhORl Gve4QDzFp2F3uiqsoSpUu1tWhaF/Dj3B1DssigslDgHBYlkzH9WRCA06M3Ck/WaLV8NP RH/vQa4CwhXQx1HriIn8eYc1T1XHGUK9c9oMNcj8nOtee6yTvs4cCFUTMvfzOOfwVGhJ fK4lNlsd1fpN7GBDlrPMZ7oqTfeUrI4UD9bJQL962r6y7EfOwl0JQBl95nqioD/i4S6b OuZp7ujaRF1ibJHPdR/liBPyqZzJX3q80wJnjY5M7N8mQY2mhl7o4L0kr4MrsJh7/01Q IwZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=c6AmJ4SEUaarlT7TKXZQnNL4V9uocTv7iiqnGlf4gIE=; b=qpeDVOyC+b2fmSvU/uWIs88KrXH9rWVDmRMXntpBjcrYT6edgKLvWve7ZouHfQqemk sZwKZD/6T8SXEMnFh0PPtlqCxUap0wwUDJHXMwGMnP3Twf2+SPiQtx0CcUvdFcBwcOqR xGv9OeuULskPR4wlMXjJ/mF26H/FCtBUuJMRVuDNWkP6H7MOBvVAXFEFDyXwV978Srhv PNGLJIRYxskGHrWmLnFMX1mg4yiGw03QCIsiYP0rjyHZU64wOSw+eTVXP3sTvH6BFOm5 WN0UfQOuwCNgjfgMHFcBnUezs32Hb7O30HV9NB1/Hb1fD8w0JMtxgQ7YRRTbdpJCI+lL nrnQ== X-Gm-Message-State: AFeK/H3o0mikKNBwMe5/C1xdpz5XRTRiksaDrluxWrtv178weBcAF1a+cBnNMiKNpmuW5lBQSZfK6H5uaeFumw== X-Received: by 10.31.107.93 with SMTP id g90mr8181756vkc.155.1489844941573; Sat, 18 Mar 2017 06:49:01 -0700 (PDT) In-Reply-To: Xref: news.gmane.org gmane.linux.lib.musl.general:11156 Archived-At: --001a11478dd0838964054b018e5f Content-Type: multipart/alternative; boundary=001a11478dd083895e054b018e5d --001a11478dd083895e054b018e5d Content-Type: text/plain; charset=UTF-8 oops, i missed UNLOCK(lock). 2017-03-18 21:36 GMT+08:00 He X : > tested: > [xhe@xhe-PC locale]$ ./a.out > C > zh_CN.UTF-8 > zh_CN.UTF-8 > [xhe@xhe-PC locale]$ cat test.c > #include > int main() { > printf("%s\n", setlocale(LC_ALL, NULL)); > printf("%s\n", setlocale(LC_ALL, "")); > printf("%s\n", setlocale(LC_ALL, NULL)); > } > > 2017-03-18 20:33 GMT+08:00 Rich Felker : > >> 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 >> > > --001a11478dd083895e054b018e5d Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
oops, i missed UNLOCK(lock).

2017-03-18 21:36 GMT+08:00 He X <xw8= 97002528@gmail.com>:
tested:
[xhe@xhe-PC locale]$ ./a.out=C2=A0
C<= /div>
zh_CN.UTF-8
zh_CN.UTF-8
[xhe@xhe-PC locale]$ = cat test.c=C2=A0
#include <locale.h>
int main() {=
printf("%s\n", setlocale(LC_ALL= , NULL));
printf("%s\n", setloca= le(LC_ALL, ""));
printf("%s= \n", setlocale(LC_ALL, NULL));
}

2017-03-18 20:33 GMT+08:00 Rich Felker <<= a href=3D"mailto:dalias@libc.org" target=3D"_blank">dalias@libc.org>= :
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=C2=A0 =C2=A0 =C2=A0= =C2=A0 2017-03-17 17:49:15.767952411 +0000
> +++ musl-1.1.16/src/locale/setlocale.c=C2=A0 =C2=A0 =C2=A0 =C2=A0= 2017-03-17 17:49:15.767952411 +0000
> @@ -48,16 +48,33 @@
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0}
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0char *s =3D buf;=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (i=3D0; i<LC_A= LL; i++) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const struct __locale= _map *flm =3D
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0libc.global_locale.cat[0];
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const char *fpart =3D= flm ? flm->name : "C";
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size_t l =3D strlen(f= part);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memcpy(s, fpart, l);<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s[l] =3D 0;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0i=3D1;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0do {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0const struct __locale_map *lm =3D
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libc.global_locale.cat[i];=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0const char *part =3D lm ? lm->name : "C";
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0size_t l =3D strlen(part);
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0memcpy(s, part, l);
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0s[l] =3D ';';
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0s +=3D l+1;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0if (strcmp(s, part)) break;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0i++;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} while (i<LC_ALL)= ;
> +
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (i !=3D LC_ALL) {<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0for (i=3D0; i<LC_ALL; i++) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const struct __locale_map *lm =3D
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libc.glo= bal_locale.cat[i];
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const char *part =3D lm ? lm->name : = "C";
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size_t l =3D strlen(part);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memcpy(s, part, l);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s[l] =3D ';';
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s +=3D l+1;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0}
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0*--s =3D 0;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*--s =3D 0;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0UNLOCK(lock); >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return buf;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0}

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


--001a11478dd083895e054b018e5d-- --001a11478dd0838964054b018e5f Content-Type: text/x-patch; charset=US-ASCII; name="setlocale.patch" Content-Disposition: attachment; filename="setlocale.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j0fb71721 LS0tIG11c2wtMS4xLjE2L3NyYy9sb2NhbGUvc2V0bG9jYWxlLmMJMjAxNy0wMy0xNyAxNzo0OTox NS43Njc5NTI0MTEgKzAwMDAKKysrIG11c2wtMS4xLjE2L3NyYy9sb2NhbGUvc2V0bG9jYWxlLmMJ MjAxNy0wMy0xNyAxNzo0OToxNS43Njc5NTI0MTEgKzAwMDAKQEAgLTQ4LDE2ICs0OCwzMSBAQAog CQkJfQogCQl9CiAJCWNoYXIgKnMgPSBidWY7Ci0JCWZvciAoaT0wOyBpPExDX0FMTDsgaSsrKSB7 CisgCQljb25zdCBzdHJ1Y3QgX19sb2NhbGVfbWFwICpmbG0gPQorIAkJCWxpYmMuZ2xvYmFsX2xv Y2FsZS5jYXRbMF07CisgCQlpPTE7CisgCQlkbyB7CiAJCQljb25zdCBzdHJ1Y3QgX19sb2NhbGVf bWFwICpsbSA9CiAJCQkJbGliYy5nbG9iYWxfbG9jYWxlLmNhdFtpXTsKLQkJCWNvbnN0IGNoYXIg KnBhcnQgPSBsbSA/IGxtLT5uYW1lIDogIkMiOwotCQkJc2l6ZV90IGwgPSBzdHJsZW4ocGFydCk7 Ci0JCQltZW1jcHkocywgcGFydCwgbCk7Ci0JCQlzW2xdID0gJzsnOwotCQkJcyArPSBsKzE7Cisg CQkJaWYgKGxtICE9IGZsbSkgYnJlYWs7CisgCQkJaSsrOworIAkJfSB3aGlsZSAoaTxMQ19BTEwp OworIAorIAkJaWYgKGkgPT0gTENfQUxMKSB7CisgCQkJVU5MT0NLKGxvY2spOworCQkJcmV0dXJu IGZsbSA/IGZsbS0+bmFtZSA6ICJDIjsKKwkJfSBlbHNlIHsKKyAJCQlmb3IgKGk9MDsgaTxMQ19B TEw7IGkrKykgeworIAkJCQljb25zdCBzdHJ1Y3QgX19sb2NhbGVfbWFwICpsbSA9CisgCQkJCQls aWJjLmdsb2JhbF9sb2NhbGUuY2F0W2ldOworIAkJCQljb25zdCBjaGFyICpwYXJ0ID0gbG0gPyBs bS0+bmFtZSA6ICJDIjsKKyAJCQkJc2l6ZV90IGwgPSBzdHJsZW4ocGFydCk7CisgCQkJCW1lbWNw eShzLCBwYXJ0LCBsKTsKKyAJCQkJc1tsXSA9ICc7JzsKKyAJCQkJcyArPSBsKzE7CisgCQkJfQor IAkJCSotLXMgPSAwOwogCQl9Ci0JCSotLXMgPSAwOwogCQlVTkxPQ0sobG9jayk7CiAJCXJldHVy biBidWY7CiAJfQo= --001a11478dd0838964054b018e5f--