From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id E80C1385E449 for ; Sat, 16 Mar 2024 01:25:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E80C1385E449 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E80C1385E449 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710552330; cv=none; b=hhHzh+/URdg6MSjGFTLFlDfNzk7u3iH799YtVyI4pxKStRxt9nQgvnEJSuh1uTiWQbnheD3RjONtnWMUDooCbQ23Kkb29BM9EG2vlpbvFszxdlihXNatu9nmyI+B0kXRYJONEnIVseVKsXWb63V7hYZSqx3ZRxj9wtSyrnC/4so= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710552330; c=relaxed/simple; bh=zzgPkiGb/UHeSvZrl6gBvXAPr5GD6AE6BZP1Zc9TMFg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=jrjYxPZKDAL+9VeyGjxAGYeIiwm/w50lvie8x/mtUuZB0lu4XSFi1blRDEO+Ny9qhrkc9WYZBj3AT/cTzJHa0/1/+dXMgc7DJen0s5FI5OzcTc8V2XMxla/+Wf1Y8eTKDY1u/B2gKG/0p3J66ejPsRGZum0qFu/aN9wdz9BcgQw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1710552327; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=OL3Ci5ZEe/PDT++deeNLXsLSB6JiFMFQ3+/o/knoCyw=; b=TrnFMXc5AxdRKeauQXOBOSKAeNVdAgNvDrpf3WYN0/v0MNPVohuWsyX/r8bZS2FwRESG17 IX/oBVh9jyPk0uU4kvqXyc0a6CPtUioa3YOIQuy/f1APv2nVAA4HZSj6zgezE8/+CK44Pz EK+J6DbztPi9n/kAadOcrVAFMuJZdRU= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-290-HDZNnDiPMYOPV5k4Kw-sXw-1; Fri, 15 Mar 2024 21:25:22 -0400 X-MC-Unique: HDZNnDiPMYOPV5k4Kw-sXw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AC6A61C05129; Sat, 16 Mar 2024 01:25:21 +0000 (UTC) Received: from greed.delorie.com (unknown [10.22.8.4]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 53F9E2166B4F; Sat, 16 Mar 2024 01:25:21 +0000 (UTC) Received: from greed.delorie.com.redhat.com (localhost [127.0.0.1]) by greed.delorie.com (8.16.1/8.16.1) with ESMTP id 42G1PCVU097001; Fri, 15 Mar 2024 21:25:12 -0400 From: DJ Delorie To: Adhemerval Zanella Cc: libc-alpha@sourceware.org, goldstein.w.n@gmail.com, amonakov@ispras.ru, hjl.tools@gmail.com Subject: Re: [PATCH v3 1/2] wcsmbs: Add test-wcsstr In-Reply-To: <20240315172346.2484542-2-adhemerval.zanella@linaro.org> (message from Adhemerval Zanella on Fri, 15 Mar 2024 14:23:45 -0300) Date: Fri, 15 Mar 2024 21:25:12 -0400 Message-ID: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: One typo. LGTM otherwise Reviewed-by: DJ Delorie Adhemerval Zanella writes: > diff --git a/string/test-strstr.c b/string/test-strstr.c > index 4115f7d2fd..e628a3478a 100644 > --- a/string/test-strstr.c > +++ b/string/test-strstr.c > @@ -17,21 +17,56 @@ > . */ > > #define TEST_MAIN > -#define TEST_NAME "strstr" > -#include "test-string.h" > +#ifndef WIDE > +# define TEST_NAME "strstr" > +# define TEST_FUNC strstr > +#else > +# define TEST_NAME "wcsstr" > +# define TEST_FUNC wcsstr > +#endif Ok. > +#ifndef WIDE > +# define CHAR char > +# define STRLEN strlen > +# define STRCPY strcpy > +# define MEMCPY memcpy > +# define MEMSET memset > +# define MEMPCPY mempcpy > +# define L(s) s > +#else > +# include > +# define CHAR wchar_t > +# define STRLEN wcslen > +# define STRCPY wcscpy > +# define MEMCPY wmemcpy > +# define MEMSET wmemset > +# define MEMPCPY wmempcpy > +# define L(s) L ## s > +/* The test requires up to 8191 charateres, so allocate at least 32Kb Spelling: "characters" > + (considering 4kb page size). */ > +# define BUF1PAGES 4 > +#endif Ok. > +#include "test-string.h" Ok. > -#define STRSTR c_strstr > -#define libc_hidden_builtin_def(arg) /* nothing */ > -#define __strnlen strnlen > -#include "strstr.c" > +#ifndef WIDE > +# define STRSTR c_strstr > +# define libc_hidden_builtin_def(arg) /* nothing */ > +# define __strnlen strnlen > +# include "strstr.c" > +# define C_IMPL STRSTR > +#else > +# define WCSSTR c_wcsstr > +# include "wcsstr.c" > +# define C_IMPL WCSSTR > +#endif Ok. > /* Naive implementation to verify results. */ > -static char * > -simple_strstr (const char *s1, const char *s2) > +static CHAR * > +simple_strstr (const CHAR *s1, const CHAR *s2) > { > - ssize_t s1len = strlen (s1); > - ssize_t s2len = strlen (s2); > + ssize_t s1len = STRLEN (s1); > + ssize_t s2len = STRLEN (s2); Ok. > @@ -43,29 +78,27 @@ simple_strstr (const char *s1, const char *s2) > if (s1[i + j] != s2[j]) > break; > if (j == s2len) > - return (char *) s1 + i; > + return (CHAR *) s1 + i; > } Ok. > -typedef char *(*proto_t) (const char *, const char *); > - > -IMPL (c_strstr, 0) > -IMPL (strstr, 1) > +typedef CHAR *(*proto_t) (const CHAR *, const CHAR *); > > +IMPL (C_IMPL, 1) > +IMPL (TEST_FUNC, 1) Ok. > static int > -check_result (impl_t *impl, const char *s1, const char *s2, > - char *exp_result) > +check_result (impl_t *impl, const CHAR *s1, const CHAR *s2, > + CHAR *exp_result) > { > - char *result = CALL (impl, s1, s2); > + CHAR *result = CALL (impl, s1, s2); > if (result != exp_result) > { > - error (0, 0, "Wrong result in function %s %s %s", impl->name, > - (result == NULL) ? "(null)" : result, > - (exp_result == NULL) ? "(null)" : exp_result); > + error (0, 0, "Wrong result in function %s %p %p", impl->name, > + result, exp_result); > ret = 1; > return -1; > } Ok. > static void > -do_one_test (impl_t *impl, const char *s1, const char *s2, char *exp_result) > +do_one_test (impl_t *impl, const CHAR *s1, const CHAR *s2, CHAR *exp_result) Ok. > do_test (size_t align1, size_t align2, size_t len1, size_t len2, > int fail) > { > - char *s1 = (char *) (buf1 + align1); > - char *s2 = (char *) (buf2 + align2); > + align1 = align1 * sizeof (CHAR); > + align2 = align2 * sizeof (CHAR); Ok. > - static const char d[] = "1234567890abcdef"; > -#define dl (sizeof (d) - 1) > - char *ss2 = s2; > + CHAR *s1 = (CHAR *) (buf1 + align1); > + CHAR *s2 = (CHAR *) (buf2 + align2); > + > + static const CHAR d[] = L("1234567890abcdef"); > + const size_t dl = STRLEN (d); > + CHAR *ss2 = s2; Ok. > for (size_t l = len2; l > 0; l = l > dl ? l - dl : 0) > { > size_t t = l > dl ? dl : l; > - ss2 = mempcpy (ss2, d, t); > + ss2 = MEMPCPY (ss2, d, t); > } > s2[len2] = '\0'; Ok. > if (fail) > { > - char *ss1 = s1; > + CHAR *ss1 = s1; > for (size_t l = len1; l > 0; l = l > dl ? l - dl : 0) > { > size_t t = l > dl ? dl : l; > - memcpy (ss1, d, t); > + MEMCPY (ss1, d, t); > ++ss1[len2 > 7 ? 7 : len2 - 1]; > ss1 += t; Ok. > { > - memset (s1, '0', len1); > - memcpy (s1 + len1 - len2, s2, len2); > + MEMSET (s1, '0', len1); > + MEMCPY (s1 + len1 - len2, s2, len2); Ok. > static void > check1 (void) > { > - const char s1[] = > - "F_BD_CE_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_88_20_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_A7_20_EF_BF_BD"; > - const char s2[] = "_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD"; > - char *exp_result; > + const CHAR s1[] = > + L("F_BD_CE_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_88_20_EF_BF_BD_EF_BF_BD_EF_BF_BD_C3_A7_20_EF_BF_BD"); > + const CHAR s2[] = L("_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD_EF_BF_BD"); > + CHAR *exp_result; Ok. > @@ -137,30 +172,31 @@ check1 (void) > static void > check2 (void) > { > - const char s1_stack[] = ", enable_static, \0, enable_shared, "; > - const size_t s1_byte_count = 18; > - const char *s2_stack = &(s1_stack[s1_byte_count]); > - const size_t s2_byte_count = 18; > - char *exp_result; > + const CHAR s1_stack[] = L(", enable_static, \0, enable_shared, "); > + const size_t s1_char_count = 18; > + const size_t s1_byte_len = 18 * sizeof (CHAR); > + const CHAR *s2_stack = &(s1_stack[s1_char_count]); > + const size_t s2_byte_len = 18 * sizeof (CHAR); > + CHAR *exp_result; > const size_t page_size_real = getpagesize (); Ok. > /* Haystack at end of page. The following page is protected. */ > - char *s1_page_end = (void *) buf1 + page_size - s1_byte_count; > - strcpy (s1_page_end, s1_stack); > + CHAR *s1_page_end = (void *) buf1 + page_size - s1_byte_len; > + STRCPY (s1_page_end, s1_stack); Ok. > /* Haystack which crosses a page boundary. > Note: page_size is at least 2 * getpagesize. See test_init. */ > - char *s1_page_cross = (void *) buf1 + page_size_real - 8; > - strcpy (s1_page_cross, s1_stack); > + CHAR *s1_page_cross = (void *) buf1 + page_size_real - 8; > + STRCPY (s1_page_cross, s1_stack); Ok. > /* Needle at end of page. The following page is protected. */ > - char *s2_page_end = (void *) buf2 + page_size - s2_byte_count; > - strcpy (s2_page_end, s2_stack); > + CHAR *s2_page_end = (void *) buf2 + page_size - s2_byte_len; > + STRCPY (s2_page_end, s2_stack); Ok. > /* Needle which crosses a page boundary. > Note: page_size is at least 2 * getpagesize. See test_init. */ > - char *s2_page_cross = (void *) buf2 + page_size_real - 8; > - strcpy (s2_page_cross, s2_stack); > + CHAR *s2_page_cross = (void *) buf2 + page_size_real - 8; > + STRCPY (s2_page_cross, s2_stack); Ok. > @@ -184,8 +220,8 @@ check2 (void) > static void > pr23637 (void) > { > - char *h = (char*) buf1; > - char *n = (char*) buf2; > + CHAR *h = (CHAR*) buf1; > + CHAR *n = (CHAR*) buf2; Ok. > @@ -200,7 +236,7 @@ pr23637 (void) > /* Ensure we don't match at the first 'x'. */ > h[0] = 'x'; > > - char *exp_result = simple_strstr (h, n); > + CHAR *exp_result = simple_strstr (h, n); Ok. > diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile > test-wcspbrk \ > test-wcsrchr \ > test-wcsspn \ > + test-wcsstr \ Ok. > diff --git a/wcsmbs/test-wcsstr.c b/wcsmbs/test-wcsstr.c > +/* Test wcsstr function. > + Copyright (C) 2024 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#define WIDE 1 > +#include Ok. > diff --git a/wcsmbs/wcsstr.c b/wcsmbs/wcsstr.c > index 78f1cc9ce0..ec5687e8d7 100644 > --- a/wcsmbs/wcsstr.c > +++ b/wcsmbs/wcsstr.c > @@ -28,8 +28,12 @@ > > #include > > +#ifndef WCSSTR > +# define WCSSTR wcsstr > +#endif > + Ok. > wchar_t * > -wcsstr (const wchar_t *haystack, const wchar_t *needle) > +WCSSTR (const wchar_t *haystack, const wchar_t *needle) Ok. > @@ -92,6 +96,8 @@ foundneedle: > ret0: > return NULL; > } > +#ifndef WCSSTR > /* This alias is for backward compatibility with drafts of the ISO C > standard. Unfortunately the Unix(TM) standard requires this name. */ > weak_alias (wcsstr, wcswcs) > +#endif Ok.