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