1 /* xstrdup.c - fail save strdup
2  *
3  * Copyright 1998  Jochen Voss.  */
4 
5 static const  char  rcsid[] = "$Id: xstrdup.c 4839 2003-04-13 16:50:02Z voss $";
6 
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10 
11 #include <string.h>
12 
13 #include "moon-buggy.h"
14 
15 
16 char *
xstrdup(const char * str)17 xstrdup (const char *str)
18 /* Duplicate STR as `strdup' does, but never return NULL.  */
19 {
20   char *tmp = xmalloc (strlen(str) + 1);
21   strcpy (tmp, str);
22   return  tmp;
23 }
24 
25 size_t
xstrnlen(const char * str,size_t size)26 xstrnlen (const char *str, size_t size)
27 {
28   size_t  n = 0;
29   while (n<size && str[n])  ++n;
30   return  n;
31 }
32 
33 char *
xstrndup(const char * str,size_t size)34 xstrndup (const char *str, size_t size)
35 /* Like `strndup' from glibc, but never returns NULL.  */
36 {
37   size_t  n = xstrnlen (str, size);
38   char *tmp = xmalloc (n + 1);
39 
40   if (tmp == NULL)  fatal ("Memory exhausted");
41   strncpy (tmp, str, n);
42   tmp[n] = '\0';
43 
44   return  tmp;
45 }
46