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