From 3d2632da28a95424a65f36731ff070e74a7f19bf Mon Sep 17 00:00:00 2001
From: Armin Luntzer <armin.luntzer@univie.ac.at>
Date: Mon, 1 Oct 2018 11:11:10 +0200
Subject: [PATCH] implement strchr()

---
 arch/sparc/kernel/ttable.S |  4 +---
 include/kernel/string.h    |  2 ++
 lib/string.c               | 27 +++++++++++++++++++++++++++
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/arch/sparc/kernel/ttable.S b/arch/sparc/kernel/ttable.S
index 6d86481..ececfbb 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 b5a18ad..4296a80 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 2711901..6a50f1c 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
  *
-- 
GitLab