forked from Archive/PX4-Autopilot
Add strcasestr()
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4364 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
parent
43542f9f8f
commit
fb7d63e558
|
@ -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().
|
||||
|
||||
|
|
14
nuttx/TODO
14
nuttx/TODO
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue