Merge branch 'master' into iscsi-update
authorMichael Brown <mcb30@etherboot.org>
Sun, 8 Jul 2007 21:06:33 +0000 (22:06 +0100)
committerMichael Brown <mcb30@etherboot.org>
Sun, 8 Jul 2007 21:06:33 +0000 (22:06 +0100)
src/core/refcnt.c
src/core/string.c
src/include/gpxe/refcnt.h
src/include/string.h

index 36b7ce2..30bb6de 100644 (file)
  * Increment reference count
  *
  * @v refcnt           Reference counter, or NULL
+ * @ret refcnt         Reference counter
  *
  * If @c refcnt is NULL, no action is taken.
  */
-void ref_get ( struct refcnt *refcnt ) {
+struct refcnt * ref_get ( struct refcnt *refcnt ) {
 
-       if ( ! refcnt )
-               return;
-
-       refcnt->refcnt++;
-
-       DBGC2 ( refcnt, "REFCNT %p incremented to %d\n",
-               refcnt, refcnt->refcnt );
+       if ( refcnt ) {
+               refcnt->refcnt++;
+               DBGC2 ( refcnt, "REFCNT %p incremented to %d\n",
+                       refcnt, refcnt->refcnt );
+       }
+       return refcnt;
 }
 
 /**
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 0930a57..68e0fd4 100644 (file)
@@ -38,7 +38,7 @@ struct refcnt {
        void ( * free ) ( struct refcnt *refcnt );
 };
 
-extern void ref_get ( struct refcnt *refcnt );
+extern struct refcnt * ref_get ( struct refcnt *refcnt );
 extern void ref_put ( struct refcnt *refcnt );
 
 #endif /* _GPXE_REFCNT_H */
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 );