home *** CD-ROM | disk | FTP | other *** search
- /*
- * This source file is Copyright 1995 by Evan Scott.
- * All rights reserved.
- * Permission is granted to distribute this file provided no
- * fees beyond distribution costs are levied.
- */
-
- #ifdef VERIFY
- unsigned char verify_buffer[200];
-
- static int make_int(int pos, int n)
- {
- if (!n) return pos;
-
- pos = make_int(pos, n / 10);
- verify_buffer[pos] = (n % 10) + '0';
-
- return pos + 1;
- }
-
- static int make_int_f(int pos, int n)
- {
- if (n == 0) {
- verify_buffer[pos++] = '0';
- return pos;
- }
-
- if (n < 0) {
- verify_buffer[pos++] = '-';
- return make_int(pos, -n);
- } else {
- return make_int(pos, n);
- }
- }
-
- static int make_string(int pos, char *s)
- {
- strcpy(&verify_buffer[pos], s);
- return (int)(pos + strlen(s));
- }
-
- static int make_char(int pos, char c)
- {
- verify_buffer[pos] = c;
-
- return pos + 1;
- }
-
- void __saveds verify_alert(char *file, int line, char *a, char *b)
- {
- int i;
-
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_string(i, ": ");
- i = make_string(i, a);
- i = make_string(i, " is not a ");
- i = make_string(i, b);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- // sprintf(verify_buffer, "%c%c%cVerify alert in %s line %d: %s is not a %s%c%c", 0, 10, 15, file, line, a, b, 0, 0);
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
- Permit();
- }
-
- void __saveds truth_alert(char *file, int line, char *a)
- {
- int i;
-
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_string(i, ": ");
- i = make_string(i, a);
- i = make_string(i, " is not TRUE");
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- // sprintf(verify_buffer, "%c%c%c%s line %d: %s is not TRUE%c%c", 0, 10, 15, file, line, a, 0, 0);
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
- Permit();
- }
-
- void __saveds false_alert(char *file, int line, char *a)
- {
- int i;
-
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_string(i, ": ");
- i = make_string(i, a);
- i = make_string(i, " is not FALSE");
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- // sprintf(verify_buffer, "%c%c%c%s line %d: %s is not FALSE%c%c", 0, 10, 15, file, line, a, 0, 0);
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
- Permit();
- }
-
- void __saveds int_alert(char *file, int line, char *a, int b)
- {
- int i;
-
- Forbid();
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_string(i, ": ");
- i = make_string(i, a);
- i = make_char(i, '=');
- i = make_int_f(i, b);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- // sprintf(verify_buffer, "%c%c%c%s line %d: %s=%d%c%c", 0, 10, 15, file, line, a, b, 0, 0);
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
- Permit();
- }
-
- void __saveds string_alert(char *file, int line, char *a, char *b)
- {
- int i;
-
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_string(i, ": ");
- i = make_string(i, a);
- i = make_char(i, '=');
- i = make_string(i, b);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- // sprintf(verify_buffer, "%c%c%c%s line %d: %s=%s%c%c", 0, 10, 15, file, line, a, b, 0, 0);
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
- Permit();
- }
-
- /* struct List memlist; */
-
- void __saveds track_init(void)
- {
- struct Task *me;
-
- me = FindTask(0);
- truth(me != 0);
- truth(me->tc_UserData == 0);
- me->tc_UserData = 0;
- }
-
- void * __saveds track_malloc(int size, unsigned long type, unsigned long flags, char *file, int line, char *a, char *b)
- {
- struct bink *block;
- int i;
-
- if (size <= 0 || size > 100000) { /* the positive is arbitrary */
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, "Illegal malloc size of ");
- i = make_int_f(i, size);
- i = make_string(i, " in ");
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_string(i, ": allocating ");
- i = make_string(i, a);
- i = make_string(i, " to be ");
- i = make_string(i, b);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- // sprintf(verify_buffer, "%c%c%cIllegal malloc size of %d in %s line %d: allocating %s to be %s%c%c", 0, 10, 15, size, file, line, a, b, 0, 0);
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
- Permit();
- return 0;
- }
-
- block = (struct bink *)AllocMem(size + sizeof(struct bink), flags);
- if (!block) {
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, "Malloc failure in ");
- i = make_int_f(i, size);
- i = make_string(i, " in ");
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_string(i, ": allocating ");
- i = make_string(i, a);
- i = make_string(i, " to be ");
- i = make_string(i, b);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- // sprintf(verify_buffer, "%c%c%cMalloc failure in %s line %d: allocating %s to be %s%c%c", 0, 10, 15, file, line, a, b, 0, 0);
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 40);
- Permit();
- return 0;
- }
-
- block->prev = (struct bink **)&(FindTask(0)->tc_UserData);
- block->next = *(block->prev);
- *(block->prev) = block;
- if (block->next) block->next->prev = &(block->next);
-
- block->type = type;
- block->size = size;
- block->file = file;
- block->line = line;
- block->typename = b;
-
- return (void *)((unsigned char *)block + sizeof(struct bink));
- }
-
- void __saveds track_free(void *block, unsigned long type, char *file, int line, char *a, char *b)
- {
- int i;
- struct bink *rblock;
- rblock = (struct bink *)((unsigned char *)block - sizeof(struct bink));
-
- if (rblock->type != type) {
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, "Illegal FREE in ");
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_char(i, ':');
- i = make_char(i, 0);
- i = make_char(i, 1);
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 25);
- i = make_string(i, "freeing ");
- i = make_string(i, a);
- i = make_string(i, " which should be ");
- i = make_string(i, b);
- i = make_char(i, 0);
- i = make_char(i, 1);
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 35);
- i = make_string(i, "Allocated in ");
- i = make_string(i, rblock->file);
- i = make_string(i, " line ");
- i = make_int(i, rblock->line);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- /* sprintf(verify_buffer, "%c%c%cIllegal FREE in %s line %d:%c%c"
- "%c%c%cfreeing %s which should be %s%c%c"
- "%c%c%cAllocated in %s line %d%c%c",
- 0, 10, 15, file, line, 0, 1,
- 0, 10, 25, a, b, 0, 1,
- 0, 10, 35, rblock->file, rblock->line, 0, 0); */
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 50);
- Permit();
- return;
- }
-
- *(rblock->prev) = rblock->next;
- if (rblock->next) rblock->next->prev = rblock->prev;
-
- rblock->type = 0xffffffff;
- FreeMem(rblock, rblock->size + sizeof(struct bink));
- }
-
- void __saveds track_disown(void *block, unsigned long type, char *file, int line, char *a, char *b)
- {
- int i;
- struct bink *rblock;
- rblock = (struct bink *)((unsigned char *)block - sizeof(struct bink));
-
- if (rblock->type != type) {
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, "Illegal DISOWN in ");
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_char(i, ':');
- i = make_char(i, 0);
- i = make_char(i, 1);
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 25);
- i = make_string(i, "disowning ");
- i = make_string(i, a);
- i = make_string(i, " which should be ");
- i = make_string(i, b);
- i = make_char(i, 0);
- i = make_char(i, 1);
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 35);
- i = make_string(i, "Allocated in ");
- i = make_string(i, rblock->file);
- i = make_string(i, " line ");
- i = make_int(i, rblock->line);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 50);
- Permit();
- return;
- }
-
- *(rblock->prev) = rblock->next;
- if (rblock->next) rblock->next->prev = rblock->prev;
- }
-
- void __saveds track_adopt(void *block, unsigned long type, char *file, int line, char *a, char *b)
- {
- int i;
- struct bink *rblock;
- rblock = (struct bink *)((unsigned char *)block - sizeof(struct bink));
-
- if (rblock->type != type) {
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_string(i, "Illegal ADOPT in ");
- i = make_string(i, file);
- i = make_string(i, " line ");
- i = make_int(i, line);
- i = make_char(i, ':');
- i = make_char(i, 0);
- i = make_char(i, 1);
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 25);
- i = make_string(i, "adopting ");
- i = make_string(i, a);
- i = make_string(i, " which should be ");
- i = make_string(i, b);
- i = make_char(i, 0);
- i = make_char(i, 1);
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 35);
- i = make_string(i, "Allocated in ");
- i = make_string(i, rblock->file);
- i = make_string(i, " line ");
- i = make_int(i, rblock->line);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 50);
- Permit();
- return;
- }
-
- rblock->prev = (struct bink **)&(FindTask(0)->tc_UserData);
- rblock->next = *(rblock->prev);
- *(rblock->prev) = rblock;
- if (rblock->next) rblock->next->prev = &(rblock->next);
- }
-
- void __saveds track_check(void)
- {
- struct bink *a;
- int i;
-
- for (a = (struct bink *)FindTask(0)->tc_UserData; a; a = a->next) {
- Forbid();
-
- i = 0;
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 15);
- i = make_char(i, '(');
- i = make_string(i, FindTask(0)->tc_Node.ln_Name);
- i = make_string(i, ") Unfreed block of type ");
- i = make_string(i, a->typename);
- i = make_char(i, 0);
- i = make_char(i, 1);
-
- i = make_char(i, 0);
- i = make_char(i, 10);
- i = make_char(i, 25);
- i = make_string(i, "Allocated in ");
- i = make_string(i, a->file);
- i = make_string(i, " line ");
- i = make_int(i, a->line);
- i = make_char(i, 0);
- i = make_char(i, 0);
-
- /* sprintf(verify_buffer, "%c%c%c(%s) Unfreed block of type %s%c%c"
- "%c%c%cAllocated in %s line %d%c%c",
- 0, 10, 15, FindTask(0)->tc_Node.ln_Name, a->typename, 0, 1,
- 0, 10, 25, a->file, a->line, 0, 0); */
- DisplayAlert(RECOVERY_ALERT, verify_buffer, 45);
- a->type = ~0;
- Permit();
- /* FreeMem(a, a->size); */
- }
-
- FindTask(0)->tc_UserData = 0;
- }
- #endif
-