File: alloc.c

package info (click to toggle)
mcl 1%3A02-035-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 2,108 kB
  • ctags: 1,361
  • sloc: ansic: 18,031; sh: 453; makefile: 234
file content (115 lines) | stat: -rw-r--r-- 2,194 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
 *    Copyright (C) 1999-2002 Stijn van Dongen.
*/

#include "alloc.h"
#include "compile.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>



void* mcxRealloc
(  void*             object
,  int               new_size
,  mcxOnFail         ON_FAIL
)
   {  void*          mblock   =  NULL
   ;  int            status   =  0
   ;
      if (new_size < 0)
      {  fprintf
         (  stderr
         ,  "[mcxRealloc PBD] negative amount [%d] requested\n"
         ,  new_size
         )
      ;  status   =  1
   ;  }
      else
      {  mblock      
         =  (object && new_size)
            ?  realloc(object, new_size)
            :     new_size
                  ?   malloc(new_size)
                  :   NULL
   ;  }

      if (new_size && (!mblock))
         mcxMemDenied(stderr, "mcxRealloc", "byte", new_size)
      ,  status   =  1
   ;
      if (status)
      {  if (ON_FAIL == SLEEP_ON_FAIL)
         {  fprintf(stderr, "[mcxRealloc] entering sleep mode\n")
         ;  while(1) sleep(1000)
      ;  }

      ;  if (ON_FAIL == EXIT_ON_FAIL)
         {  fprintf(stderr, "[mcxRealloc] entering sleep mode\n")
         ;  while(1) sleep(1000)
      ;  }
   ;  }

      return mblock
;  }


void* mcxNAlloc
(  int               n_elem
,  int               elem_size
,  void* (*obInit) (void *)
,  mcxOnFail         ON_FAIL
)
   {  char*    ob
   ;  void*    mblock   =  mcxRealloc(NULL, n_elem * elem_size, ON_FAIL)
   ;
      if (!mblock)
      return NULL
   ;
      if (obInit)
      {  ob  =  mblock

      ;  while (--n_elem >= 0)
         {  obInit(ob)
         ;  ob += elem_size
      ;  }
   ;  }

      return (mblock)
;  }


void mcxMemDenied
(  FILE*             channel
,  const char*       requestee
,  const char*       unittype
,  int               n
)
   {  fprintf
      (  channel
      ,  "[%s: Memory shortage] could not alloc [%d] instances of [%s]\n"
      ,  requestee
      ,  n
      ,  unittype
      )
;  }


void mcxFree
(  void*             object
)
   {  if (object) free(object)
;  }


my_inline void* mcxAlloc
(  int               size
,  mcxOnFail         ON_FAIL
)
   {  return mcxRealloc(NULL, size, ON_FAIL)
;  }