blob: 82f59d9ce7b228db5feb78a16d7546e9003e857b [file] [log] [blame]
/*
** Glue code for MetroWerks CodeWarrior, which misses
** unix-like routines for file-access.
*/
#ifdef __MWERKS__
#include <Types.h>
#include <Files.h>
#include <Strings.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
/* #define DBGMALLOC /**/
#ifdef DBGMALLOC
#define NMALLOC 50000
static long m_index;
static long m_addrs[NMALLOC];
static long m_sizes[NMALLOC];
static long m_lastaddr;
#define SSLOP 2
#define SLOP (SSLOP+0)
void
m_abort() {
printf("ABORT\n");
exit(1);
}
void *
checkrv(ptr, size)
void *ptr;
int size;
{
long b = (long)ptr, e = (long)ptr + size+SSLOP;
int i;
if ( m_index >= NMALLOC ) {
printf("too many mallocs\n");
m_abort();
}
m_lastaddr = (long)ptr;
for(i=0; i<m_index; i++) {
if ( m_addrs[i] > 0 && b < m_addrs[i]+m_sizes[i] && e > m_addrs[i] ) {
printf("overlapping block with %d\n", i);
m_abort();
}
}
m_sizes[m_index] = size;
m_addrs[m_index++] = (long)ptr;
*(short *)ptr = m_index-1;
return (void *)((char *)ptr+SSLOP);
}
void *
checkfree(ptr)
void *ptr;
{
int i;
if ( ptr == 0 ) {
printf("free null\n");
m_abort();
}
m_lastaddr = (long)ptr;
for(i=0; i<m_index; i++) {
if ( m_addrs[i] == (long)ptr-SSLOP ) {
m_addrs[i] = -m_addrs[i];
ptr = (void *)((char *)ptr-SSLOP);
if ( *(short *)ptr != i ) {
int saved_i = i, saved_ptr = *(short *)ptr;
printf("Wrong starter value\n");
m_abort();
}
return ptr;
}
}
printf("free unknown\n");
m_abort();
return 0;
}
void *
m_malloc(size)
{
void *ptr;
ptr = malloc(size+SLOP);
if ( !ptr ) {
printf("malloc failure\n");
m_abort();
}
return checkrv(ptr, size);
}
void *
m_realloc(optr, size)
void *optr;
{
void *ptr;
ptr = checkfree(ptr);
ptr = realloc(ptr, size+SLOP);
if ( !ptr ) {
printf("realloc failure\n");
m_abort();
}
return checkrv(ptr, size);
}
void *
m_calloc(size, nelem)
{
void *ptr;
ptr = calloc(1, nelem*size+SLOP);
return checkrv(ptr, nelem*size);
}
void
m_free(ptr)
void *ptr;
{
ptr = checkfree(ptr);
free(ptr);
}
#endif /* DBGMALLOC */
#ifdef CW4
int
fileno(fp)
FILE *fp;
{
if (fp==stdin) return 0;
else if (fp==stdout) return 1;
else if (fp==stderr) return 2;
else return 3;
}
int
isatty(fd)
int fd;
{
return (fd >= 0 && fd <= 2);
}
int
unlink(old)
char *old;
{
OSErr err;
if ((err=FSDelete((ConstStr255Param)Pstring(old), 0)) == noErr)
return 0;
errno= err;
return -1;
}
#endif /* CW4 */
#endif /* __MWERKS__ */