memmgmt.c

来自「用C++编写的一个编译器」· C语言 代码 · 共 92 行

C
92
字号
#include <stdlib.h>
#include <string.h>
#include "utility.h"
#include "symbol.h"

static Memblk *gblk_list, *lblk_list;

void *dmalloc(int size, bool auto_flag)
{
	Memblk *blklist, *tmpblk;
	int rsize, offset;
	if(!current_func||!auto_flag)
		blklist = gblk_list;
	else 
		blklist = lblk_list;

	if(!blklist||blklist->rest<size)
	{
		rsize=PAGESIZE>sizeof(Memblk)+size?PAGESIZE:sizeof(Memblk)+size;
		tmpblk=(Memblk*)malloc(rsize);
		memset(tmpblk, 0, rsize);
		tmpblk->blksize = rsize;
		tmpblk->rest = rsize-sizeof(Memblk);
		tmpblk->next = blklist;
		blklist = tmpblk;
	}

	offset = blklist->blksize-blklist->rest;
	blklist->rest-=size;
	return ((char*)blklist)+offset;
}
int release_local()
{
	int sum=0;
	Memblk *blklist, *tmpblk;
	blklist = lblk_list;
	lblk_list=NULL;		//set pointer to zero
	
	while(NULL != blklist)
	{
		tmpblk=blklist;
		blklist=blklist->next;
		sum+=tmpblk->blksize;
		free(tmpblk);
	}

	return sum;
}
int release_global()
{
	int sum=0;
	Memblk *blklist, *tmpblk;
	blklist = gblk_list;
	gblk_list=NULL;		//set pointer to zero
	
	while(NULL != blklist)
	{
		tmpblk=blklist;
		blklist=blklist->next;
		sum+=tmpblk->blksize;
		free(tmpblk);
	}

	return sum;
}
char * newstrcpy(
	 const char *src,
	 int size)
{
	int i;
	char *des;
	if(size == UNKNOWN)
		size = strlen(src)+1;
	des = dmalloc(size, true);
	for(i=0;i<size;i++)
		des[i] = src[i];

	return des;
}

long align_add(
	long origin, 
	long extra
)
{
	if(extra==1)
		return origin+extra;
	else if(extra==2)
		return ((origin+1)&~1)+extra;
	else
		return ((origin+3)&~3)+extra;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?