Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* memory allocation routines with error checking.
  2.    Copyright 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
  3.    
  4. This file is part of the libiberty library.
  5. Libiberty is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Library General Public
  7. License as published by the Free Software Foundation; either
  8. version 2 of the License, or (at your option) any later version.
  9.  
  10. Libiberty is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. Library General Public License for more details.
  14.  
  15. You should have received a copy of the GNU Library General Public
  16. License along with libiberty; see the file COPYING.LIB.  If
  17. not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
  18. Boston, MA 02110-1301, USA.  */
  19.  
  20. /*
  21.  
  22. @deftypefn Replacement void* xmalloc (size_t)
  23.  
  24. Allocate memory without fail.  If @code{malloc} fails, this will print
  25. a message to @code{stderr} (using the name set by
  26. @code{xmalloc_set_program_name},
  27. if any) and then call @code{xexit}.  Note that it is therefore safe for
  28. a program to contain @code{#define malloc xmalloc} in its source.
  29.  
  30. @end deftypefn
  31.  
  32. @deftypefn Replacement void* xrealloc (void *@var{ptr}, size_t @var{size})
  33. Reallocate memory without fail.  This routine functions like @code{realloc},
  34. but will behave the same as @code{xmalloc} if memory cannot be found.
  35.  
  36. @end deftypefn
  37.  
  38. @deftypefn Replacement void* xcalloc (size_t @var{nelem}, size_t @var{elsize})
  39.  
  40. Allocate memory without fail, and set it to zero.  This routine functions
  41. like @code{calloc}, but will behave the same as @code{xmalloc} if memory
  42. cannot be found.
  43.  
  44. @end deftypefn
  45.  
  46. @deftypefn Replacement void xmalloc_set_program_name (const char *@var{name})
  47.  
  48. You can use this to set the name of the program used by
  49. @code{xmalloc_failed} when printing a failure message.
  50.  
  51. @end deftypefn
  52.  
  53. @deftypefn Replacement void xmalloc_failed (size_t)
  54.  
  55. This function is not meant to be called by client code, and is listed
  56. here for completeness only.  If any of the allocation routines fail, this
  57. function will be called to print an error message and terminate execution.
  58.  
  59. @end deftypefn
  60.  
  61. */
  62.  
  63. #ifdef HAVE_CONFIG_H
  64. #include "config.h"
  65. #endif
  66. #include "ansidecl.h"
  67. #include "libiberty.h"
  68.  
  69. #include <stdio.h>
  70.  
  71. #include <stddef.h>
  72.  
  73. #if VMS
  74. #include <stdlib.h>
  75. #include <unixlib.h>
  76. #else
  77. /* For systems with larger pointers than ints, these must be declared.  */
  78. #  if HAVE_STDLIB_H && HAVE_UNISTD_H && HAVE_DECL_MALLOC \
  79.       && HAVE_DECL_REALLOC && HAVE_DECL_CALLOC && HAVE_DECL_SBRK
  80. #    include <stdlib.h>
  81. #    include <unistd.h>
  82. #  else
  83. #    ifdef __cplusplus
  84. extern "C" {
  85. #    endif /* __cplusplus */
  86. void *malloc (size_t);
  87. void *realloc (void *, size_t);
  88. void *calloc (size_t, size_t);
  89. void *sbrk (ptrdiff_t);
  90. #    ifdef __cplusplus
  91. }
  92. #    endif /* __cplusplus */
  93. #  endif /* HAVE_STDLIB_H ...  */
  94. #endif /* VMS */
  95.  
  96. /* The program name if set.  */
  97. static const char *name = "";
  98.  
  99. #ifdef HAVE_SBRK
  100. /* The initial sbrk, set when the program name is set. Not used for win32
  101.    ports other than cygwin32.  */
  102. static char *first_break = NULL;
  103. #endif /* HAVE_SBRK */
  104.  
  105. void
  106. xmalloc_set_program_name (const char *s)
  107. {
  108.   name = s;
  109. #ifdef HAVE_SBRK
  110.   /* Win32 ports other than cygwin32 don't have brk() */
  111.   if (first_break == NULL)
  112.     first_break = (char *) sbrk (0);
  113. #endif /* HAVE_SBRK */
  114. }
  115.  
  116. void
  117. xmalloc_failed (size_t size)
  118. {
  119. #ifdef HAVE_SBRK
  120.   extern char **environ;
  121.   size_t allocated;
  122.  
  123.   if (first_break != NULL)
  124.     allocated = (char *) sbrk (0) - first_break;
  125.   else
  126.     allocated = (char *) sbrk (0) - (char *) &environ;
  127.   fprintf (stderr,
  128.            "\n%s%sout of memory allocating %lu bytes after a total of %lu bytes\n",
  129.            name, *name ? ": " : "",
  130.            (unsigned long) size, (unsigned long) allocated);
  131. #else /* HAVE_SBRK */
  132.   fprintf (stderr,
  133.            "\n%s%sout of memory allocating %lu bytes\n",
  134.            name, *name ? ": " : "",
  135.            (unsigned long) size);
  136. #endif /* HAVE_SBRK */
  137.   xexit (1);
  138. }  
  139.  
  140. PTR
  141. xmalloc (size_t size)
  142. {
  143.   PTR newmem;
  144.  
  145.   if (size == 0)
  146.     size = 1;
  147.   newmem = malloc (size);
  148.   if (!newmem)
  149.     xmalloc_failed (size);
  150.  
  151.   return (newmem);
  152. }
  153.  
  154. PTR
  155. xcalloc (size_t nelem, size_t elsize)
  156. {
  157.   PTR newmem;
  158.  
  159.   if (nelem == 0 || elsize == 0)
  160.     nelem = elsize = 1;
  161.  
  162.   newmem = calloc (nelem, elsize);
  163.   if (!newmem)
  164.     xmalloc_failed (nelem * elsize);
  165.  
  166.   return (newmem);
  167. }
  168.  
  169. PTR
  170. xrealloc (PTR oldmem, size_t size)
  171. {
  172.   PTR newmem;
  173.  
  174.   if (size == 0)
  175.     size = 1;
  176.   if (!oldmem)
  177.     newmem = malloc (size);
  178.   else
  179.     newmem = realloc (oldmem, size);
  180.   if (!newmem)
  181.     xmalloc_failed (size);
  182.  
  183.   return (newmem);
  184. }
  185.