Add strcspn() and strndup()
authorMichael Brown <mcb30@etherboot.org>
Sun, 8 Jul 2007 21:03:12 +0000 (22:03 +0100)
committerMichael Brown <mcb30@etherboot.org>
Sun, 8 Jul 2007 21:03:12 +0000 (22:03 +0100)
src/core/string.c
src/include/string.h

index 353abd6..87c5057 100644 (file)
@@ -279,6 +279,31 @@ size_t strspn(const char *s, const char *accept)
 }
 #endif
 
+#ifndef __HAVE_ARCH_STRCSPN
+/**
+ * strcspn - Calculate the length of the initial substring of @s which only
+ *     contain letters not in @reject
+ * @s: The string to be searched
+ * @accept: The string to search for
+ */
+size_t strcspn(const char *s, const char *reject)
+{
+       const char *p;
+       const char *r;
+       size_t count = 0;
+
+       for (p = s; *p != '\0'; ++p) {
+               for (r = reject; *r != '\0'; ++r) {
+                       if (*p == *r)
+                               return count;
+               }
+               ++count;
+       }
+
+       return count;
+}
+#endif
+
 #ifndef __HAVE_ARCH_STRPBRK
 /**
  * strpbrk - Find the first occurrence of a set of characters
@@ -541,9 +566,21 @@ void * memchr(const void *s, int c, size_t n)
 
 #endif
 
-char * strdup(const char *s) {
-       char *new = malloc(strlen(s)+1);
-       if (new)
-               strcpy(new,s);
+char * strndup(const char *s, size_t n)
+{
+       size_t len = strlen(s);
+       char *new;
+
+       if (len>n)
+               len = n;
+       new = malloc(len+1);
+       if (new) {
+               new[len] = '\0';
+               memcpy(new,s,len);
+       }
        return new;
 }
+
+char * strdup(const char *s) {
+       return strndup(s, ~((size_t)0));
+}
index e02b5ed..1d104c5 100644 (file)
@@ -30,6 +30,7 @@ char * strrchr(const char * s, int c);
 size_t strlen(const char * s);
 size_t strnlen(const char * s, size_t count);
 size_t strspn(const char *s, const char *accept);
+size_t strcspn(const char *s, const char *reject);
 char * strpbrk(const char * cs,const char * ct);
 char * strtok(char * s,const char * ct);
 char * strsep(char **s, const char *ct);
@@ -41,6 +42,7 @@ void * memscan(void * addr, int c, size_t size);
 char * strstr(const char * s1,const char * s2);
 void * memchr(const void *s, int c, size_t n);
 char * strdup(const char *s);
+char * strndup(const char *s, size_t n);
 
 extern const char * strerror ( int errno );