xref: /freebsd/contrib/bmake/make_malloc.c (revision 9f45a3c8c82ffead7044ae836d9257113c630d3b)
1  /*	$NetBSD: make_malloc.c,v 1.26 2022/01/07 08:30:04 rillig Exp $	*/
2  
3  /*
4   * Copyright (c) 2009 The NetBSD Foundation, Inc.
5   * All rights reserved.
6   *
7   * Redistribution and use in source and binary forms, with or without
8   * modification, are permitted provided that the following conditions
9   * are met:
10   * 1. Redistributions of source code must retain the above copyright
11   *    notice, this list of conditions and the following disclaimer.
12   * 2. Redistributions in binary form must reproduce the above copyright
13   *    notice, this list of conditions and the following disclaimer in the
14   *    documentation and/or other materials provided with the distribution.
15   *
16   * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17   * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26   * POSSIBILITY OF SUCH DAMAGE.
27   */
28  
29  #include <errno.h>
30  
31  #include "make.h"
32  
33  MAKE_RCSID("$NetBSD: make_malloc.c,v 1.26 2022/01/07 08:30:04 rillig Exp $");
34  
35  #ifndef USE_EMALLOC
36  
37  /* die when out of memory. */
38  static MAKE_ATTR_DEAD void
enomem(void)39  enomem(void)
40  {
41  	(void)fprintf(stderr, "%s: %s.\n", progname, strerror(ENOMEM));
42  	exit(2);
43  }
44  
45  /* malloc, but die on error. */
46  void *
bmake_malloc(size_t len)47  bmake_malloc(size_t len)
48  {
49  	void *p;
50  
51  	if ((p = malloc(len)) == NULL)
52  		enomem();
53  	return p;
54  }
55  
56  /* strdup, but die on error. */
57  char *
bmake_strdup(const char * str)58  bmake_strdup(const char *str)
59  {
60  	size_t size;
61  	char *p;
62  
63  	size = strlen(str) + 1;
64  	p = bmake_malloc(size);
65  	return memcpy(p, str, size);
66  }
67  
68  /* Allocate a string starting from str with exactly len characters. */
69  char *
bmake_strldup(const char * str,size_t len)70  bmake_strldup(const char *str, size_t len)
71  {
72  	char *p = bmake_malloc(len + 1);
73  	memcpy(p, str, len);
74  	p[len] = '\0';
75  	return p;
76  }
77  
78  /* realloc, but die on error. */
79  void *
bmake_realloc(void * ptr,size_t size)80  bmake_realloc(void *ptr, size_t size)
81  {
82  	if ((ptr = realloc(ptr, size)) == NULL)
83  		enomem();
84  	return ptr;
85  }
86  #endif
87  
88  /* Allocate a string from start up to but excluding end. */
89  char *
bmake_strsedup(const char * start,const char * end)90  bmake_strsedup(const char *start, const char *end)
91  {
92  	return bmake_strldup(start, (size_t)(end - start));
93  }
94