xmalloc.c revision 1.1.1.2
1/* $Id: xmalloc.c,v 1.1.1.2 2011/08/17 18:40:05 jmmv Exp $ */
2
3/*
4 * Copyright (c) 2004 Nicholas Marriott <nicm@users.sourceforge.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/param.h>
20
21#include <errno.h>
22#include <libgen.h>
23#include <stdlib.h>
24#include <string.h>
25
26#include "tmux.h"
27
28char *
29xstrdup(const char *s)
30{
31	char	*ptr;
32	size_t	 len;
33
34	len = strlen(s) + 1;
35	ptr = xmalloc(len);
36
37	strlcpy(ptr, s, len);
38	return (ptr);
39}
40
41void *
42xcalloc(size_t nmemb, size_t size)
43{
44	void	*ptr;
45
46	if (size == 0 || nmemb == 0)
47		fatalx("zero size");
48	if (SIZE_MAX / nmemb < size)
49		fatalx("nmemb * size > SIZE_MAX");
50	if ((ptr = calloc(nmemb, size)) == NULL)
51		fatal("xcalloc failed");
52
53	return (ptr);
54}
55
56void *
57xmalloc(size_t size)
58{
59	void	*ptr;
60
61	if (size == 0)
62		fatalx("zero size");
63	if ((ptr = malloc(size)) == NULL)
64		fatal("xmalloc failed");
65
66	return (ptr);
67}
68
69void *
70xrealloc(void *oldptr, size_t nmemb, size_t size)
71{
72	size_t	 newsize = nmemb * size;
73	void	*newptr;
74
75	if (newsize == 0)
76		fatalx("zero size");
77	if (SIZE_MAX / nmemb < size)
78		fatalx("nmemb * size > SIZE_MAX");
79	if ((newptr = realloc(oldptr, newsize)) == NULL)
80		fatal("xrealloc failed");
81
82	return (newptr);
83}
84
85void
86xfree(void *ptr)
87{
88	if (ptr == NULL)
89		fatalx("null pointer");
90	free(ptr);
91}
92
93int printflike2
94xasprintf(char **ret, const char *fmt, ...)
95{
96	va_list ap;
97	int	i;
98
99	va_start(ap, fmt);
100	i = xvasprintf(ret, fmt, ap);
101	va_end(ap);
102
103	return (i);
104}
105
106int
107xvasprintf(char **ret, const char *fmt, va_list ap)
108{
109	int	i;
110
111	i = vasprintf(ret, fmt, ap);
112	if (i < 0 || *ret == NULL)
113		fatal("xvasprintf failed");
114
115	return (i);
116}
117
118int printflike3
119xsnprintf(char *buf, size_t len, const char *fmt, ...)
120{
121	va_list ap;
122	int	i;
123
124	va_start(ap, fmt);
125	i = xvsnprintf(buf, len, fmt, ap);
126	va_end(ap);
127
128	return (i);
129}
130
131int
132xvsnprintf(char *buf, size_t len, const char *fmt, va_list ap)
133{
134	int	i;
135
136	if (len > INT_MAX)
137		fatalx("len > INT_MAX");
138
139	i = vsnprintf(buf, len, fmt, ap);
140	if (i < 0)
141		fatal("vsnprintf failed");
142
143	return (i);
144}
145