From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x233.google.com (mail-oi1-x233.google.com [IPv6:2607:f8b0:4864:20::233]) by sourceware.org (Postfix) with ESMTPS id 5659C3858D33 for ; Thu, 16 Feb 2023 19:29:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5659C3858D33 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-oi1-x233.google.com with SMTP id dt8so2761602oib.0 for ; Thu, 16 Feb 2023 11:29:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=EEApzmKOJfhzGYuHNBFTvghjh0rdodLPotu2jb4hOls=; b=UWLxQkPCtZVDUUeMmnbYM9o5zJx9RWTsE0ziUI6yMJamKZhVWex5dzoZSTY4pjoS53 /OteMPmScrID5fnpb8328aowhjMJSg9mhBdNaH6CB8CQ4g43V+oWmNvKWZ2pQ5eKY2BZ oGjxQIBFOrUX0CKd8WWnD3m1MwVFsQpZYiUw4eIktDtUtpD3ly7PDGSDzxZrAoBYLLb2 7zF1zwpLLdh5zWINekJpl6yQYLOOg0E9pd5ca/qj89r8xE7ul139vKR259i+UafHcPID rZYsVqycE9URn1+ZBOaZ+JFlB0LAvw2URtqLpHD/zV05HRUKI7zcJ4ddqj5E7ZkpgeGy GCYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=EEApzmKOJfhzGYuHNBFTvghjh0rdodLPotu2jb4hOls=; b=O5/nwxJGd9OUp0rkzXptlYFRSyzJkxt+Bd7Bzr5rEvTkCUUtMa0Xlk7qOgSSK9uv+h Zc5UP+HLI+dWaYBcYoYMDyMlnKJ8pV0bllw2CVZ6kHeFjaS5UoA3hv+pKMv2tfJ1AyGM ZTLQ4HXhWeJhDD+LsG4vcLmZYs56JfRQGbHyyDJQZCFMDzBB+680eB5RVDqwwGu3Qswa OU6hWjy9IuFt/wx/0YLYmt/zLC8Fic20bO6xH5cAC3M5vwo0jMrwROJX5HERj2E1KD5t 3mHxMKsegpkdi8X9BqVFWx2r3noa5pjFiiC5RLZ7hEBDsWvEI84GFARPE1DiAnTom6+p PUjA== X-Gm-Message-State: AO0yUKWXBsjDHmVdpDYvayHozYfkds98+jIZuNHb66caj6TmxG1QmmvE fByvaW4m4UyqkRB0jZmKNF1RAoqB9PUUYRY6E/Y= X-Google-Smtp-Source: AK7set8TWicX+3Sj/kWbeauFe0gKDtQA0IpRWB7GOJ6a+RJZCekmSGnRy0KaOWY+Nq2gMk6yoc1MXw== X-Received: by 2002:a05:6808:241:b0:37d:87a1:c552 with SMTP id m1-20020a056808024100b0037d87a1c552mr2903040oie.32.1676575782425; Thu, 16 Feb 2023 11:29:42 -0800 (PST) Received: from ?IPV6:2804:1b3:a7c3:3a5:d16:437b:3b74:d999? ([2804:1b3:a7c3:3a5:d16:437b:3b74:d999]) by smtp.gmail.com with ESMTPSA id m18-20020a9d7ad2000000b0068d3ec1427bsm987840otn.69.2023.02.16.11.29.40 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Feb 2023 11:29:41 -0800 (PST) Message-ID: <5bef607c-6810-9dfe-c122-2d7df7decf71@linaro.org> Date: Thu, 16 Feb 2023 16:29:39 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.7.2 Subject: Re: [PATCH 2/7] stdlib: Simplify getenv Content-Language: en-US To: Wilco Dijkstra , "libc-alpha@sourceware.org" References: <20230213135558.3328727-1-adhemerval.zanella@linaro.org> <20230213135558.3328727-3-adhemerval.zanella@linaro.org> <7d887c0c-7ab0-4057-df39-e8d671bca1d0@linaro.org> <1809ebdf-e032-c34f-f685-d6718d525c2c@linaro.org> From: Adhemerval Zanella Netto Organization: Linaro In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP 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: On 16/02/23 15:47, Wilco Dijkstra wrote: > Hi Adhemerval, > >> Do you mean something like: >> >>   size_t len = strlen (name);; >>   for (char **ep = __environ; *ep != NULL; ++ep) >>     { >>       if (((*ep)[0] == name[0] && (*ep)[1] == '=') >>           || (strncmp (name, *ep, len) == 0 && (*ep)[len] == '=')) >>         return *ep + len + 1; >>     } > > No I meant checking the first character first before doing more expensive calls, so: > >       if (name[0] == (*ep)[0] && strncmp (name, *ep, len) == 0 && (*ep)[len] == '=') >         return *ep + len + 1; > > Basically this means you get a very tight loop checking the first character - this avoids > most calls to strncmp. This is basically the same result as the current implementation > but without all the defines and complex unaligned/big-endian stuff! Ah ok, I see it now. Do the follow addresses the issues pointed out? >From 373682e6c290f1c38d0319b5695e6a12a388be0c Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Thu, 9 Feb 2023 10:36:57 -0300 Subject: [PATCH 2/7] stdlib: Simplify getenv And remove _STRING_ARCH_unaligned usage. Checked on x86_64-linux-gnu and i686-linux-gnu. --- stdlib/getenv.c | 64 ++++--------------------------------------------- 1 file changed, 5 insertions(+), 59 deletions(-) diff --git a/stdlib/getenv.c b/stdlib/getenv.c index e3157ce2f3..6942d23433 100644 --- a/stdlib/getenv.c +++ b/stdlib/getenv.c @@ -15,76 +15,22 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include #include #include #include - -/* Return the value of the environment variable NAME. This implementation - is tuned a bit in that it assumes no environment variable has an empty - name which of course should always be true. We have a special case for - one character names so that for the general case we can assume at least - two characters which we can access. By doing this we can avoid using the - `strncmp' most of the time. */ char * getenv (const char *name) { - char **ep; - uint16_t name_start; - if (__environ == NULL || name[0] == '\0') return NULL; - if (name[1] == '\0') - { - /* The name of the variable consists of only one character. Therefore - the first two characters of the environment entry are this character - and a '=' character. */ -#if __BYTE_ORDER == __LITTLE_ENDIAN || !_STRING_ARCH_unaligned - name_start = ('=' << 8) | *(const unsigned char *) name; -#else - name_start = '=' | ((*(const unsigned char *) name) << 8); -#endif - for (ep = __environ; *ep != NULL; ++ep) - { -#if _STRING_ARCH_unaligned - uint16_t ep_start = *(uint16_t *) *ep; -#else - uint16_t ep_start = (((unsigned char *) *ep)[0] - | (((unsigned char *) *ep)[1] << 8)); -#endif - if (name_start == ep_start) - return &(*ep)[2]; - } - } - else + size_t len = strlen (name);; + for (char **ep = __environ; *ep != NULL; ++ep) { - size_t len = strlen (name); -#if _STRING_ARCH_unaligned - name_start = *(const uint16_t *) name; -#else - name_start = (((const unsigned char *) name)[0] - | (((const unsigned char *) name)[1] << 8)); -#endif - len -= 2; - name += 2; - - for (ep = __environ; *ep != NULL; ++ep) - { -#if _STRING_ARCH_unaligned - uint16_t ep_start = *(uint16_t *) *ep; -#else - uint16_t ep_start = (((unsigned char *) *ep)[0] - | (((unsigned char *) *ep)[1] << 8)); -#endif - - if (name_start == ep_start && !strncmp (*ep + 2, name, len) - && (*ep)[len + 2] == '=') - return &(*ep)[len + 3]; - } + if (name[0] == (*ep)[0] + && strncmp (name, *ep, len) == 0 && (*ep)[len] == '=') + return *ep + len + 1; } return NULL; -- 2.34.1