make_malloc.c revision 241146
1251881Speter/* $NetBSD: make_malloc.c,v 1.10 2012/06/20 17:46:28 sjg Exp $ */ 2251881Speter 3251881Speter/*- 4251881Speter * Copyright (c) 2009 The NetBSD Foundation, Inc. 5251881Speter * All rights reserved. 6251881Speter * 7251881Speter * Redistribution and use in source and binary forms, with or without 8251881Speter * modification, are permitted provided that the following conditions 9251881Speter * are met: 10251881Speter * 1. Redistributions of source code must retain the above copyright 11251881Speter * notice, this list of conditions and the following disclaimer. 12251881Speter * 2. Redistributions in binary form must reproduce the above copyright 13251881Speter * notice, this list of conditions and the following disclaimer in the 14251881Speter * documentation and/or other materials provided with the distribution. 15251881Speter * 16251881Speter * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17251881Speter * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18251881Speter * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19251881Speter * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20251881Speter * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21251881Speter * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22251881Speter * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23251881Speter * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24251881Speter * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25251881Speter * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26251881Speter * POSSIBILITY OF SUCH DAMAGE. 27251881Speter */ 28251881Speter 29251881Speter#ifdef MAKE_NATIVE 30251881Speter#include <sys/cdefs.h> 31251881Speter__RCSID("$NetBSD: make_malloc.c,v 1.10 2012/06/20 17:46:28 sjg Exp $"); 32251881Speter#endif 33251881Speter 34251881Speter#include <stdio.h> 35251881Speter#include <stdlib.h> 36251881Speter#include <string.h> 37299742Sdim#include <errno.h> 38251881Speter 39251881Speter#include "make.h" 40251881Speter 41251881Speter#ifndef USE_EMALLOC 42251881Speterstatic void enomem(void) MAKE_ATTR_DEAD; 43251881Speter 44251881Speter/* 45251881Speter * enomem -- 46251881Speter * die when out of memory. 47251881Speter */ 48251881Speterstatic void 49251881Speterenomem(void) 50251881Speter{ 51251881Speter (void)fprintf(stderr, "%s: %s.\n", progname, strerror(ENOMEM)); 52299742Sdim exit(2); 53251881Speter} 54251881Speter 55251881Speter/* 56251881Speter * bmake_malloc -- 57251881Speter * malloc, but die on error. 58251881Speter */ 59251881Spetervoid * 60251881Speterbmake_malloc(size_t len) 61251881Speter{ 62251881Speter void *p; 63251881Speter 64251881Speter if ((p = malloc(len)) == NULL) 65251881Speter enomem(); 66251881Speter return(p); 67251881Speter} 68251881Speter 69251881Speter/* 70251881Speter * bmake_strdup -- 71251881Speter * strdup, but die on error. 72251881Speter */ 73251881Speterchar * 74251881Speterbmake_strdup(const char *str) 75251881Speter{ 76251881Speter size_t len; 77251881Speter char *p; 78251881Speter 79251881Speter len = strlen(str) + 1; 80251881Speter if ((p = malloc(len)) == NULL) 81251881Speter enomem(); 82251881Speter return memcpy(p, str, len); 83251881Speter} 84251881Speter 85251881Speter/* 86251881Speter * bmake_strndup -- 87251881Speter * strndup, but die on error. 88251881Speter */ 89251881Speterchar * 90251881Speterbmake_strndup(const char *str, size_t max_len) 91251881Speter{ 92251881Speter size_t len; 93251881Speter char *p; 94251881Speter 95251881Speter if (str == NULL) 96251881Speter return NULL; 97251881Speter 98251881Speter len = strlen(str); 99251881Speter if (len > max_len) 100251881Speter len = max_len; 101251881Speter p = bmake_malloc(len + 1); 102251881Speter memcpy(p, str, len); 103251881Speter p[len] = '\0'; 104251881Speter 105251881Speter return(p); 106251881Speter} 107251881Speter 108251881Speter/* 109251881Speter * bmake_realloc -- 110251881Speter * realloc, but die on error. 111251881Speter */ 112251881Spetervoid * 113251881Speterbmake_realloc(void *ptr, size_t size) 114251881Speter{ 115251881Speter if ((ptr = realloc(ptr, size)) == NULL) 116251881Speter enomem(); 117251881Speter return(ptr); 118251881Speter} 119251881Speter#endif 120251881Speter