tinymush-3.1p2/game/backups/
tinymush-3.1p2/game/bin/
tinymush-3.1p2/game/data/
tinymush-3.1p2/game/modules/
tinymush-3.1p2/game/modules/old/
tinymush-3.1p2/src/modules/comsys/
tinymush-3.1p2/src/modules/hello/
tinymush-3.1p2/src/modules/mail/
tinymush-3.1p2/src/tools/
/* alloc.h - External definitions for memory allocation subsystem */
/* $Id: alloc.h,v 1.18 2002/09/23 04:59:36 rmg Exp $ */

#include "copyright.h"

#ifndef __ALLOC_H
#define __ALLOC_H

/* We need to 64-bit-align the end of the pool header. */

typedef struct pool_header {
    int magicnum;		/* For consistency check */
    int pool_size;		/* For consistency check */
    struct pool_header *next;	/* Next pool header in chain */
    struct pool_header *nxtfree;	/* Next pool header in freelist */
    char *buf_tag;		/* Debugging/trace tag */
    char align[(256 - 2 * sizeof(int) - 3 * sizeof(char *)) & 0x7];
} POOLHDR;

typedef struct pool_footer {
	int magicnum;		/* For consistency check */
} POOLFTR;

typedef struct pooldata {
	int pool_size;		/* Size in bytes of a buffer */
	POOLHDR *free_head;	/* Buffer freelist head */
	POOLHDR *chain_head;	/* Buffer chain head */
	int tot_alloc;		/* Total buffers allocated */
	int num_alloc;		/* Number of buffers currently allocated */
	int max_alloc;		/* Max # buffers allocated at one time */
	int num_lost;		/* Buffers lost due to corruption */
} POOL;

#define	POOL_SBUF	0
#define	POOL_MBUF	1
#define	POOL_LBUF	2
#define	POOL_BOOL	3
#define	POOL_DESC	4
#define	POOL_QENTRY	5
#define POOL_PCACHE	6
#define	NUM_POOLS	7


#define LBUF_SIZE	8000	/* standard lbuf */
#define GBUF_SIZE       1024    /* generic buffer size */
#define MBUF_SIZE	400	/* standard mbuf */
#define SBUF_SIZE	64	/* standard sbuf, short strings */

/*
#define LBUF_SIZE	4000
#define MBUF_SIZE	200
#define SBUF_SIZE	32
*/

/* ---------------------------------------------------------------------------
 * Basic allocation.
 */

#define RAW_MALLOC(x,y) (malloc(x))
#define RAW_CALLOC(x,z,y) (calloc((x),(z)))
#define RAW_REALLOC(x,z,y) (realloc((x),(z)))
#define RAW_STRDUP(x,y) (strdup(x))
#define RAW_FREE(x,y) (free((void *)(x)), (x) = NULL)

#ifdef TEST_MALLOC

extern int malloc_count;
extern int malloc_bytes;
extern char *malloc_str;
extern char *malloc_ptr;

#define XMALLOC(x,y) (fprintf(stderr,"Malloc: %s/%d\n", (y), (x)), malloc_count++, \
                    malloc_ptr = (char *)malloc((x) + sizeof(int)), malloc_bytes += (x), \
                    *(int *)malloc_ptr = (x), malloc_ptr + sizeof(int))
#define XCALLOC(x,z,y) (fprintf(stderr,"Calloc: %s/%d\n", (y), (x)*(z)), malloc_count++, \
                    malloc_ptr = (char *)malloc((x)*(z) + sizeof(int)), malloc_bytes += (x)*(z), \
                    memset(malloc_ptr, 0, (x)*(z) + sizeof(int)), \
                    *(int *)malloc_ptr = (x)*(z), malloc_ptr + sizeof(int))
#define XREALLOC(x,z,y) (fprintf(stderr,"Realloc: %s/%d\n", (y), (z)), \
                    malloc_ptr = (char *)malloc((z) + sizeof(int)), malloc_bytes += (z), \
                    malloc_bytes -= *(int *)((char *)(x)-sizeof(int)), memcpy(malloc_ptr + sizeof(int), (x), *(int *)((char *)(x) - sizeof(int))), \
                    free((char *)(x) - sizeof(int)), *(int *)malloc_ptr = (z), malloc_ptr + sizeof(int))
#define XSTRDUP(x,y) (malloc_str = (char *)(x), \
		    fprintf(stderr,"Strdup: %s/%d\n", (y), strlen(malloc_str)+1), malloc_count++, \
                    malloc_ptr = (char *)malloc(strlen(malloc_str) + 1 + sizeof(int)), \
                    malloc_bytes += strlen(malloc_str) + 1, strcpy(malloc_ptr + sizeof(int), malloc_str), \
                    *(int *)malloc_ptr = strlen(malloc_str) + 1, malloc_ptr + sizeof(int))
#define XSTRNDUP(x,z,y) (malloc_str = (char *)(x), \
		    fprintf(stderr,"Strndup: %s/%d\n", (y), strlen(malloc_str)+1), malloc_count++, \
                    malloc_ptr = (char *)malloc((z) + sizeof(int)), \
                    malloc_bytes += (z), strncpy(malloc_ptr + sizeof(int), malloc_str, (z)), \
                    *(int *)malloc_ptr = (z), malloc_ptr + sizeof(int))
#define XFREE(x,y) (fprintf(stderr, "Free: %s/%d\n", (y), (x) ? *(int *)((char *)(x)-sizeof(int)) : 0), \
                    ((x) ? malloc_count--, malloc_bytes -= *(int *)((char *)(x)-sizeof(int)), \
                    free((char *)(x) - sizeof(int)), (x)=NULL : (x)))

#else  /* ! TEST_MALLOC  */

#ifdef RAW_MEMTRACKING

#define XMALLOC(x,y) (track_malloc((x),(y)))
#define XCALLOC(x,z,y) (track_calloc((x),(z),(y)))
#define XREALLOC(x,z,y) (track_realloc((x),(z),(y)))
#define XSTRDUP(x,y) (track_strdup((x),(y)))
#define XFREE(x,y) (track_free((void *)(x),(y)), (x) = NULL)

extern void *	FDECL(track_malloc, (size_t, const char *));
extern void *	FDECL(track_calloc, (size_t, size_t, const char *));
extern void *	FDECL(track_realloc, (void *, size_t, const char *));
extern char *	FDECL(track_strdup, (const char *, const char *));
extern void	FDECL(track_free, (void *, const char *));

typedef struct tracemem_header {
    void *bptr;
    const char *buf_tag;
    size_t alloc;
    struct tracemem_header *next;
} MEMTRACK;

#else

#define XMALLOC(x,y)	RAW_MALLOC((x),(y))
#define XCALLOC(x,z,y)	RAW_CALLOC((x),(z),(y))
#define XREALLOC(x,z,y)	RAW_REALLOC((x),(z),(y))
#define XSTRDUP(x,y)	RAW_STRDUP((x),(y))
#define XFREE(x,y)	RAW_FREE((x),(y))

#endif  /* RAW_MEMTRACKING */
#endif  /* TEST_MALLOC */

/* ---------------------------------------------------------------------------
 * Pool allocation.
 */

extern void	FDECL(pool_init, (int, int));
extern char *	FDECL(pool_alloc, (int, const char *));
extern void	FDECL(pool_free, (int, char **));
extern void	FDECL(list_bufstats, (dbref));
extern void	FDECL(list_buftrace, (dbref));

#define	alloc_lbuf(s)	pool_alloc(POOL_LBUF,s)
#define	free_lbuf(b)	pool_free(POOL_LBUF,((char **)&(b)))
#define	alloc_mbuf(s)	pool_alloc(POOL_MBUF,s)
#define	free_mbuf(b)	pool_free(POOL_MBUF,((char **)&(b)))
#define	alloc_sbuf(s)	pool_alloc(POOL_SBUF,s)
#define	free_sbuf(b)	pool_free(POOL_SBUF,((char **)&(b)))
#define	alloc_bool(s)	(struct boolexp *)pool_alloc(POOL_BOOL,s)
#define	free_bool(b)	pool_free(POOL_BOOL,((char **)&(b)))
#define	alloc_qentry(s)	(BQUE *)pool_alloc(POOL_QENTRY,s)
#define	free_qentry(b)	pool_free(POOL_QENTRY,((char **)&(b)))
#define alloc_pcache(s)	(PCACHE *)pool_alloc(POOL_PCACHE,s)
#define free_pcache(b)	pool_free(POOL_PCACHE,((char **)&(b)))

#define safe_copy_chr(scc__src,scc__buff,scc__bufp,scc__max) {\
    char *scc__tp;\
\
    scc__tp = *scc__bufp;\
    if ((scc__tp - scc__buff) < scc__max) {\
	*scc__tp++ = scc__src;\
	*scc__bufp = scc__tp;\
	*scc__tp = '\0';\
    } else {\
	scc__buff[scc__max] = '\0';\
    }\
}

#define	safe_str(s,b,p)		safe_copy_str((s),(b),(p),(LBUF_SIZE-1))
#define	safe_str_fn(s,b,p)	safe_copy_str_fn((s),(b),(p),(LBUF_SIZE-1))
#define	safe_chr(c,b,p)		safe_copy_chr((c),(b),(p),(LBUF_SIZE-1))
#define safe_long_str(s,b,p)    safe_copy_long_str((s),(b),(p),(LBUF_SIZE-1))
#define	safe_sb_str(s,b,p)	safe_copy_str((s),(b),(p),(SBUF_SIZE-1))
#define	safe_sb_chr(c,b,p)	safe_copy_chr((c),(b),(p),(SBUF_SIZE-1))
#define	safe_mb_str(s,b,p)	safe_copy_str((s),(b),(p),(MBUF_SIZE-1))
#define	safe_mb_chr(c,b,p)	safe_copy_chr((c),(b),(p),(MBUF_SIZE-1))
#define safe_chr_fn(c,b,p)      safe_chr_real_fn((c),(b),(p),(LBUF_SIZE-1))

#endif	/* __ALLOC_H */