#ifndef __mem_h
#define __mem_h

#ifndef MEM_ALIGN
#define MEM_ALIGN	16
#endif

typedef union { char __x[MEM_ALIGN]; double __y; } align_t;

void inline *mem_alloc(int bytes);
void inline mem_free(void *ptr);
void inline mem_register_gc(void *x, int (*fn)(void *));

/* the rest of this file contains compatability things */

/* memzero function */
#ifndef HAVE_MEMZERO
#if defined(HAVE_BZERO)
#define memzero(a,b) bzero(a,b)
#elif defined(HAVE_MEMSET)
#define memzero(a,b) memset(a,0,b)
#else
void inline memzero(void *d, int len)
{
	register char *x = (char *)d;
	register int i;

	for (i = 0; i < len;) {
		*x = 0; x++;i++; if (i == len) break;
		*x = 0; x++;i++; if (i == len) break;
		*x = 0; x++;i++; if (i == len) break;
		*x = 0; x++;i++; if (i == len) break;
		*x = 0; x++;i++; if (i == len) break;
		*x = 0; x++;i++; if (i == len) break;
		*x = 0; x++;i++; if (i == len) break;
		*x = 0; x++;i++;
	}
}

#endif
#endif

/* memcpy function */
#ifndef HAVE_MEMCPY
#if defined(HAVE_BCOPY)
#define memcpy(a,b,c) bcopy(b,c,a)
#else
void inline memcpy(void *d, const void *s, int len)
{
	register const char *x = (const char *)s;
	register char *y = (char *)d;
	register int i;

	for (i = 0; i < len;) {
		*y = *x; x++;y++;i++; if (i == len) break;
		*y = *x; x++;y++;i++; if (i == len) break;
		*y = *x; x++;y++;i++; if (i == len) break;
		*y = *x; x++;y++;i++; if (i == len) break;
		*y = *x; x++;y++;i++; if (i == len) break;
		*y = *x; x++;y++;i++; if (i == len) break;
		*y = *x; x++;y++;i++; if (i == len) break;
		*y = *x; x++;y++;i++;
	}
}
#endif
#endif


/* more to come (hopefully not) */

#endif


syntax highlighted by Code2HTML, v. 0.9.1