00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004
00005 static size_t mem_now = 0;
00006 static size_t mem_max = 0;
00007 static size_t alloc_calls = 0;
00008 static size_t free_calls = 0;
00009
00010 void *cgmalloc(size_t bytes) {
00011 size_t *data = (size_t *) malloc (bytes + 2 * sizeof(size_t));
00012 if (data) {
00013 *data++ = bytes;
00014 *data++ = (size_t)(data + 1);
00015 mem_now += bytes;
00016 if (mem_max < mem_now) mem_max = mem_now;
00017 }
00018 alloc_calls++;
00019 return (void *)data;
00020 }
00021
00022 void *cgrealloc(void *olddata, size_t bytes) {
00023 size_t *data = (size_t *)olddata;
00024 if (data && *(data-1) == (size_t)olddata) {
00025 data -= 2;
00026 mem_now -= *data;
00027 }
00028 data = (size_t *) realloc (data, bytes + 2 * sizeof(size_t));
00029 if (data) {
00030 *data++ = bytes;
00031 *data++ = (size_t)(data + 1);
00032 mem_now += bytes;
00033 if (mem_max < mem_now) mem_max = mem_now;
00034 }
00035
00036 return (void *)data;
00037 }
00038
00039 void *cgcalloc(size_t num, size_t bytes) {
00040 size_t count = num * bytes;
00041 size_t *data = (size_t *) malloc (count + 2 * sizeof(size_t));
00042 if (data) {
00043 *data++ = count;
00044 *data++ = (size_t)(data + 1);
00045 mem_now += count;
00046 if (mem_max < mem_now) mem_max = mem_now;
00047 memset(data, 0, count);
00048 }
00049 alloc_calls++;
00050 return (void *)data;
00051 }
00052
00053 void cgfree(void *freedata) {
00054 size_t *data = (size_t *)freedata;
00055 if (data && *(data-1) == (size_t)freedata) {
00056 data -= 2;
00057 mem_now -= *data;
00058 free (data);
00059 }
00060 free_calls++;
00061 }
00062
00063 size_t cgmemnow() {return mem_now;}
00064 size_t cgmemmax() {return mem_max;}
00065
00066 size_t cgalloccalls() {return alloc_calls;}
00067 size_t cgfreecalls() {return free_calls;}
00068