From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 21556 invoked from network); 13 Jul 2021 12:03:40 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 13 Jul 2021 12:03:40 -0000 Received: (qmail 32524 invoked by uid 550); 13 Jul 2021 12:03:37 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 32494 invoked from network); 13 Jul 2021 12:03:36 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nexgo.de; s=vfde-smtpout-mb-15sep; t=1626177805; bh=0bgfUHwhspT5SHXx0MNxuR6Yzw9H0Sww4yy4ro8JoqQ=; h=From:To:Subject:Date; b=AjKtatMXMYdJePfyxfInWRgMlP98x8IIqfsYZy/7lSeAeYEE7RjD+7tf2MLRalaab cZ/ra2lbVXGg8RhNAEG6AYyZNf9prHxbdBjwRDbhIrKorZIv1ENEhvex5HGVmj/Dr1 NCh9nOCi4bV8ZFtxZR8wv6QvfMZYEUl2ho8DPKWE= Message-ID: <0F84CB3415BB437FBD48B8B81795064E@H270> From: "Stefan Kanthak" To: Date: Tue, 13 Jul 2021 14:02:06 +0200 Organization: Me, myself & IT MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6002.18197 X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7601.24158 X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate: clean X-purgate-size: 4111 X-purgate-ID: 155817::1626177805-0000752D-85D011CE/0/0 Subject: [musl] Changes for strcspn(), strspn(), strtok() and strtok_r() #include #define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) -size_t strcspn(const char *s, const char *c) +size_t strcspn(const char *restrict s, const char *c) { - const char *a = s; + const char *a; - size_t byteset[32/sizeof(size_t)]; + size_t byteset[32/sizeof(size_t)] = { 0 }; - if (!c[0] || !c[1]) return __strchrnul(s, *c)-a; + if (!c[0] || !c[1]) return __strchrnul(a=s, *c)-a; - memset(byteset, 0, sizeof byteset); for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); - for (; *s && !BITOP(byteset, *(unsigned char *)s, &); s++); - return s-a; + for (a=s; *a && !BITOP(byteset, *(unsigned char *)a, &); a++); + return a-s; } After this change, musl's favorite compiler (GCC) will generate code like the following (here for x86-64), just like the code it already generates for strspn(), where the initialization of byteset[] is NOT done via memset(): strcspn: ... xor %eax, %eax movq %rax, byteset(%rsp) movq %rax, byteset+8(%rsp) movq %rax, byteset+16(%rsp) movq %rax, byteset+24(%rsp) ... #include #define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) -size_t strspn(const char *s, const char *c) +size_t strspn(const char *restrict s, const char *c) { - const char *a = s; + const char *a; size_t byteset[32/sizeof(size_t)] = { 0 }; if (!c[0]) return 0; if (!c[1]) { - for (; *s == *c; s++); - return s-a; + for (a=s; *a == *c; a++); + return a-s; } for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); - for (; *s && BITOP(byteset, *(unsigned char *)s, &); s++); - return s-a; + for (a=s; *a && BITOP(byteset, *(unsigned char *)a, &); a++); + return a-s; } #include char *strtok(char *restrict s, const char *restrict sep) { static char *p; + return strtok_r(s, sep, &p); - if (!s && !(s = p)) return NULL; - s += strspn(s, sep); - if (!*s) return p = 0; - p = s + strcspn(s, sep); - if (*p) *p++ = 0; - else p = 0; - return s; } #include char *strtok_r(char *restrict s, const char *restrict sep, char **restrict p) { if (!s && !(s = *p)) return NULL; s += strspn(s, sep); - if (!*s) return *p = 0; + if (!*s) return *p = NULL; *p = s + strcspn(s, sep); if (**p) *(*p)++ = 0; - else *p = 0; + else *p = NULL; return s; } If you want to go a step further, avoid to build the same byteset twice: #include char *strtok_r(char *restrict s, const char *restrict sep, char **restrict p) { + size_t byteset[32/sizeof(size_t)] = { 0 }; + if (!s && !(s = *p)) return NULL; + if (!*s) return *p = NULL; + if (!*sep) return *p = NULL, *s; - s += strspn(s, sep); + for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); + for (; *s && BITOP(byteset, *(unsigned char *)s, &); s++); - if (!*s) return *p = 0; + if (!*s) return *p = NULL; - *p = s + strcspn(s, sep); - if (**p) *(*p)++ = 0; - else *p = 0; - return s; + sep = s; + for (; *s && !BITOP(byteset, *(unsigned char *)s, &); s++); + if (*s) *s++ = 0; + else *s = NULL; + *p = s; + return sep; } Stefan