Null termination of strndup() implementation on systems missing it.
Also, implementation of strnlen() on systems missing it.
This commit is contained in:
parent
4815e52586
commit
189ce59dbe
@ -2,6 +2,11 @@
|
||||
Version 1.6.11
|
||||
*******************************************************************************
|
||||
|
||||
2011-01-14 Chandra Penke <chandrapenke(at)mcntech.com>
|
||||
|
||||
- Null termination of strndup() implementation on systems missing it.
|
||||
- Implementation of strnlen() on systems missing it.
|
||||
|
||||
2011-01-14 Chandra Penke <chandrapenke(at)mcntech.com>
|
||||
|
||||
Minor change in membuffer.c to include "membuffer.h" without looking
|
||||
|
@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
/*!
|
||||
* \addtogroup UpnpString
|
||||
*
|
||||
@ -17,37 +15,44 @@
|
||||
* \brief UpnpString object implementation.
|
||||
*/
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include "UpnpString.h"
|
||||
|
||||
|
||||
#include <stdlib.h> /* for calloc(), free() */
|
||||
#include <string.h> /* for strlen(), strdup() */
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define strcasecmp stricmp
|
||||
#else
|
||||
/* Other systems have strncasecmp */
|
||||
#endif
|
||||
|
||||
|
||||
/* strndup() is a GNU extension. Other systems must fix it with elif's. */
|
||||
#ifdef __GNUC__
|
||||
#if defined(__GNUC__) && !defined(__APPLE__)
|
||||
extern char *strndup(__const char *__string, size_t __n);
|
||||
#elif defined(WIN32)
|
||||
#endif /* defined(__GNUC__) && !defined(__APPLE__) */
|
||||
|
||||
#if defined(__GNUC__) && defined(__APPLE__)
|
||||
static size_t strnlen(const char *s, size_t n)
|
||||
{
|
||||
const char *p = (const char *)memchr(s, 0, n);
|
||||
return p ? p - s : n;
|
||||
}
|
||||
#endif /* defined(__GNUC__) && defined(__APPLE__) */
|
||||
|
||||
#if (defined(__GNUC__) && defined(__APPLE__)) || defined(WIN32)
|
||||
static char *strndup(const char *__string, size_t __n)
|
||||
{
|
||||
size_t strsize = strnlen(__string,__n);
|
||||
char *newstr = (char *) malloc(strsize + 1);
|
||||
strncpy(newstr,__string,__n);
|
||||
return(newstr);
|
||||
}
|
||||
#endif
|
||||
size_t strsize = strnlen(__string, __n);
|
||||
char *newstr = (char *)malloc(strsize + 1);
|
||||
|
||||
strncpy(newstr, __string, newstr);
|
||||
newstr[strsize] = 0;
|
||||
|
||||
return newstr;
|
||||
}
|
||||
#endif /* (defined(__GNUC__) && defined(__APPLE__)) || defined(WIN32) */
|
||||
|
||||
/*!
|
||||
* \brief Internal implementation of the class UpnpString.
|
||||
@ -63,7 +68,6 @@ struct SUpnpString
|
||||
char *m_string;
|
||||
};
|
||||
|
||||
|
||||
UpnpString *UpnpString_new()
|
||||
{
|
||||
/* All bytes are zero, and so is the length of the string. */
|
||||
@ -90,7 +94,6 @@ error_handler1:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_delete(UpnpString *p)
|
||||
{
|
||||
struct SUpnpString *q = (struct SUpnpString *)p;
|
||||
@ -105,7 +108,6 @@ void UpnpString_delete(UpnpString *p)
|
||||
free(p);
|
||||
}
|
||||
|
||||
|
||||
UpnpString *UpnpString_dup(const UpnpString *p)
|
||||
{
|
||||
struct SUpnpString *q = calloc(1, sizeof (struct SUpnpString));
|
||||
@ -127,7 +129,6 @@ error_handler1:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_assign(UpnpString *p, const UpnpString *q)
|
||||
{
|
||||
if (p != q) {
|
||||
@ -135,13 +136,11 @@ void UpnpString_assign(UpnpString *p, const UpnpString *q)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
size_t UpnpString_get_Length(const UpnpString *p)
|
||||
{
|
||||
return ((struct SUpnpString *)p)->m_length;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_set_Length(UpnpString *p, size_t n)
|
||||
{
|
||||
if (((struct SUpnpString *)p)->m_length > n) {
|
||||
@ -151,13 +150,11 @@ void UpnpString_set_Length(UpnpString *p, size_t n)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const char *UpnpString_get_String(const UpnpString *p)
|
||||
{
|
||||
return ((struct SUpnpString *)p)->m_string;
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_set_String(UpnpString *p, const char *s)
|
||||
{
|
||||
char *q = strdup(s);
|
||||
@ -170,7 +167,6 @@ error_handler1:
|
||||
return q != NULL;
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_set_StringN(UpnpString *p, const char *s, size_t n)
|
||||
{
|
||||
char *q = strndup(s, n);
|
||||
@ -183,7 +179,6 @@ error_handler1:
|
||||
return q != NULL;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_clear(UpnpString *p)
|
||||
{
|
||||
((struct SUpnpString *)p)->m_length = 0;
|
||||
@ -191,7 +186,6 @@ void UpnpString_clear(UpnpString *p)
|
||||
((struct SUpnpString *)p)->m_string[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_cmp(UpnpString *p, UpnpString *q)
|
||||
{
|
||||
const char *cp = UpnpString_get_String(p);
|
||||
@ -200,7 +194,6 @@ int UpnpString_cmp(UpnpString *p, UpnpString *q)
|
||||
return strcmp(cp, cq);
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_casecmp(UpnpString *p, UpnpString *q)
|
||||
{
|
||||
const char *cp = UpnpString_get_String(p);
|
||||
@ -210,4 +203,3 @@ int UpnpString_casecmp(UpnpString *p, UpnpString *q)
|
||||
}
|
||||
|
||||
/* @} UpnpString */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user