diff --git a/arch/sparc/kernel/ttable.S b/arch/sparc/kernel/ttable.S index 6d8648114d08f2d9125812fe62177f72fde69217..ececfbb3818b9db00be506d356e5d4592385b6bf 100644 --- a/arch/sparc/kernel/ttable.S +++ b/arch/sparc/kernel/ttable.S @@ -145,8 +145,6 @@ hw_div0_trap_handler: nmi_entry: .global reg_access_trap_handler reg_access_trap_handler: - .global strchr -strchr: .global syscall_tbl syscall_tbl: .global syscall_trap @@ -159,4 +157,4 @@ syscall_trap: unimpl_flush_trap_handler: .global watchpoint_det_trap_handler watchpoint_det_trap_handler: - ta 0 + ta 3 diff --git a/include/kernel/string.h b/include/kernel/string.h index b5a18adfac2e3f9229d98f5338bc3cb79f2068e6..4296a80ee967029aa9ba67ab1058dc1e80841e51 100644 --- a/include/kernel/string.h +++ b/include/kernel/string.h @@ -20,6 +20,8 @@ char *strpbrk(const char *s, const char *accept); char *strsep(char **stringp, const char *delim); char *strdup(const char *s); +char *strchr(const char *s, int c); + char *strstr(const char *haystack, const char *needle); size_t strlen(const char *s); int memcmp(const void *s1, const void *s2, size_t n); diff --git a/lib/string.c b/lib/string.c index 271190181c553240f51a4ae4ef78b24e0c4efc10..6a50f1c8c4ab6634df43eb64ebd1f8387614880c 100644 --- a/lib/string.c +++ b/lib/string.c @@ -172,6 +172,33 @@ char *strdup(const char *s) EXPORT_SYMBOL(strdup); +/** + * @brief locate a character in string + * + * @param s the string to search in + * @param c the character to search for + * + * @returns a pointer to the first matched character or NULL if not found + * + * @note the terminating null byte is considered part of the string, so that if + * c is given as '\0', the function returns a pointer to the terminator + */ + +char *strchr(const char *s, int c) +{ + while ((*s) != (char) c) { + + if ((*s) == '\0') + return NULL; + + s++; + } + + return (char *) s; +} +EXPORT_SYMBOL(strchr); + + /** * @brief calculate the length of a string *