//////////////////////////////////////////////////////////////////////////////
//Copyright 2008
// Andrew Gacek, Steven Holte, Gopalan Nadathur, Xiaochu Qi, Zach Snow
//////////////////////////////////////////////////////////////////////////////
// This file is part of Teyjus. //
// //
// Teyjus is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// (at your option) any later version. //
// //
// Teyjus is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with Teyjus. If not, see . //
//////////////////////////////////////////////////////////////////////////////
/***************************************************************************/
/* File pervinit.h{c}. */
/* Functions for setting up the symbol tables of pervasive constants and */
/* kinds are provided. */
/***************************************************************************/
#include
#include
#include "pervinit.h"
#include "pervasives.h"
#include "../system/memory.h"
#include "../simulator/dataformats.h"
#include "../simulator/mcstring.h"
#include "../simulator/mctypes.h"
DF_StrDataPtr PERVINIT_writeName(char* name)
{
int length = strlen(name);
MemPtr rtPtr, mcStr;
rtPtr = (MemPtr)MEM_memExtend(MCSTR_numWords(length) +
DF_STRDATA_HEAD_SIZE);
mcStr = rtPtr + DF_STRDATA_HEAD_SIZE;
//create data head
DF_mkStrDataHead((MemPtr)rtPtr);
//create the string data
MCSTR_toString((MCSTR_Str)mcStr, name, length);
return (DF_StrDataPtr)rtPtr;
}
/***************************************************************************/
/* PERVASIVE KINDS */
/***************************************************************************/
MEM_KstEnt PERVINIT_kindDataTab[PERV_KIND_NUM];
/* Set up pervasive kind symbol table. */
/* The kind names are supposed to be written in the current top of system */
/* memory. */
static void PERVINIT_kindTabInit()
{
int tabInd;
for (tabInd = 0; tabInd < PERV_KIND_NUM; tabInd++) {
if (PERV_kindDataTab[tabInd].name)
PERVINIT_kindDataTab[tabInd].name=
PERVINIT_writeName(PERV_kindDataTab[tabInd].name);
else PERVINIT_kindDataTab[tabInd].name = NULL;
PERVINIT_kindDataTab[tabInd].arity=PERV_kindDataTab[tabInd].arity;
}
}
/* copy the pervasive kind table into given address */
void PERVINIT_copyKindDataTab(MEM_KstPtr dst)
{
memcpy((void*)dst, (void*)PERVINIT_kindDataTab,
MEM_KST_ENTRY_SIZE * WORD_SIZE * PERV_KIND_NUM);
}
/***************************************************************************/
/* PERVASIVE TYPE SKELETONS */
/***************************************************************************/
MEM_TstPtr PERVINIT_tySkelTab;
/* Set up pervasive type skeleton table. */
static void PERVINIT_tySkelTabInit()
{
PERVINIT_tySkelTab = PERV_tySkelTab;
PERV_tySkelTabInit();
}
/* copy the pervasive type skeleton table into given address */
void PERVINIT_copyTySkelTab(PERV_TySkelData* dst)
{
memcpy((void*)dst, (void*)PERVINIT_tySkelTab,
MEM_TST_ENTRY_SIZE * WORD_SIZE * PERV_TY_SKEL_NUM);
}
/***************************************************************************/
/* PERVASIVE CONSTANTS */
/***************************************************************************/
MEM_CstEnt PERVINIT_constDataTab[PERV_CONST_NUM];
/* Set up pervasive constant symbol table. */
/* The constant names are supposed to be written in the current top of */
/* system memory. */
static void PERVINIT_constTabInit()
{
int tabInd;
for (tabInd = 0; tabInd < PERV_CONST_NUM; tabInd++) {
if (PERV_constDataTab[tabInd].name)
PERVINIT_constDataTab[tabInd].name =
PERVINIT_writeName(PERV_constDataTab[tabInd].name);
else PERVINIT_constDataTab[tabInd].name = NULL;
PERVINIT_constDataTab[tabInd].typeEnvSize =
PERV_constDataTab[tabInd].typeEnvSize;
PERVINIT_constDataTab[tabInd].tskTabIndex =
PERV_constDataTab[tabInd].tskTabIndex;
PERVINIT_constDataTab[tabInd].neededness =
PERV_constDataTab[tabInd].neededness;
PERVINIT_constDataTab[tabInd].univCount =
PERV_constDataTab[tabInd].univCount;
PERVINIT_constDataTab[tabInd].precedence =
PERV_constDataTab[tabInd].precedence;
PERVINIT_constDataTab[tabInd].fixity =
PERV_constDataTab[tabInd].fixity;
}
}
/* copy the pervsive constant table into given address */
void PERVINIT_copyConstDataTab(MEM_CstPtr dst)
{
memcpy((void*)dst, (void*)PERVINIT_constDataTab,
MEM_CST_ENTRY_SIZE * WORD_SIZE * PERV_CONST_NUM);
}
/***************************************************************************/
/* PERVASIVE TABLES INITIALIZATION */
/* Fill in the actual pervasive tables; create string data needed for names*/
/* onto the current top of the system memory; create the type skeletons in */
/* a malloced space. */
/***************************************************************************/
void PERVINIT_tableInit()
{
PERVINIT_kindTabInit();
PERVINIT_tySkelTabInit();
PERVINIT_constTabInit();
}