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