mirror of
https://https.git.savannah.gnu.org/git/gnulib.git
synced 2026-09-01 02:34:55 +00:00
New module 'c-strcasestr'.
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
2005-10-11 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
* modules/c-strcasestr: New file.
|
||||
* MODULES.html.sh (String handling <string.h>): Add c-strcasestr.
|
||||
|
||||
2005-10-11 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
* modules/c-strcase: New file.
|
||||
|
||||
@@ -1528,6 +1528,7 @@ func_all_modules ()
|
||||
func_module stpncpy
|
||||
func_module c-strcase
|
||||
func_module strcase
|
||||
func_module c-strcasestr
|
||||
func_module strcasestr
|
||||
func_module strchrnul
|
||||
func_module strdup
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
2005-10-11 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
* c-strcasestr.h: New file, from GNU gettext.
|
||||
* c-strcasestr.c: New file, from GNU gettext.
|
||||
|
||||
2005-10-11 Bruno Haible <bruno@clisp.org>
|
||||
|
||||
* c-strcase.h: New file, from GNU gettext.
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/* c-strcasestr.c -- case insensitive substring search in C locale
|
||||
Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2005.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Specification. */
|
||||
#include "c-strcasestr.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "c-ctype.h"
|
||||
|
||||
/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
|
||||
comparison.
|
||||
Note: This function may, in multibyte locales, return success even if
|
||||
strlen (haystack) < strlen (needle) ! */
|
||||
char *
|
||||
c_strcasestr (const char *haystack, const char *needle)
|
||||
{
|
||||
/* Be careful not to look at the entire extent of haystack or needle
|
||||
until needed. This is useful because of these two cases:
|
||||
- haystack may be very long, and a match of needle found early,
|
||||
- needle may be very long, and not even a short initial segment of
|
||||
needle may be found in haystack. */
|
||||
if (*needle != '\0')
|
||||
{
|
||||
/* Speed up the following searches of needle by caching its first
|
||||
character. */
|
||||
unsigned char b = c_tolower ((unsigned char) *needle);
|
||||
|
||||
needle++;
|
||||
for (;; haystack++)
|
||||
{
|
||||
if (*haystack == '\0')
|
||||
/* No match. */
|
||||
return NULL;
|
||||
if (c_tolower ((unsigned char) *haystack) == b)
|
||||
/* The first character matches. */
|
||||
{
|
||||
const char *rhaystack = haystack + 1;
|
||||
const char *rneedle = needle;
|
||||
|
||||
for (;; rhaystack++, rneedle++)
|
||||
{
|
||||
if (*rneedle == '\0')
|
||||
/* Found a match. */
|
||||
return (char *) haystack;
|
||||
if (*rhaystack == '\0')
|
||||
/* No match. */
|
||||
return NULL;
|
||||
if (c_tolower ((unsigned char) *rhaystack)
|
||||
!= c_tolower ((unsigned char) *rneedle))
|
||||
/* Nothing in this round. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
return (char *) haystack;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/* Case-insensitive searching in a string in C locale.
|
||||
Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifndef C_STRCASESTR_H
|
||||
#define C_STRCASESTR_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
|
||||
comparison. */
|
||||
extern char *c_strcasestr (const char *haystack, const char *needle);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* C_STRCASESTR_H */
|
||||
@@ -0,0 +1,24 @@
|
||||
Description:
|
||||
Case-insensitive searching in a string in C locale.
|
||||
|
||||
Files:
|
||||
lib/c-strcasestr.h
|
||||
lib/c-strcasestr.c
|
||||
|
||||
Depends-on:
|
||||
c-ctype
|
||||
|
||||
configure.ac:
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += c-strcasestr.h c-strcasestr.c
|
||||
|
||||
Include:
|
||||
"c-strcasestr.h"
|
||||
|
||||
License:
|
||||
LGPL
|
||||
|
||||
Maintainer:
|
||||
Bruno Haible
|
||||
|
||||
Reference in New Issue
Block a user