home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Product / Product.zip / sc621_3.zip / src / xmalloc.c < prev    next >
C/C++ Source or Header  |  1993-11-21  |  2KB  |  88 lines

  1. /*
  2.  * A safer saner malloc, for careless programmers
  3.  * $Revision: 6.21 $
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <curses.h>
  8. #include "sc.h"
  9.  
  10. #if defined(STDC_HEADERS)
  11. #include <stdlib.h>
  12. #else
  13. extern    char *malloc();
  14. extern    char *realloc();
  15. extern    void free();
  16. #endif
  17. void    fatal();
  18.  
  19. #ifdef SYSV3
  20. extern void free();
  21. extern void exit();
  22. #endif
  23.  
  24. #define    MAGIC    (double)1234567890.12344
  25.  
  26. char *
  27. scxmalloc(n)
  28. unsigned n;
  29. {
  30.     register char *ptr;
  31.  
  32.     if ((ptr = malloc(n + sizeof(double))) == NULL)
  33.         fatal("scxmalloc: no memory");
  34.     *((double *) ptr) = MAGIC;        /* magic number */
  35.     return(ptr + sizeof(double));
  36. }
  37.  
  38. /* we make sure realloc will do a malloc if needed */
  39. char *
  40. scxrealloc(ptr, n)
  41. char    *ptr;
  42. unsigned n;
  43. {
  44.     if (ptr == NULL)
  45.         return(scxmalloc(n));
  46.  
  47.     ptr -= sizeof(double);
  48.     if (*((double *) ptr) != MAGIC)
  49.         fatal("scxrealloc: storage not scxmalloc'ed");
  50.  
  51.     if ((ptr = realloc(ptr, n + sizeof(double))) == NULL)
  52.         fatal("scxmalloc: no memory");
  53.     *((double *) ptr) = MAGIC;        /* magic number */
  54.     return(ptr + sizeof(double));
  55. }
  56.  
  57. void
  58. scxfree(p)
  59. char *p;
  60. {
  61.     if (p == NULL)
  62.         fatal("scxfree: NULL");
  63.     p -= sizeof(double);
  64.     if (*((double *) p) != MAGIC)
  65.         fatal("scxfree: storage not malloc'ed");
  66.     free(p);
  67. }
  68.  
  69. #ifdef PSC
  70. void
  71. fatal(str)
  72. char *str;
  73. {
  74.     (void) fprintf(stderr,"%s\n", str);
  75.     exit(1);
  76. }
  77. #else
  78. void
  79. fatal(str)
  80. char *str;
  81. {
  82.     deraw();
  83.     (void) fprintf(stderr,"%s\n", str);
  84.     diesave();
  85.     exit(1);
  86. }
  87. #endif /* PSC */
  88.