Skip to content

Commit

Permalink
Add strcasestr()
Browse files Browse the repository at this point in the history
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4364 42af7a65-404d-4744-a932-0658087f49c3
  • Loading branch information
patacongo committed Feb 3, 2012
1 parent 8eb5576 commit 3856d98
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 41 deletions.
1 change: 1 addition & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 3 additions & 11 deletions TODO
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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/)

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
7 changes: 4 additions & 3 deletions configs/mcu123-lpc214x/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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:
----
Expand Down Expand Up @@ -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:
-----------
Expand All @@ -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)
53 changes: 27 additions & 26 deletions include/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion lib/string/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -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
134 changes: 134 additions & 0 deletions lib/string/lib_strcasestr.c
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 3856d98

Please sign in to comment.