From 1b274345aea44fe340a8e5e349b6e61cb865bc12 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 31 Jul 2010 22:10:38 +0200 Subject: [PATCH] unistr/u8-strstr, unistr/u16-strstr: Optimize the one-character case. --- ChangeLog | 11 +++++++++++ lib/unistr/u-strstr.h | 14 ++++++++++++-- lib/unistr/u16-strstr.c | 3 ++- lib/unistr/u8-strstr.c | 3 ++- modules/unistr/u16-strstr | 1 + modules/unistr/u8-strstr | 1 + 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index dee720b1d..7a0f040d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2010-07-31 Bruno Haible + unistr/u8-strstr, unistr/u16-strstr: Optimize the one-character case. + * lib/unistr/u-strstr.h (FUNC): When the needle contains only one + character, perform the search using U_STRCHR. + * lib/unistr/u8-strstr.c (U_STRMBTOUC): New macro. + * lib/unistr/u16-strstr.c (U_STRMBTOUC): Likewise. + * modules/unistr/u8-strstr (Depends-on): Add unistr/u8-strmbtouc. + * modules/unistr/u16-strstr (Depends-on): Add unistr/u16-strmbtouc. + Suggested by Paolo Bonzini. + +2010-07-31 Bruno Haible + unistr/u*-strstr: Fix dependencies. * modules/unistr/u8-strstr (Depends-on): Add unistr/u8-strchr. * modules/unistr/u16-strstr (Depends-on): Add unistr/u16-strchr. diff --git a/lib/unistr/u-strstr.h b/lib/unistr/u-strstr.h index df32be8b0..604b20cc9 100644 --- a/lib/unistr/u-strstr.h +++ b/lib/unistr/u-strstr.h @@ -1,5 +1,5 @@ /* Substring test for UTF-8/UTF-16/UTF-32 strings. - Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc. + Copyright (C) 1999, 2002, 2006, 2010 Free Software Foundation, Inc. Written by Bruno Haible , 2002. This program is free software: you can redistribute it and/or modify it @@ -24,10 +24,20 @@ FUNC (const UNIT *haystack, const UNIT *needle) if (first == 0) return (UNIT *) haystack; - /* Is needle nearly empty? */ + /* Is needle nearly empty (only one unit)? */ if (needle[1] == 0) return U_STRCHR (haystack, first); +#ifdef U_STRMBTOUC + /* Is needle nearly empty (only one character)? */ + { + ucs4_t first_uc; + int count = U_STRMBTOUC (&first_uc, needle); + if (count > 0 && needle[count] == 0) + return U_STRCHR (haystack, first_uc); + } +#endif + /* Search for needle's first unit. */ for (; *haystack != 0; haystack++) if (*haystack == first) diff --git a/lib/unistr/u16-strstr.c b/lib/unistr/u16-strstr.c index 54a74d62f..804f4e44d 100644 --- a/lib/unistr/u16-strstr.c +++ b/lib/unistr/u16-strstr.c @@ -1,5 +1,5 @@ /* Substring test for UTF-16 strings. - Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc. + Copyright (C) 1999, 2002, 2006, 2010 Free Software Foundation, Inc. Written by Bruno Haible , 2002. This program is free software: you can redistribute it and/or modify it @@ -25,4 +25,5 @@ #define FUNC u16_strstr #define UNIT uint16_t #define U_STRCHR u16_strchr +#define U_STRMBTOUC u16_strmbtouc #include "u-strstr.h" diff --git a/lib/unistr/u8-strstr.c b/lib/unistr/u8-strstr.c index cce37adcd..7a7d6c1bb 100644 --- a/lib/unistr/u8-strstr.c +++ b/lib/unistr/u8-strstr.c @@ -1,5 +1,5 @@ /* Substring test for UTF-8 strings. - Copyright (C) 1999, 2002, 2006, 2009-2010 Free Software Foundation, Inc. + Copyright (C) 1999, 2002, 2006, 2010 Free Software Foundation, Inc. Written by Bruno Haible , 2002. This program is free software: you can redistribute it and/or modify it @@ -25,4 +25,5 @@ #define FUNC u8_strstr #define UNIT uint8_t #define U_STRCHR u8_strchr +#define U_STRMBTOUC u8_strmbtouc #include "u-strstr.h" diff --git a/modules/unistr/u16-strstr b/modules/unistr/u16-strstr index 78980ff34..014ae113b 100644 --- a/modules/unistr/u16-strstr +++ b/modules/unistr/u16-strstr @@ -8,6 +8,7 @@ lib/unistr/u-strstr.h Depends-on: unistr/base unistr/u16-strchr +unistr/u16-strmbtouc configure.ac: gl_LIBUNISTRING_MODULE([0.9], [unistr/u16-strstr]) diff --git a/modules/unistr/u8-strstr b/modules/unistr/u8-strstr index 7d73b2ae3..30d99a459 100644 --- a/modules/unistr/u8-strstr +++ b/modules/unistr/u8-strstr @@ -8,6 +8,7 @@ lib/unistr/u-strstr.h Depends-on: unistr/base unistr/u8-strchr +unistr/u8-strmbtouc configure.ac: gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-strstr]) -- 2.11.0