⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symtab.c

📁 3D游戏场景编辑器
💻 C
字号:
/****************************************************************************************/
/*  SYMTAB.C                                                                            */
/*                                                                                      */
/*  Author: Eli Boling                                                                  */
/*  Description: Symbol table for C Language parser support                             */
/*                                                                                      */
/*  The contents of this file are subject to the Genesis3D Public License               */
/*  Version 1.01 (the "License"); you may not use this file except in                   */
/*  compliance with the License. You may obtain a copy of the License at                */
/*  http://www.genesis3d.com                                                            */
/*                                                                                      */
/*  Software distributed under the License is distributed on an "AS IS"                 */
/*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See                */
/*  the License for the specific language governing rights and limitations              */
/*  under the License.                                                                  */
/*                                                                                      */
/*  The Original Code is Genesis3D, released March 25, 1999.                            */
/*Genesis3D Version 1.1 released November 15, 1999                            */
/*  Copyright (C) 1999 WildTangent, Inc. All Rights Reserved           */
/*                                                                                      */
/****************************************************************************************/
#include	<stdlib.h>
#include	<string.h>
#include	<assert.h>

#include	"iden.h"
#include	"type.h"
#include	"symtab.h"
#include	"ram.h"

SymTab *	SymTab_Create(void)
{
	SymTab *	st;

	st = geRam_Allocate(sizeof(*st));
	memset(st, 0, sizeof(*st));
	return st;
}

static	void	DestroySymList(SymTab_Symbol *sym)
{
	while	(sym)
	{
		SymTab_Symbol *tmp;

		tmp = sym;
		sym = sym->symScopeNext;
		geRam_Free(tmp);
	}
}

void	SymTab_Destroy(SymTab *st)
{
#ifdef	DEBUG
	memset(st, 0xef, sizeof(*st));
#endif
	geRam_Free(st);
}

SymTab_Symbol * SymTab_CreateSymbol(
	SymTab *		st,
	SymTab_Scope *	scp,
	Iden *			name,
	Type *			tp)
{
	SymTab_Symbol *sym;

	sym = geRam_Allocate(sizeof(*sym));
	if	(!sym)
		return sym;

	memset(sym, 0, sizeof(*sym));

	if	(scp->scpFlags & F_SCP_FILE)
	{
		sym->symNext = st->stSymbols;
					   st->stSymbols = sym;
	}

	sym->symName = name;
	sym->symType = tp;
	sym->symScopeNext = scp->scpSymbols;
						scp->scpSymbols = sym;

	return sym;
}

#if _MSC_VER
	#pragma warning (disable:4100)
#endif
SymTab_Scope *	SymTab_CreateScope(SymTab *st, SymTab_Scope *parent, unsigned short scpFlags)
{
	SymTab_Scope *	scp;

	scp = geRam_Allocate(sizeof(*scp));
	assert(scp);
	memset(scp, 0, sizeof(*scp));

	scp->scpFlags = scpFlags;
	scp->scpOuter = parent;
	if	(parent)
	{
		SymTab_Scope *	child;

		child = parent->scpInner;
		if	(child)
			scp->scpNext = child->scpInner;
						   child->scpInner = scp;
		parent->scpInner = scp;
	}

	return scp;
}
#if _MSC_VER
	#pragma warning (default:4100)
#endif

SymTab_Symbol *	SymTab_FindSymbolInScope(SymTab *st, SymTab_Scope *scp, Iden *name)
{
	SymTab_Symbol *	sym;

	while	(scp)
	{
		sym = scp->scpSymbols;
		while	(sym)
		{
			if	(sym->symName == name)
				return sym;
			sym = sym->symScopeNext;
		}
		scp = scp->scpOuter;
	}

	sym = st->stSymbols;
	while	(sym)
	{
		if	(sym->symName == name)
			return sym;
		sym = sym->symScopeNext;
	}

	return NULL;
}

void		SymTab_DestroyScope(SymTab_Scope *scp)
{
	assert(!scp->scpOuter);
	assert(!scp->scpInner);
	assert(!scp->scpNext);
	DestroySymList(scp->scpSymbols);
#ifdef	DEBUG
	memset(scp, 0xea, sizeof(*scp));
#endif
	geRam_Free(scp);
}

⌨️ 快捷键说明

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