Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp5001701imm; Sun, 22 Jul 2018 10:40:27 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcw4xQF8+C2gRIUFMQgoB+PAMbOQGFtupMAQVZWuZ1EajlqIRsLAIH8gUD5XBGq5aIoTpI5 X-Received: by 2002:a17:902:9042:: with SMTP id w2-v6mr1483073plz.61.1532281227848; Sun, 22 Jul 2018 10:40:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532281227; cv=none; d=google.com; s=arc-20160816; b=Xzdzhc9NZcUVwyY4pHeb0+i+muArerx3/1KrEqAhlz1Y7FhR272kn4twjTXgGTTo/V qQZIsLQzvnbkOZe931jKTN1JxTJDWypIxKj9+bU8D86eY0XOGnci9j5Sz5EFAB/0uTHp MiFNFanJ/CqNl7JkPaqaYUnhZwZ8mpFthGflSWS+86EnfDy3xEQ2BQBUay2LpuaEyC7K lsVytWHhcEwmdfax3O6bd+OfuwyTrJcf+q9p89LTMoGvIHuflXn+jkFxdIv5HkRCLsZi BwyUGR3HKHq4THYitl/UXV3e7jiOO55g56nUtAt7MmgwZoBMUxtrzrTGS45M12WMiHvq AttQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=8cOTVtmBlMUFmpnk+7QG1hlsJ1Hru+o5Vyjw5Eq4BXE=; b=gQMAmMrhhuU25nvhjd+9KtCM/iARUBwrfulyMeZkhzYCagRfS8USUSAFRdyFyX6tdm 7Im50zFiSR3eqR8Ft+lOCDs7/RcNsil10MmaKy5d0GrOlivzSyDfJ0Wt3BtVgVk4GFLA BQ9q2EcWNjcnjznSKctGJQ3BCNiFUUEEIY7Ct/X9HCLfG+5klQ+yevqaOYMt2hth8a84 rROblgkdTzcLdZfvrkmhgizQIHaXbddkg4un+MVx6kTlTTJlPBstDbS1GsqatPxNAhs0 nDU23ddWgqQj70sy4cTFzpafZdYBST3G4J3sSxcGEDmX54s22c1bSOd1yYj2OgoXKDmT JKgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b=eidnu9Px; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 31-v6si6374596pla.155.2018.07.22.10.40.13; Sun, 22 Jul 2018 10:40:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@163.com header.s=s110527 header.b=eidnu9Px; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730212AbeGVSf5 (ORCPT + 99 others); Sun, 22 Jul 2018 14:35:57 -0400 Received: from m12-18.163.com ([220.181.12.18]:51465 "EHLO m12-18.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727783AbeGVSf5 (ORCPT ); Sun, 22 Jul 2018 14:35:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id; bh=8cOTVtmBlMUFmpnk+7 QG1hlsJ1Hru+o5Vyjw5Eq4BXE=; b=eidnu9Px/AIoYuBHizpcAbGkghuGLA3kVO s/plchofzGTGvSP4EzghYWTkkBArxkIkpXZ51ktcXaU4NAb+xU1qGezcIi5qrcex PxWJxb5uZBsyqxWuy8Ap/W8SBsGdDCzFlNmUqYy6qAkL0GTEHkYwdxmkyCOebcmw M/90/wHpg= Received: from fedora.localdomain (unknown [120.229.91.112]) by smtp14 (Coremail) with SMTP id EsCowADn4RfhwFRb6UCbMA--.59693S4; Mon, 23 Jul 2018 01:38:05 +0800 (CST) From: Zhaoxiu Zeng To: Andrew Morton , Matthew Wilcox , Dan Carpenter , Geert Uytterhoeven , Thomas Gleixner , Andrey Ryabinin , Greg Kroah-Hartman Cc: linux-kernel@vger.kernel.org, Zhaoxiu Zeng Subject: [PATCH 1/1] lib: use sunday algorithm to do strstr() and strnstr() Date: Mon, 23 Jul 2018 01:37:15 +0800 Message-Id: <20180722173715.25327-1-zengzhaoxiu@163.com> X-Mailer: git-send-email 2.17.1 X-CM-TRANSID: EsCowADn4RfhwFRb6UCbMA--.59693S4 X-Coremail-Antispam: 1Uf129KBjvJXoW7Ar43Gw1xCF17Gw43KF1DAwb_yoW8tw1fpF savrWfKa1ktr13JryfWF1kt343CFZagr4UJ3y2y3ZxA398JFZ8uwsrJF9Iv3ySq3yfWF1f Jrs5XFWFkayUZF7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07jdqXdUUUUU= X-Originating-IP: [120.229.91.112] X-CM-SenderInfo: p2hqw6xkdr5xrx6rljoofrz/1tbiox+LgFUMGjySJwAAs9 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zhaoxiu Zeng The Sunday algorithm is a variation of Boyer-Moore algorithm, it is easy and fast. For the Sunday algorithm, to see http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/sundayen.htm Signed-off-by: Zhaoxiu Zeng --- lib/string.c | 92 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 11 deletions(-) diff --git a/lib/string.c b/lib/string.c index 2c0900a5d51a..ed4ab9ee3373 100644 --- a/lib/string.c +++ b/lib/string.c @@ -898,19 +898,51 @@ EXPORT_SYMBOL(memscan); */ char *strstr(const char *s1, const char *s2) { - size_t l1, l2; + size_t l2; + const char *pchk = s1; +#ifdef __HAVE_ARCH_STRLEN l2 = strlen(s2); +#else + for (l2 = 0; s2[l2] != 0; l2++) + /* nothing */; +#endif if (!l2) return (char *)s1; - l1 = strlen(s1); - while (l1 >= l2) { - l1--; - if (!memcmp(s1, s2, l2)) + + /* + * Sunday matching + */ + while (1) { + size_t i; + char k; + + /* compare */ + for (i = 0; i < l2; i++) { + if (s1[i] != s2[i]) + break; + } + if (i >= l2) return (char *)s1; - s1++; + + /* if s1 terminate early? */ + if (pchk < s1 + i) + pchk = s1 + i; + do { + k = *pchk; + if (k == 0) + return NULL; + } while (pchk++ != s1 + l2); + + /* find the k's last presence in s2 (k = s1[l2]) */ + for (i = l2; --i != (size_t)-1; ) { + if (k == s2[i]) + break; + } + + /* shift */ + s1 += l2 - i; } - return NULL; } EXPORT_SYMBOL(strstr); #endif @@ -925,16 +957,54 @@ EXPORT_SYMBOL(strstr); char *strnstr(const char *s1, const char *s2, size_t len) { size_t l2; + const char *pchk = s1; +#ifdef __HAVE_ARCH_STRLEN l2 = strlen(s2); +#else + for (l2 = 0; s2[l2] != 0; l2++) + /* nothing */; +#endif if (!l2) return (char *)s1; + + /* + * Sunday matching + */ while (len >= l2) { - len--; - if (!memcmp(s1, s2, l2)) - return (char *)s1; - s1++; + size_t i; + char k; + + /* compare */ + for (i = 0; i < l2; i++) { + if (s1[i] != s2[i]) + break; + } + if (i >= l2) + return (char *)s1; + if (len == l2) + break; + + /* if s1 terminate early? */ + if (pchk < s1 + i) + pchk = s1 + i; + do { + k = *pchk; + if (k == 0) + return NULL; + } while (pchk++ != s1 + l2); + + /* find the k's last presence in s2 (k = s1[l2]) */ + for (i = l2; --i != (size_t)-1; ) { + if (k == s2[i]) + break; + } + + /* shift */ + s1 += l2 - i; + len -= l2 - i; } + return NULL; } EXPORT_SYMBOL(strnstr); -- 2.17.1