home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource4
/
204_01
/
memmgt.c
< prev
next >
Wrap
Text File
|
1979-12-31
|
4KB
|
123 lines
#include <stdio.h>
#include "c.h"
#include "expr.h"
#include "gen.h"
#include "cglbdec.h"
/*
* 68000 C compiler
*
* Copyright 1984, 1985, 1986 Matthew Brandt.
* all commercial rights reserved.
*
* This compiler is intended as an instructive tool for personal use. Any
* use for profit without the written consent of the author is prohibited.
*
* This compiler may be distributed freely for non-commercial use as long
* as this notice stays intact. Please forward any enhancements or questions
* to:
*
* Matthew Brandt
* Box 920337
* Norcross, Ga 30092
*/
struct blk {
struct blk *next;
char m[1]; /* memory area */
};
static int glbsize = 0, /* size left in current global block */
locsize = 0, /* size left in current local block */
glbindx = 0, /* global index */
locindx = 0; /* local index */
static struct blk *locblk = 0, /* pointer to local block */
*glbblk = 0; /* pointer to global block */
char *xalloc(siz)
int siz;
{ struct blk *bp;
char *rv;
if( siz & 1 ) /* if odd size */
siz += 1; /* make it even */
if( global_flag ) {
if( glbsize >= siz ) {
rv = &(glbblk->m[glbindx]);
glbsize -= siz;
glbindx += siz;
return rv;
}
else {
bp = calloc(1,sizeof(struct blk) + 2047);
if( bp == NULL )
{
printf(" not enough memory.\n");
exit(1);
}
bp->next = glbblk;
glbblk = bp;
glbsize = 2048 - siz;
glbindx = siz;
return glbblk->m;
}
}
else {
if( locsize >= siz ) {
rv = &(locblk->m[locindx]);
locsize -= siz;
locindx += siz;
return rv;
}
else {
bp = calloc(1,sizeof(struct blk) + 2047);
if( bp == NULL )
{
printf(" not enough local memory.\n");
exit(1);
}
bp->next = locblk;
locblk = bp;
locsize = 2048 - siz;
locindx = siz;
return locblk->m;
}
}
}
release_local()
{ struct blk *bp1, *bp2;
int blkcnt;
blkcnt = 0;
bp1 = locblk;
while( bp1 != 0 ) {
bp2 = bp1->next;
free( bp1 );
++blkcnt;
bp1 = bp2;
}
locblk = 0;
locsize = 0;
lsyms.head = 0;
printf(" releasing %d bytes local tables.\n",blkcnt * 2048);
}
release_global()
{ struct blk *bp1, *bp2;
int blkcnt;
bp1 = glbblk;
blkcnt = 0;
while( bp1 != 0 ) {
bp2 = bp1->next;
free(bp1);
++blkcnt;
bp1 = bp2;
}
glbblk = 0;
glbsize = 0;
gsyms.head = 0; /* clear global symbol table */
printf(" releasing %d bytes global tables.\n",blkcnt * 2048);
strtab = 0; /* clear literal table */
}