1 /* $OpenBSD$ */ 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/types.h> 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 { 30 char *ptr; 31 size_t len; 32 33 len = strlen(s) + 1; 34 ptr = xmalloc(len); 35 36 strlcpy(ptr, s, len); 37 return (ptr); 38 } 39 40 void * 41 xcalloc(size_t nmemb, size_t size) 42 { 43 void *ptr; 44 45 if (size == 0 || nmemb == 0) 46 fatalx("zero size"); 47 if (SIZE_MAX / nmemb < size) 48 fatalx("nmemb * size > SIZE_MAX"); 49 if ((ptr = calloc(nmemb, size)) == NULL) 50 fatal("xcalloc failed"); 51 52 return (ptr); 53 } 54 55 void * 56 xmalloc(size_t size) 57 { 58 void *ptr; 59 60 if (size == 0) 61 fatalx("zero size"); 62 if ((ptr = malloc(size)) == NULL) 63 fatal("xmalloc failed"); 64 65 return (ptr); 66 } 67 68 void * 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) 83 { 84 size_t newsize = nmemb * size; 85 void *newptr; 86 87 if (newsize == 0) 88 fatalx("zero size"); 89 if (SIZE_MAX / nmemb < size) 90 fatalx("nmemb * size > SIZE_MAX"); 91 if ((newptr = realloc(oldptr, newsize)) == NULL) 92 fatal("xreallocarray failed"); 93 94 return (newptr); 95 } 96 97 int 98 xasprintf(char **ret, const char *fmt, ...) 99 { 100 va_list ap; 101 int i; 102 103 va_start(ap, fmt); 104 i = xvasprintf(ret, fmt, ap); 105 va_end(ap); 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); 116 if (i < 0 || *ret == NULL) 117 fatal("xvasprintf failed"); 118 119 return (i); 120 } 121 122 int 123 xsnprintf(char *buf, size_t len, const char *fmt, ...) 124 { 125 va_list ap; 126 int i; 127 128 va_start(ap, fmt); 129 i = xvsnprintf(buf, len, fmt, ap); 130 va_end(ap); 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); 144 if (i < 0) 145 fatal("vsnprintf failed"); 146 147 return (i); 148 } 149