home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume20 / hp2pk / part02 / myalloc.c < prev    next >
C/C++ Source or Header  |  1991-06-02  |  6KB  |  232 lines

  1. /*  MYALLOC.C - "safe" memory allocation functions
  2.  ***************************************************************************
  3.  *
  4.  *    char *myalloc(size)
  5.  *    unsigned size;
  6.  *
  7.  *    char *mystrdup(str)
  8.  *    char *str;
  9.  *
  10.  *    char *myrealloc(s,size)
  11.  *    char *s;
  12.  *    unsigned size;
  13.  *
  14.  *    char *myshrink(s)
  15.  *    char *s;
  16.  *
  17.  *    void myfree(s)
  18.  *    char *s;
  19.  *
  20.  *    void myalloc_fail()
  21.  *    char myalloc_errmsg[101]
  22.  *
  23.  ***************************************************************************
  24.  *    EDIT HISTORY
  25.  *    28-Jul-88    Steve McConnel - write the original code
  26.  *     1-Aug-88    SRMc - delinted
  27.  *    25-Aug-88    SRMc - regularized error messages
  28.  *                 - change errmsg to errloc
  29.  *    21-Oct-88    SRMc - remove register from function parameter
  30.  *                declarations
  31.  *                 - reorganize the file header comments
  32.  *    10-Nov-88    SRMc - add myfree()
  33.  *     4-Jan-89    SRMc - fix for Microsoft C
  34.  *    22-Mar-89    SRMc - nomem() is no longer a static function
  35.  *    20-May-89    SRMc - remove #include "dict.h"
  36.  *                 - change errloc to 101 rather than MAXMORPH+1
  37.  *                bytes long (removed need for defs.h)
  38.  *                 - rename errloc to myalloc_errmsg
  39.  *                 - added mystrdup(),
  40.  *                 - removed reliance on errexit()
  41.  *    13-Jul-89    hab  - de-"lint" the source
  42.  *    31-Jul-89    rk   - mods for MacIntosh Lightspeed's Think_C
  43.  *    19-Oct-90    SRMc - rename file from MYALLO.C to MYALLOC.C
  44.  *                 - fix myrealloc() to work properly
  45.  *                 - rename nomem() to myalloc_fail()
  46.  *    14-Jan-91    SRMc - add TURBO C patches from Thomas B. Ridgeway
  47.  *                (ridgeway@blackbox.hacc.washington.edu)
  48.  *    15-Jan-91    SRMc - refix for Macintosh Lightspeed THINK C
  49.  *     2-Mar-91    SRMc - add myshrink(), which disappeared sometime ago
  50.  *            SRMc - revise myrealloc() to call malloc() if it's
  51.  *                handed a NULL pointer (as in PCKFUNCS.C)
  52.  ***************************************************************************
  53.  * Copyright 1988, 1991 by the Summer Institute of Linguistics, Inc.
  54.  * All rights reserved.
  55.  */
  56. /*#define TURBO_C*/        /* uncomment if using MSDOS TURBO C */
  57. #include <stdio.h>
  58.  
  59. /*#ifdef THINK_C*/
  60. /*#include <storage.h>*/
  61. /*#include <strings.h>*/
  62. /*#else*/
  63. #ifdef BSD
  64. #include <strings.h>
  65. extern char *memset();
  66. #else
  67. #ifdef TURBO_C
  68. #include <mem.h>
  69. #define MSDOS
  70. #else
  71. #ifndef THINK_C        /* THINK C includes memxxx() functions in <string.h> */
  72. #include <memory.h>
  73. #endif
  74. #endif
  75. #include <string.h>
  76. #endif
  77. extern char *malloc(), *realloc();
  78. extern void free();
  79. /*#endif*/
  80. extern int isatty();
  81. extern void exit();
  82.  
  83. /************************************************************************/
  84. /*                GLOBAL VARIABLES                */
  85. /************************************************************************/
  86.  
  87. char myalloc_errmsg[101];        /* globally settable by callers */
  88.  
  89. /***************************************************************************
  90.  * NAME
  91.  *    myalloc_fail
  92.  * ARGUMENTS
  93.  *    none
  94.  * DESCRIPTION
  95.  *    Die with an appropriate error message.
  96.  * RETURN VALUE
  97.  *    doesn't return!
  98.  */
  99. void myalloc_fail()
  100. {
  101. if (*myalloc_errmsg)
  102.     {
  103.     fprintf(stderr,"\nALLOCATE MEMORY: No space left at: %s\n",
  104.                             myalloc_errmsg);
  105.     if (!isatty(fileno(stdout)))
  106.     printf("\nALLOCATE MEMORY: No space left at: %s\n",
  107.                             myalloc_errmsg);
  108.     }
  109. else
  110.     {
  111.     fprintf(stderr,"\nALLOCATE MEMORY: No space left\n");
  112.     if (!isatty(fileno(stdout)))
  113.     printf("\nALLOCATE MEMORY: No space left\n");
  114.     }
  115. exit(2);
  116. }
  117.  
  118. /***************************************************************************
  119.  * NAME
  120.  *    myalloc
  121.  * ARGUMENTS
  122.  *    size - number of bytes to allocate
  123.  * DESCRIPTION
  124.  *    "Safe" interface to malloc() -- abort the program with an error message
  125.  *    if we run out of memory.
  126.  * RETURN VALUE
  127.  *    pointer to beginning of area allocated
  128.  */
  129. char *myalloc(size)
  130. unsigned size;
  131. {
  132. register char *p;
  133.  
  134. #ifdef THINK_C
  135. p = malloc((size_t)size);
  136. #else
  137. p = malloc(size);
  138. #endif
  139. if (p == (char *)NULL)
  140.     myalloc_fail();
  141. memset(p, 0, size);
  142. return(p);
  143. }
  144.  
  145. /***************************************************************************
  146.  * NAME
  147.  *    mystrdup
  148.  * ARGUMENTS
  149.  *    str - pointer to character string to duplicate
  150.  * DESCRIPTION
  151.  *    Create a duplicate of an existing NUL-terminated character string.
  152.  * RETURN VALUE
  153.  *    pointer to the newly allocated and copied duplicate
  154.  */
  155. char *mystrdup(str)
  156. char *str;
  157. {
  158. return( strcpy(myalloc((unsigned)strlen(str)+1), str) );
  159. }
  160.  
  161. /***************************************************************************
  162.  * NAME
  163.  *    myrealloc
  164.  * ARGUMENTS
  165.  *    s    - pointer to string in allocated buffer
  166.  *    size - new (?) size desired
  167.  * DESCRIPTION
  168.  *    Resize the allocated buffer to the desired size.
  169.  *    Abort the program with an error message if we run out of memory.
  170.  * RETURN VALUE
  171.  *    pointer to reallocated block
  172.  */
  173. char *myrealloc(s,size)
  174. char *s;
  175. unsigned size;
  176. {
  177. register char *p;
  178.  
  179. if (s == NULL)
  180.     return( myalloc(size) );
  181. #ifdef THINK_C
  182. p = realloc( s, (size_t)size );
  183. #else
  184. p = realloc( s, size );
  185. #endif
  186. if (p == (char *)NULL)
  187.     myalloc_fail();
  188. return( p );
  189. }
  190.  
  191. /***************************************************************************
  192.  * NAME
  193.  *    myshrink
  194.  * ARGUMENTS
  195.  *    s - pointer to string in overlarge allocated buffer
  196.  * DESCRIPTION
  197.  *    Shrink the allocated buffer to exactly fit the string.  Abort the
  198.  *    program with an error message if we somehow run out of memory.
  199.  * RETURN VALUE
  200.  *    pointer to reallocated block
  201.  */
  202. char *myshrink(s)
  203. char *s;
  204. {
  205. register char *p;
  206.  
  207. if (s == (char *)NULL)
  208.     return((char *)NULL);
  209. p = realloc( s, (unsigned)strlen(s)+1 );
  210. if (p == (char *)NULL)
  211.     myalloc_fail();
  212. return( p );
  213. }
  214.  
  215. /***************************************************************************
  216.  * NAME
  217.  *    myfree
  218.  * ARGUMENTS
  219.  *    s - pointer to block to deallocate
  220.  * DESCRIPTION
  221.  *    interface to free() -- release previously allocated memory
  222.  * RETURN VALUE
  223.  *    none
  224.  */
  225. void myfree(s)
  226. char *s;
  227. {
  228. if (s == (char *)NULL)
  229.     return;        /* protect against braindead callers */
  230. free(s);
  231. }
  232.