home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magazyn Amiga Shareware Floppies
/
ma64.dms
/
ma64.adf
/
FTPMount-1.0
/
Source
/
verify_code.h
< prev
next >
Wrap
Text File
|
1995-09-06
|
11KB
|
469 lines
/*
* 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