diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index 3dc5d697fe..2612ed4d14 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -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(). diff --git a/nuttx/TODO b/nuttx/TODO index 056548d4b3..09e24221fd 100644 --- a/nuttx/TODO +++ b/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 diff --git a/nuttx/configs/mcu123-lpc214x/README.txt b/nuttx/configs/mcu123-lpc214x/README.txt index 9b7cee4bf3..a05b239e61 100644 --- a/nuttx/configs/mcu123-lpc214x/README.txt +++ b/nuttx/configs/mcu123-lpc214x/README.txt @@ -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) diff --git a/nuttx/include/string.h b/nuttx/include/string.h index 0fbf996cd0..5cc8d79622 100644 --- a/nuttx/include/string.h +++ b/nuttx/include/string.h @@ -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) diff --git a/nuttx/lib/string/Make.defs b/nuttx/lib/string/Make.defs index d3f1eed3a1..246b053813 100644 --- a/nuttx/lib/string/Make.defs +++ b/nuttx/lib/string/Make.defs @@ -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 diff --git a/nuttx/lib/string/lib_strcasestr.c b/nuttx/lib/string/lib_strcasestr.c new file mode 100644 index 0000000000..23f0ab57e6 --- /dev/null +++ b/nuttx/lib/string/lib_strcasestr.c @@ -0,0 +1,134 @@ +/**************************************************************************** + * lib/string/lib_strstr.c + * + * Copyright (C) 2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include +#include + +/**************************************************************************** + * 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; +} +