Annotation of src/usr.bin/tmux/xmalloc.c, Revision 1.7
1.7 ! nicm 1: /* $OpenBSD: xmalloc.c,v 1.6 2014/10/20 23:27:14 nicm Exp $ */
1.1 nicm 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:
1.6 nicm 19: #include <sys/types.h>
1.1 nicm 20:
21: #include <stdint.h>
22: #include <stdlib.h>
23: #include <string.h>
24:
25: #include "tmux.h"
26:
27: char *
28: xstrdup(const char *s)
29: {
1.2 nicm 30: char *ptr;
1.1 nicm 31: size_t len;
32:
33: len = strlen(s) + 1;
34: ptr = xmalloc(len);
35:
1.2 nicm 36: strlcpy(ptr, s, len);
37: return (ptr);
1.1 nicm 38: }
39:
40: void *
41: xcalloc(size_t nmemb, size_t size)
42: {
1.3 deraadt 43: void *ptr;
1.1 nicm 44:
1.3 deraadt 45: if (size == 0 || nmemb == 0)
1.1 nicm 46: fatalx("zero size");
1.3 deraadt 47: if (SIZE_MAX / nmemb < size)
48: fatalx("nmemb * size > SIZE_MAX");
49: if ((ptr = calloc(nmemb, size)) == NULL)
1.1 nicm 50: fatal("xcalloc failed");
51:
1.3 deraadt 52: return (ptr);
1.1 nicm 53: }
54:
55: void *
56: xmalloc(size_t size)
57: {
58: void *ptr;
59:
1.3 deraadt 60: if (size == 0)
61: fatalx("zero size");
62: if ((ptr = malloc(size)) == NULL)
1.1 nicm 63: fatal("xmalloc failed");
64:
1.3 deraadt 65: return (ptr);
1.1 nicm 66: }
67:
68: void *
1.5 nicm 69: xrealloc(void *oldptr, size_t newsize)
70: {
71: void *newptr;
72:
73: if (newsize == 0)
74: fatalx("zero size");
75: if ((newptr = realloc(oldptr, newsize)) == NULL)
76: fatal("xrealloc failed");
77:
78: return (newptr);
79: }
80:
81: void *
82: xreallocarray(void *oldptr, size_t nmemb, size_t size)
1.1 nicm 83: {
84: size_t newsize = nmemb * size;
85: void *newptr;
86:
87: if (newsize == 0)
1.3 deraadt 88: fatalx("zero size");
89: if (SIZE_MAX / nmemb < size)
90: fatalx("nmemb * size > SIZE_MAX");
91: if ((newptr = realloc(oldptr, newsize)) == NULL)
1.5 nicm 92: fatal("xreallocarray failed");
1.1 nicm 93:
1.3 deraadt 94: return (newptr);
1.1 nicm 95: }
96:
1.7 ! nicm 97: int
1.1 nicm 98: xasprintf(char **ret, const char *fmt, ...)
99: {
1.3 deraadt 100: va_list ap;
101: int i;
1.1 nicm 102:
1.3 deraadt 103: va_start(ap, fmt);
104: i = xvasprintf(ret, fmt, ap);
105: va_end(ap);
1.1 nicm 106:
107: return (i);
108: }
109:
110: int
111: xvasprintf(char **ret, const char *fmt, va_list ap)
112: {
113: int i;
114:
115: i = vasprintf(ret, fmt, ap);
1.3 deraadt 116: if (i < 0 || *ret == NULL)
117: fatal("xvasprintf failed");
1.1 nicm 118:
1.3 deraadt 119: return (i);
1.1 nicm 120: }
121:
1.7 ! nicm 122: int
1.1 nicm 123: xsnprintf(char *buf, size_t len, const char *fmt, ...)
124: {
1.3 deraadt 125: va_list ap;
126: int i;
1.1 nicm 127:
1.3 deraadt 128: va_start(ap, fmt);
129: i = xvsnprintf(buf, len, fmt, ap);
130: va_end(ap);
1.1 nicm 131:
132: return (i);
133: }
134:
135: int
136: xvsnprintf(char *buf, size_t len, const char *fmt, va_list ap)
137: {
138: int i;
139:
140: if (len > INT_MAX)
141: fatalx("len > INT_MAX");
142:
143: i = vsnprintf(buf, len, fmt, ap);
1.3 deraadt 144: if (i < 0)
145: fatal("vsnprintf failed");
1.1 nicm 146:
1.3 deraadt 147: return (i);
1.1 nicm 148: }