APPFS
Advanced practical programming for scientists
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
Macros | Functions
mshell.h File Reference

Go to the source code of this file.

Macros

#define malloc(a)   mem_malloc((a), __FILE__, __LINE__)
 
#define calloc(a, b)   mem_calloc((a), (b), __FILE__, __LINE__)
 
#define realloc(a, b)   mem_realloc((a), (b), __FILE__, __LINE__)
 
#define strdup(a)   mem_strdup((a), __FILE__, __LINE__)
 
#define free(a)   mem_free((a), __FILE__, __LINE__)
 
#define mem_check(a)   mem_check_x(a, __FILE__, __LINE__)
 
#define mem_check_all()   mem_check_all_x(__FILE__, __LINE__)
 
#define mem_hide(a)   mem_hide_x(a, __FILE__, __LINE__)
 

Functions

void * mem_malloc (size_t, const char *, const int)
 
void * mem_calloc (size_t, size_t, const char *, const int)
 
void * mem_realloc (void *, size_t, const char *, const int)
 
char * mem_strdup (const char *, const char *, const int)
 
void mem_free (void *, const char *, const int)
 
size_t mem_used (void)
 
void mem_maximum (FILE *fp)
 
void mem_display (FILE *fp)
 
void mem_check_x (const void *p, const char *file, const int line)
 
void mem_check_all_x (const char *file, const int line)
 
void mem_hide_x (void *p, const char *file, const int line)
 

Macro Definition Documentation

#define calloc (   a,
 
)    mem_calloc((a), (b), __FILE__, __LINE__)

Definition at line 54 of file mshell.h.

#define free (   a)    mem_free((a), __FILE__, __LINE__)

Definition at line 57 of file mshell.h.

#define malloc (   a)    mem_malloc((a), __FILE__, __LINE__)

Definition at line 53 of file mshell.h.

#define mem_check (   a)    mem_check_x(a, __FILE__, __LINE__)

Definition at line 71 of file mshell.h.

#define mem_check_all ( )    mem_check_all_x(__FILE__, __LINE__)

Definition at line 72 of file mshell.h.

#define mem_hide (   a)    mem_hide_x(a, __FILE__, __LINE__)

Definition at line 73 of file mshell.h.

#define realloc (   a,
 
)    mem_realloc((a), (b), __FILE__, __LINE__)

Definition at line 55 of file mshell.h.

#define strdup (   a)    mem_strdup((a), __FILE__, __LINE__)

Definition at line 56 of file mshell.h.

Function Documentation

void* mem_calloc ( size_t  ,
size_t  ,
const char *  ,
const int   
)

Definition at line 223 of file mshell.c.

228 {
229  const char* errmsg1 =
230  "mem_calloc(item=%u, size=%u, file=%s, line=%d): out of memory\n";
231  const char* errmsg2 =
232  "mem_calloc(item=%u, size=%u, file=%s, line=%d): zero item/size\n";
233 
234  MHDR* p;
235 
236  if (item == 0 || size == 0)
237  {
238  fprintf(stderr, errmsg2, item, size, file, line);
239  exit(EXIT_FAILURE);
240  }
241  if ((p = calloc(mem_alloc_size(size * item), sizeof(char))) == MHDR_NIL)
242  {
243  fprintf(stderr, errmsg1, item, size, file, line);
244  exit(EXIT_FAILURE);
245  }
246  p->tag1 = MEMTAG1;
247  p->tag2 = MEMTAG2;
248  p->size = size * item;
249  mem_size += size * item;
250  p->file = file;
251  p->line = line;
252  *mem_endptr(p) = ENDTAG;
253 
254  mem_add_list(p);
255 
256  return(HDR_2_CLIENT(p));
257 }
static unsigned long mem_size
Definition: mshell.c:72
static int * mem_endptr(MHDR *p)
Definition: mshell.c:86
int line
Definition: mshell.c:60
static size_t mem_alloc_size(size_t size)
Definition: mshell.c:78
#define MEMTAG1
Definition: mshell.c:48
#define MHDR_NIL
Definition: mshell.c:64
#define MEMTAG2
Definition: mshell.c:49
static void mem_add_list(MHDR *p)
Definition: mshell.c:99
unsigned short tag2
Definition: mshell.c:61
#define HDR_2_CLIENT(a)
Definition: mshell.c:70
#define ENDTAG
Definition: mshell.c:51
int size
Maximale Anzahl von Elementen in der Queue.
Definition: queue.c:25
#define calloc(a, b)
Definition: mshell.h:54
unsigned short tag1
Definition: mshell.c:55
char const * file
Definition: mshell.c:59
unsigned long size
Definition: mshell.c:56
Definition: mshell.c:53
void mem_check_all_x ( const char *  file,
const int  line 
)

Definition at line 411 of file mshell.c.

414 {
415  MHDR* p;
416 
417  for(p = memlist; p != MHDR_NIL; p = p->next)
418  mem_valid(p, file, line);
419 }
struct memnod * next
Definition: mshell.c:57
#define MHDR_NIL
Definition: mshell.c:64
static MHDR * memlist
Definition: mshell.c:74
static void mem_valid(MHDR *p, const char *file, const int line)
Definition: mshell.c:160
Definition: mshell.c:53
void mem_check_x ( const void *  p,
const char *  file,
const int  line 
)

Definition at line 401 of file mshell.c.

405 {
406  MHDR* p = CLIENT_2_HDR(ptr);
407 
408  mem_valid(p, file, line);
409 }
static void mem_valid(MHDR *p, const char *file, const int line)
Definition: mshell.c:160
#define CLIENT_2_HDR(a)
Definition: mshell.c:69
Definition: mshell.c:53
void mem_display ( FILE *  fp)

Definition at line 380 of file mshell.c.

382 {
383  MHDR* p;
384 
385  (void)fprintf(fp, "\nAddress Size File(Line) - total size %lu\n",
386  mem_size);
387 
388  for(p = memlist; p != MHDR_NIL; p = p->next)
389  {
390  (void)fprintf(fp, "%8lx %6lu %s(%d) %s %s\n",
391  (unsigned long)p,
392  p->size,
393  p->file,
394  p->line,
395  ((p->tag1 != MEMTAG1) || (p->tag2 != MEMTAG2)) ? "Invalid" : "",
396  (*mem_endptr(p) == ENDTAG) ? "ok" : "Clobbered");
397  }
398  mem_maximum(fp);
399 }
static unsigned long mem_size
Definition: mshell.c:72
static int * mem_endptr(MHDR *p)
Definition: mshell.c:86
int line
Definition: mshell.c:60
struct memnod * next
Definition: mshell.c:57
#define MEMTAG1
Definition: mshell.c:48
#define MHDR_NIL
Definition: mshell.c:64
#define MEMTAG2
Definition: mshell.c:49
static MHDR * memlist
Definition: mshell.c:74
unsigned short tag2
Definition: mshell.c:61
void mem_maximum(FILE *fp)
Definition: mshell.c:373
#define ENDTAG
Definition: mshell.c:51
unsigned short tag1
Definition: mshell.c:55
char const * file
Definition: mshell.c:59
unsigned long size
Definition: mshell.c:56
Definition: mshell.c:53
void mem_free ( void *  ,
const char *  ,
const int   
)

Definition at line 322 of file mshell.c.

326 {
327  const char *errmsg = "mem_free(file=%s, line=%d): null pointer\n";
328 
329  MHDR* p;
330 
331  if (ptr == NULL)
332  {
333  (void)fprintf(stderr, errmsg, file, line);
334  abort();
335  }
336  p = CLIENT_2_HDR(ptr);
337 
338  mem_valid(p, file, line);
339  mem_del_list(p);
340 
341  free(p);
342 }
static void mem_del_list(MHDR *p)
Definition: mshell.c:116
static void mem_valid(MHDR *p, const char *file, const int line)
Definition: mshell.c:160
#define CLIENT_2_HDR(a)
Definition: mshell.c:69
Definition: mshell.c:53
#define free(a)
Definition: mshell.h:57
void mem_hide_x ( void *  p,
const char *  file,
const int  line 
)

Definition at line 344 of file mshell.c.

348 {
349  const char *errmsg = "mem_checkout(file=%s, line=%d): null pointer\n";
350 
351  MHDR* p;
352 
353  if (ptr == NULL)
354  {
355  (void)fprintf(stderr, errmsg, file, line);
356  abort();
357  }
358  p = CLIENT_2_HDR(ptr);
359 
360  mem_valid(p, file, line);
361  mem_del_list(p);
362 
363  /* Size nicht verringern
364  */
365  mem_size += p->size;
366 }
static unsigned long mem_size
Definition: mshell.c:72
static void mem_del_list(MHDR *p)
Definition: mshell.c:116
static void mem_valid(MHDR *p, const char *file, const int line)
Definition: mshell.c:160
#define CLIENT_2_HDR(a)
Definition: mshell.c:69
unsigned long size
Definition: mshell.c:56
Definition: mshell.c:53
void* mem_malloc ( size_t  ,
const char *  ,
const int   
)

Definition at line 183 of file mshell.c.

187 {
188  const char* errmsg1 =
189  "mem_malloc(size=%u, file=%s, line=%d): out of memory\n";
190  const char* errmsg2 =
191  "mem_malloc(size=%u, file=%s, line=%d): zero size\n";
192 
193  MHDR* p;
194  size_t alloc_size;
195 
196  if (size == 0)
197  {
198  fprintf(stderr, errmsg2, size, file, line);
199  exit(EXIT_FAILURE);
200  }
201  alloc_size = mem_alloc_size(size);
202 
203  assert(alloc_size > 0);
204 
205  if ((p = malloc(alloc_size)) == MHDR_NIL)
206  {
207  fprintf(stderr, errmsg1, size, file, line);
208  exit(EXIT_FAILURE);
209  }
210  p->tag1 = MEMTAG1;
211  p->tag2 = MEMTAG2;
212  p->size = size;
213  mem_size += size;
214  p->file = file;
215  p->line = line;
216  *mem_endptr(p) = ENDTAG;
217 
218  mem_add_list(p);
219 
220  return(HDR_2_CLIENT(p));
221 }
static unsigned long mem_size
Definition: mshell.c:72
static int * mem_endptr(MHDR *p)
Definition: mshell.c:86
int line
Definition: mshell.c:60
#define malloc(a)
Definition: mshell.h:53
static size_t mem_alloc_size(size_t size)
Definition: mshell.c:78
#define MEMTAG1
Definition: mshell.c:48
#define MHDR_NIL
Definition: mshell.c:64
#define MEMTAG2
Definition: mshell.c:49
static void mem_add_list(MHDR *p)
Definition: mshell.c:99
unsigned short tag2
Definition: mshell.c:61
#define HDR_2_CLIENT(a)
Definition: mshell.c:70
#define ENDTAG
Definition: mshell.c:51
int size
Maximale Anzahl von Elementen in der Queue.
Definition: queue.c:25
unsigned short tag1
Definition: mshell.c:55
char const * file
Definition: mshell.c:59
unsigned long size
Definition: mshell.c:56
Definition: mshell.c:53
void mem_maximum ( FILE *  fp)

Definition at line 373 of file mshell.c.

375 {
376  (void)fprintf(fp, "Maximum amount of memory used = %lu bytes\n",
377  mem_maxi);
378 }
static unsigned long mem_maxi
Definition: mshell.c:73
void* mem_realloc ( void *  ,
size_t  ,
const char *  ,
const int   
)

Definition at line 259 of file mshell.c.

264 {
265  const char* errmsg1 =
266  "mem_realloc(size=%u, file=%s, line=%d): out of memory\n";
267  const char* errmsg2 =
268  "mem_realloc(file=%s, line=%d): null pointer\n";
269  const char* errmsg3 =
270  "mem_realloc(size=%u, file=%s, line=%d): zero size\n";
271 
272  MHDR* p;
273 
274  if (ptr == NULL)
275  {
276  fprintf(stderr, errmsg2, file, line);
277  exit(EXIT_FAILURE);
278  }
279  p = CLIENT_2_HDR(ptr);
280 
281  mem_valid(p, file, line);
282  mem_del_list(p);
283 
284  if (size == 0)
285  {
286  fprintf(stderr, errmsg3, size, file, line);
287  exit(EXIT_FAILURE);
288  }
289  if ((p = realloc(p, mem_alloc_size(size))) == MHDR_NIL)
290  {
291  fprintf(stderr, errmsg1, size, file, line);
292  exit(EXIT_FAILURE);
293  }
294  p->tag1 = MEMTAG1;
295  p->tag2 = MEMTAG2;
296  p->size = size;
297  mem_size += size;
298  p->file = file;
299  p->line = line;
300  *mem_endptr(p) = ENDTAG;
301 
302  mem_add_list(p);
303 
304  return(HDR_2_CLIENT(p));
305 }
static unsigned long mem_size
Definition: mshell.c:72
static int * mem_endptr(MHDR *p)
Definition: mshell.c:86
int line
Definition: mshell.c:60
static size_t mem_alloc_size(size_t size)
Definition: mshell.c:78
#define MEMTAG1
Definition: mshell.c:48
#define MHDR_NIL
Definition: mshell.c:64
static void mem_del_list(MHDR *p)
Definition: mshell.c:116
#define MEMTAG2
Definition: mshell.c:49
static void mem_valid(MHDR *p, const char *file, const int line)
Definition: mshell.c:160
static void mem_add_list(MHDR *p)
Definition: mshell.c:99
unsigned short tag2
Definition: mshell.c:61
#define CLIENT_2_HDR(a)
Definition: mshell.c:69
#define HDR_2_CLIENT(a)
Definition: mshell.c:70
#define ENDTAG
Definition: mshell.c:51
int size
Maximale Anzahl von Elementen in der Queue.
Definition: queue.c:25
#define realloc(a, b)
Definition: mshell.h:55
unsigned short tag1
Definition: mshell.c:55
char const * file
Definition: mshell.c:59
unsigned long size
Definition: mshell.c:56
Definition: mshell.c:53
char* mem_strdup ( const char *  ,
const char *  ,
const int   
)

Definition at line 307 of file mshell.c.

311 {
312  const char* errmsg1 = "mem_strdup(file=%s, line=%d): null pointer\n";
313 
314  if (str == NULL)
315  {
316  (void)fprintf(stderr, errmsg1, file, line);
317  exit(EXIT_FAILURE);
318  }
319  return(strcpy(mem_malloc((size_t)(strlen(str) + 1), file, line), str));
320 }
void * mem_malloc(size_t size, const char *file, const int line)
Definition: mshell.c:183
size_t mem_used ( void  )

Definition at line 368 of file mshell.c.

369 {
370  return(mem_size);
371 }
static unsigned long mem_size
Definition: mshell.c:72