From ed20fee0cfc5863b308d22abc17a7dbb4327c90f Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 8 Jul 2007 22:02:45 +0100 Subject: [PATCH 1/2] Make ref_get() return the reference, for cleaner code. --- src/core/refcnt.c | 16 ++++++++-------- src/include/gpxe/refcnt.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/refcnt.c b/src/core/refcnt.c index 36b7ce22..30bb6dea 100644 --- a/src/core/refcnt.c +++ b/src/core/refcnt.c @@ -29,18 +29,18 @@ * 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; } /** diff --git a/src/include/gpxe/refcnt.h b/src/include/gpxe/refcnt.h index 0930a577..68e0fd4b 100644 --- a/src/include/gpxe/refcnt.h +++ b/src/include/gpxe/refcnt.h @@ -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 */ From 7137c20ed1f486f31047a3a3dc77d90d0a5bb7dc Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 8 Jul 2007 22:03:12 +0100 Subject: [PATCH 2/2] Add strcspn() and strndup() --- src/core/string.c | 45 ++++++++++++++++++++++++++++++++++++++++---- src/include/string.h | 2 ++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/core/string.c b/src/core/string.c index 353abd6f..87c50570 100644 --- a/src/core/string.c +++ b/src/core/string.c @@ -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)); +} diff --git a/src/include/string.h b/src/include/string.h index e02b5edb..1d104c52 100644 --- a/src/include/string.h +++ b/src/include/string.h @@ -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 );