Add strcasestr()

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4364 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2012-02-03 16:41:28 +00:00
parent 43542f9f8f
commit fb7d63e558
6 changed files with 170 additions and 41 deletions

View File

@ -2442,4 +2442,5 @@
console (only a Telnet console) and SDIO is enabled. This configuration is
required because the STM3240G-EVAL board cannot simultaneously support
RS-232 and SDIO due to pin conflicts.
* lib/string/strcasestr.c: Add strcasestr().

View File

@ -1,4 +1,4 @@
NuttX TODO List (Last updated February 1, 2012)
NuttX TODO List (Last updated February 2, 2012)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This file summarizes known NuttX bugs, limitations, inconsistencies with
@ -45,7 +45,7 @@ nuttx/
apps/
(5) Network Utilities (apps/netutils/)
(5) NuttShell (NSH) (apps/nshlib)
(4) NuttShell (NSH) (apps/nshlib)
(1) System libraries apps/system (apps/system)
(5) Other Applications & Tests (apps/examples/)
@ -1015,7 +1015,7 @@ o ARM/LPC214x (arch/arm/src/lpc214x/)
Description: I tried to bring up the new configuration at configs/mcu123-214x/composite,
and Linux failed to enumerate the device. I don't know if this is
a problem with the lpc214x USB driver (bit rot), or due to recent
changed (e.g., -r3170 is suspicious), or an incompatibility between the
changed (e.g., -r4359 is suspicious), or an incompatibility between the
Composite driver and the LPC214x USB driver. It will take more work
to find out which -- like checking if the other USB configurations are
also broken.
@ -1544,14 +1544,6 @@ o Network Utilities (apps/netutils/)
o NuttShell (NSH) (apps/nshlib)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Title: EACH TCP PACKET CAUSES PROMPT
Description: When the telnetd front end is received, each TCP packet
received causes a prompt (nsh >) to be presented. The
prompt should only be presented when the user enters a
carriage return.
Status: Open
Priority: Low
Title: WGET UNTESTED
Description: The wget command has been incorporated into NSH, however
it is still untested as of this writing (only because I

View File

@ -351,7 +351,8 @@ composite:
Output format: ELF and Intel HEX
NOTE: I could not get this to work! Perhaps this is a
consequence of the last USB driver checking (r3170)
consequence of the last USB driver checking (r4359). But
backing this change out did not fix the configuration.
nsh:
----
@ -382,7 +383,7 @@ usbserial:
Output format: ELF and binary
NOTE: If you have problems with this configurationt, perhaps it is a
consequence of the last USB driver checking (r3170)
consequence of the last USB driver checking (r4359)
usbstorage:
-----------
@ -395,4 +396,4 @@ usbstorage:
Output format: ELF and binary
NOTE: If you have problems with this configurationt, perhaps it is a
consequence of the last USB driver checking (r3170)
consequence of the last USB driver checking (r4359)

View File

@ -60,33 +60,34 @@ extern "C" {
#define EXTERN extern
#endif
EXTERN char *strchr(const char *s, int c);
EXTERN FAR char *strdup(const char *s);
EXTERN FAR char *strndup(FAR const char *s, size_t size);
EXTERN const char *strerror(int);
EXTERN size_t strlen(const char *);
EXTERN size_t strnlen(const char *, size_t);
EXTERN char *strcat(char *, const char *);
EXTERN char *strncat(char *, const char *, size_t);
EXTERN int strcmp(const char *, const char *);
EXTERN int strncmp(const char *, const char *, size_t);
EXTERN int strcasecmp(const char *, const char *);
EXTERN int strncasecmp(const char *, const char *, size_t);
EXTERN char *strcpy(char *dest, const char *src);
EXTERN char *strncpy(char *, const char *, size_t);
EXTERN char *strpbrk(const char *, const char *);
EXTERN char *strchr(const char *, int);
EXTERN char *strrchr(const char *, int);
EXTERN size_t strspn(const char *, const char *);
EXTERN size_t strcspn(const char *, const char *);
EXTERN char *strstr(const char *, const char *);
EXTERN char *strtok(char *, const char *);
EXTERN char *strtok_r(char *, const char *, char **);
EXTERN FAR char *strchr(FAR const char *s, int c);
EXTERN FAR char *strdup(FAR const char *s);
EXTERN FAR char *strndup(FAR const char *s, size_t size);
EXTERN FAR const char *strerror(int);
EXTERN size_t strlen(FAR const char *);
EXTERN size_t strnlen(FAR const char *, size_t);
EXTERN FAR char *strcat(FAR char *, FAR const char *);
EXTERN FAR char *strncat(FAR char *, FAR const char *, size_t);
EXTERN int strcmp(FAR const char *, FAR const char *);
EXTERN int strncmp(FAR const char *, FAR const char *, size_t);
EXTERN int strcasecmp(FAR const char *, FAR const char *);
EXTERN int strncasecmp(FAR const char *, FAR const char *, size_t);
EXTERN FAR char *strcpy(char *dest, FAR const char *src);
EXTERN FAR char *strncpy(char *, FAR const char *, size_t);
EXTERN FAR char *strpbrk(FAR const char *, FAR const char *);
EXTERN FAR char *strchr(FAR const char *, int);
EXTERN FAR char *strrchr(FAR const char *, int);
EXTERN size_t strspn(FAR const char *, FAR const char *);
EXTERN size_t strcspn(FAR const char *, FAR const char *);
EXTERN FAR char *strstr(FAR const char *, FAR const char *);
EXTERN FAR char *strcasestr(FAR const char *, FAR const char *);
EXTERN FAR char *strtok(FAR char *, FAR const char *);
EXTERN FAR char *strtok_r(FAR char *, FAR const char *, FAR char **);
EXTERN void *memset(void *s, int c, size_t n);
EXTERN void *memcpy(void *dest, const void *src, size_t n);
EXTERN int memcmp(const void *s1, const void *s2, size_t n);
EXTERN void *memmove(void *dest, const void *src, size_t count);
EXTERN FAR void *memset(FAR void *s, int c, size_t n);
EXTERN FAR void *memcpy(FAR void *dest, FAR const void *src, size_t n);
EXTERN int memcmp(FAR const void *s1, FAR const void *s2, size_t n);
EXTERN FAR void *memmove(FAR void *dest, FAR const void *src, size_t count);
#ifndef CONFIG_ARCH_BZERO
# define bzero(s,n) (void)memset(s,0,n)

View File

@ -38,6 +38,6 @@ STRING_SRCS = lib_checkbase.c lib_isbasedigit.c lib_memset.c lib_memcpy.c \
lib_strcat.c lib_strchr.c lib_strcpy.c lib_strcmp.c lib_strcspn.c \
lib_strdup.c lib_strerror.c lib_strlen.c lib_strnlen.c \
lib_strncasecmp.c lib_strncat.c lib_strncmp.c lib_strncpy.c \
lib_strndup.c lib_strpbrk.c lib_strrchr.c lib_strspn.c \
lib_strndup.c lib_strcasestr.c lib_strpbrk.c lib_strrchr.c lib_strspn.c \
lib_strstr.c lib_strtok.c lib_strtokr.c lib_strtol.c lib_strtoll.c \
lib_strtoul.c lib_strtoull.c lib_strtod.c

View File

@ -0,0 +1,134 @@
/****************************************************************************
* lib/string/lib_strstr.c
*
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use str source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions str binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer str
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <string.h>
#include <ctype.h>
/****************************************************************************
* Private Functions
****************************************************************************/
static FAR char *strcasechr(FAR const char *s, int uc)
{
register char ch;
if (s)
{
for (; *s; s++)
{
ch = *s;
if (toupper(ch) == uc)
{
return (FAR char*)s;
}
}
}
return NULL;
}
/****************************************************************************
* Global Functions
****************************************************************************/
FAR char *strcasestr(FAR const char *str, FAR const char *substr)
{
const char *candidate; /* Candidate in str with matching start character */
char ch; /* First character of the substring */
int len; /* The length of the substring */
/* Special case the empty substring */
len = strlen(substr);
ch = *substr;
if (!ch)
{
/* We'll say that an empty substring matches at the beginning of
* the string
*/
return (char*)str;
}
/* Search for the substring */
candidate = str;
ch = toupper(ch);
for (;;)
{
/* strcasechr() will return a pointer to the next occurrence of the
* character ch in the string (ignoring case)
*/
candidate = strcasechr(candidate, ch);
if (!candidate || strlen(candidate) < len)
{
/* First character of the substring does not appear in the string
* or the remainder of the string is not long enough to contain the
* substring.
*/
return NULL;
}
/* Check if this is the beginning of a matching substring (ignoring case) */
if (strncasecmp(candidate, substr, len) == 0)
{
/* Yes.. return the pointer to the first occurrence of the matching
* substring.
*/
return (char*)candidate;
}
/* No, find the next candidate after this one */
candidate++;
}
/* Won't get here, but some compilers might complain */
return NULL;
}