1 /* Shared general utility routines for GDB, the GNU debugger. 2 3 Copyright (C) 1986-2013 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #ifdef GDBSERVER 21 #include "server.h" 22 #else 23 #include "defs.h" 24 #endif 25 26 #include "gdb_assert.h" 27 #include "gdb_string.h" 28 29 #include <stdlib.h> 30 #include <stdio.h> 31 32 /* The xmalloc() (libiberty.h) family of memory management routines. 33 34 These are like the ISO-C malloc() family except that they implement 35 consistent semantics and guard against typical memory management 36 problems. */ 37 38 /* NOTE: These are declared using PTR to ensure consistency with 39 "libiberty.h". xfree() is GDB local. */ 40 41 PTR /* ARI: PTR */ 42 xmalloc (size_t size) 43 { 44 void *val; 45 46 /* See libiberty/xmalloc.c. This function need's to match that's 47 semantics. It never returns NULL. */ 48 if (size == 0) 49 size = 1; 50 51 val = malloc (size); /* ARI: malloc */ 52 if (val == NULL) 53 malloc_failure (size); 54 55 return val; 56 } 57 58 PTR /* ARI: PTR */ 59 xrealloc (PTR ptr, size_t size) /* ARI: PTR */ 60 { 61 void *val; 62 63 /* See libiberty/xmalloc.c. This function need's to match that's 64 semantics. It never returns NULL. */ 65 if (size == 0) 66 size = 1; 67 68 if (ptr != NULL) 69 val = realloc (ptr, size); /* ARI: realloc */ 70 else 71 val = malloc (size); /* ARI: malloc */ 72 if (val == NULL) 73 malloc_failure (size); 74 75 return val; 76 } 77 78 PTR /* ARI: PTR */ 79 xcalloc (size_t number, size_t size) 80 { 81 void *mem; 82 83 /* See libiberty/xmalloc.c. This function need's to match that's 84 semantics. It never returns NULL. */ 85 if (number == 0 || size == 0) 86 { 87 number = 1; 88 size = 1; 89 } 90 91 mem = calloc (number, size); /* ARI: xcalloc */ 92 if (mem == NULL) 93 malloc_failure (number * size); 94 95 return mem; 96 } 97 98 void * 99 xzalloc (size_t size) 100 { 101 return xcalloc (1, size); 102 } 103 104 void 105 xfree (void *ptr) 106 { 107 if (ptr != NULL) 108 free (ptr); /* ARI: free */ 109 } 110 111 /* Like asprintf/vasprintf but get an internal_error if the call 112 fails. */ 113 114 char * 115 xstrprintf (const char *format, ...) 116 { 117 char *ret; 118 va_list args; 119 120 va_start (args, format); 121 ret = xstrvprintf (format, args); 122 va_end (args); 123 return ret; 124 } 125 126 char * 127 xstrvprintf (const char *format, va_list ap) 128 { 129 char *ret = NULL; 130 int status = vasprintf (&ret, format, ap); 131 132 /* NULL is returned when there was a memory allocation problem, or 133 any other error (for instance, a bad format string). A negative 134 status (the printed length) with a non-NULL buffer should never 135 happen, but just to be sure. */ 136 if (ret == NULL || status < 0) 137 internal_error (__FILE__, __LINE__, _("vasprintf call failed")); 138 return ret; 139 } 140 141 int 142 xsnprintf (char *str, size_t size, const char *format, ...) 143 { 144 va_list args; 145 int ret; 146 147 va_start (args, format); 148 ret = vsnprintf (str, size, format, args); 149 gdb_assert (ret < size); 150 va_end (args); 151 152 return ret; 153 } 154 155 char * 156 savestring (const char *ptr, size_t len) 157 { 158 char *p = (char *) xmalloc (len + 1); 159 160 memcpy (p, ptr, len); 161 p[len] = 0; 162 return p; 163 } 164