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