//////////////////////////////////////////////////////////////////////////////
//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 dataformat.c. */
/* The header file identifies the low-level representation of data objects */
/* that are manipulated by the machine, through various structure types. */
/****************************************************************************/
#ifndef DATAFORMATS_C
#define DATAFORMATS_C
#include
#include
#include "dataformats.h"
#include "mctypes.h"
#include "mcstring.h"
/********************************************************************/
/* */
/* TYPE REPRESENTATION */
/* */
/********************************************************************/
/* Types of relevant fields in type representations. */
typedef TwoBytes DF_KstTabInd; //kind symbol table index
typedef TwoBytes DF_StrTypeArity; //arity of type structure
typedef TwoBytes DF_SkelInd; //offset of variables in type skeletons
/* Structure definitions of each type category. */
typedef struct //type sort
{
DF_Tag tag;
DF_KstTabInd kindTabIndex;
} DF_SortType;
typedef struct //type reference
{
DF_Tag tag;
DF_TypePtr target;
} DF_RefType;
typedef struct //variables in type skeletons
{
DF_Tag tag;
DF_SkelInd offset;
} DF_SkVarType;
typedef struct //type arrows
{
DF_Tag tag;
DF_TypePtr args;
} DF_ArrowType;
typedef struct //type functors
{
DF_Tag tag;
DF_StrTypeArity arity;
DF_KstTabInd kindTabIndex;
} DF_FuncType;
typedef struct //type structures
{
DF_Tag tag;
DF_FuncType *funcAndArgs;
} DF_StrType;
/******************************************************************/
/* Interface functions */
/******************************************************************/
/* TYPE DEREFERENCE */
DF_TypePtr DF_typeDeref(DF_TypePtr tyPtr)
{
DF_Type ty = *tyPtr;
while ((ty.tag.categoryTag == DF_TY_TAG_REF)){
DF_TypePtr target = (DF_TypePtr)(ty.dummy);
if (tyPtr == target) return tyPtr;
tyPtr = target;
ty = *tyPtr;
}
return tyPtr;
}
/* TYPE RECOGNITION */
Boolean DF_isSortType(DF_TypePtr tyPtr)
{ return (tyPtr->tag.categoryTag == DF_TY_TAG_SORT); }
Boolean DF_isRefType(DF_TypePtr tyPtr)
{ return (tyPtr->tag.categoryTag == DF_TY_TAG_REF); }
Boolean DF_isSkelVarType(DF_TypePtr tyPtr)
{ return (tyPtr->tag.categoryTag == DF_TY_TAG_SKVAR);}
Boolean DF_isArrowType(DF_TypePtr tyPtr)
{ return (tyPtr->tag.categoryTag == DF_TY_TAG_ARROW);}
Boolean DF_isStrType(DF_TypePtr tyPtr)
{ return (tyPtr->tag.categoryTag == DF_TY_TAG_STR); }
Boolean DF_isFreeVarType(DF_TypePtr tyPtr)
{ return ((tyPtr->tag.categoryTag == DF_TY_TAG_REF)
&& ((DF_RefType*)tyPtr)->target == tyPtr); }
/* TYPE DECOMPOSITION */
int DF_typeTag(DF_TypePtr tyPtr) //generic type
{
return tyPtr->tag.categoryTag;
}
int DF_typeKindTabIndex(DF_TypePtr tyPtr) //sorts
{
return ((DF_SortType*)tyPtr) -> kindTabIndex;
}
int DF_typeSkelVarIndex(DF_TypePtr tyPtr) //skel var
{
return ((DF_SkVarType*)tyPtr) -> offset;
}
DF_TypePtr DF_typeRefTarget(DF_TypePtr tyPtr) //reference
{
return ((DF_RefType*)tyPtr) -> target;
}
DF_TypePtr DF_typeArrowArgs(DF_TypePtr tyPtr) //arrows
{
return ((DF_ArrowType*)tyPtr) -> args;
}
DF_TypePtr DF_typeStrFuncAndArgs(DF_TypePtr tyPtr) //structures
{
return (DF_TypePtr)(((DF_StrType*)tyPtr)->funcAndArgs);
}
int DF_typeStrFuncInd(DF_TypePtr tyPtr)
{//Note tyPtr must refer to funcAndArgs field
return ((DF_FuncType*)tyPtr)->kindTabIndex;
}
int DF_typeStrFuncArity(DF_TypePtr tyPtr)
{//Note tyPtr must refer to funcAndArgs field
return ((DF_FuncType*)tyPtr)->arity;
}
DF_TypePtr DF_typeStrArgs(DF_TypePtr tyPtr)
{//Note tyPtr must refer to funcAndArgs field
return (DF_TypePtr)(((MemPtr)tyPtr) + DF_TY_ATOMIC_SIZE);
}
/* TYPE CONSTRUCTION */
void DF_copyAtomicType(DF_TypePtr src, MemPtr dest)
{
*((DF_TypePtr)dest) = *src;
}
void DF_mkSortType(MemPtr loc, int ind)
{
((DF_SortType*)loc)->tag.categoryTag = DF_TY_TAG_SORT;
((DF_SortType*)loc)->kindTabIndex = ind;
}
void DF_mkRefType(MemPtr loc, DF_TypePtr target)
{
((DF_RefType*)loc)->tag.categoryTag = DF_TY_TAG_REF;
((DF_RefType*)loc)->target = target;
}
void DF_mkFreeVarType(MemPtr loc)
{
((DF_RefType*)loc)->tag.categoryTag = DF_TY_TAG_REF;
((DF_RefType*)loc)->target = (DF_TypePtr)loc;
}
void DF_mkSkelVarType(MemPtr loc, int offset)
{
((DF_SkVarType*)loc)->tag.categoryTag = DF_TY_TAG_SKVAR;
((DF_SkVarType*)loc)->offset = offset;
}
void DF_mkArrowType(MemPtr loc, DF_TypePtr args)
{
((DF_ArrowType*)loc)->tag.categoryTag = DF_TY_TAG_ARROW;
((DF_ArrowType*)loc)->args = args;
}
void DF_mkStrType(MemPtr loc, DF_TypePtr funcAndArgs)
{
((DF_StrType*)loc)->tag.categoryTag = DF_TY_TAG_STR;
((DF_StrType*)loc)->funcAndArgs = (DF_FuncType*)funcAndArgs;
}
void DF_mkStrFuncType(MemPtr loc, int ind, int n)
{
((DF_FuncType*)loc)->tag.categoryTag = DF_TY_TAG_FUNC;
((DF_FuncType*)loc)->kindTabIndex = ind;
((DF_FuncType*)loc)->arity = n;
}
/********************************************************************/
/* */
/* TERM REPRESENTATION */
/* */
/********************************************************************/
/* types of relevant fields in term representions */
typedef TwoBytes DF_UnivInd; //universe count
typedef TwoBytes DF_CstTabInd; //constant symbol table index
typedef TwoBytes DF_Arity; //application arity
typedef TwoBytes DF_DBInd; //de Bruijn ind, embed level and num of lams
typedef WordPtr DF_StreamTabInd;
typedef struct //logic variables
{
DF_Tag tag;
DF_UnivInd univCount;
} DF_VarTerm;
typedef struct //de Bruijn indices
{
DF_Tag tag;
DF_DBInd index;
} DF_BVTerm;
typedef struct { //name and universe count field for constants
DF_UnivInd univCount;
DF_CstTabInd symTabIndex;
} DF_NameAndUC;
typedef struct { //constant without type association
DF_Tag tag;
Boolean withType;
union {
unsigned int value;
DF_NameAndUC nameAndUC;
} data;
} DF_ConstTerm;
typedef struct { //constant with type association
DF_Tag tag;
Boolean withType;
union {
unsigned int value;
DF_NameAndUC nameAndUC;
} data;
DF_TypePtr typeEnv;
} DF_TConstTerm;
typedef struct //integers
{
DF_Tag tag;
long int value;
} DF_IntTerm;
typedef struct //floats
{
DF_Tag tag;
float value;
} DF_FloatTerm;
typedef struct //string
{
DF_Tag tag;
DF_StrDataPtr value;
} DF_StrTerm;
typedef struct //stream
{
DF_Tag tag;
DF_StreamTabInd index;
} DF_StreamTerm;
typedef struct //empty list
{
DF_Tag tag;
} DF_NilTerm;
typedef struct //reference
{
DF_Tag tag;
DF_TermPtr target;
} DF_RefTerm;
typedef struct //list cons
{
DF_Tag tag;
DF_TermPtr args;
} DF_ConsTerm;
typedef struct //abstractions
{
DF_Tag tag;
DF_DBInd numOfLams;
DF_TermPtr body;
} DF_LamTerm;
typedef struct //applications
{
DF_Tag tag;
DF_Arity arity;
DF_TermPtr functor;
DF_TermPtr args;
} DF_AppTerm;
typedef struct //suspensions
{
DF_Tag tag;
DF_DBInd ol;
DF_DBInd nl;
DF_TermPtr termSkel;
DF_EnvPtr envList;
} DF_SuspTerm;
//environment items
typedef struct //dummy environment item
{
//Boolean isDummy;
DF_Tag tag;
DF_DBInd embedLevel;
DF_EnvPtr rest;
} DF_DummyEnv;
typedef struct //pair environment item
{
//Boolean isDummy;
DF_Tag tag;
DF_DBInd embedLevel;
DF_EnvPtr rest;
DF_TermPtr term;
} DF_PairEnv;
/******************************************************************/
/* Interface functions */
/******************************************************************/
/* DEREFERENCE */
DF_TermPtr DF_termDeref(DF_TermPtr tmPtr)
{
while (DF_isRef(tmPtr)) tmPtr = ((DF_RefTerm*)tmPtr)->target;
return tmPtr;
}
/* TERM RECOGNITION */
//note ref is neither atomic nor complex
Boolean DF_isAtomic(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag < DF_TM_TAG_REF); }
Boolean DF_isNAtomic(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag > DF_TM_TAG_REF); }
Boolean DF_isFV(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_VAR); }
Boolean DF_isConst(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_CONST); }
/*assume the tmPtr is known to be a constant */
Boolean DF_isTConst(DF_TermPtr tmPtr)
{ return ((DF_ConstTerm*)tmPtr) -> withType; }
Boolean DF_isInt(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_INT); }
Boolean DF_isFloat(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_FLOAT); }
Boolean DF_isNil(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_NIL); }
Boolean DF_isStr(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_STR); }
Boolean DF_isBV(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_BVAR); }
Boolean DF_isStream(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_STREAM);}
Boolean DF_isRef(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_REF); }
Boolean DF_isCons(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_CONS); }
Boolean DF_isLam(DF_TermPtr tmPtr)
{ return (tmPtr -> tag.categoryTag == DF_TM_TAG_LAM); }
Boolean DF_isApp(DF_TermPtr tmPtr)
{ return (tmPtr-> tag.categoryTag == DF_TM_TAG_APP); }
Boolean DF_isSusp(DF_TermPtr tmPtr)
{ return (tmPtr-> tag.categoryTag == DF_TM_TAG_SUSP); }
Boolean DF_isEmpEnv(DF_EnvPtr envPtr)
{ return (envPtr == DF_EMPTY_ENV); }
Boolean DF_isDummyEnv(DF_EnvPtr envPtr)
{ return envPtr -> tag.categoryTag == DF_ENV_TAG_DUMMY; }
/* TERM DECOMPOSITION */
int DF_termTag(DF_TermPtr tmPtr) // tag
{
return tmPtr -> tag.categoryTag;
}
//unbound variables
int DF_fvUnivCount(DF_TermPtr tmPtr) //universe count
{
return ((DF_VarTerm*)tmPtr)->univCount;
}
//constant (w/oc type associations)
int DF_constUnivCount(DF_TermPtr tmPtr) //universe count
{
return ((DF_ConstTerm*)tmPtr)->data.nameAndUC.univCount;
}
int DF_constTabIndex(DF_TermPtr tmPtr) //table index
{
return ((DF_ConstTerm*)tmPtr)->data.nameAndUC.symTabIndex;
}
//constants with type associations
DF_TypePtr DF_constType(DF_TermPtr tmPtr) //type env
{
return ((DF_TConstTerm*)tmPtr)->typeEnv;
}
//integer
long DF_intValue(DF_TermPtr tmPtr) //integer value
{
return ((DF_IntTerm*)tmPtr)->value;
}
//float
float DF_floatValue(DF_TermPtr tmPtr) //float value
{
return ((DF_FloatTerm*)tmPtr)->value;
}
//string
MCSTR_Str DF_strValue(DF_TermPtr tmPtr) //string value
{
return (MCSTR_Str)(((MemPtr)(((DF_StrTerm*)tmPtr)->value))
+ DF_STRDATA_HEAD_SIZE);
}
DF_StrDataPtr DF_strData(DF_TermPtr tmPtr) //string data field
{
return ((DF_StrTerm*)tmPtr)->value;
}
MCSTR_Str DF_strDataValue(DF_StrDataPtr tmPtr) //acc str value from data fd
{
return (MCSTR_Str)(((MemPtr)tmPtr) + DF_STRDATA_HEAD_SIZE);
}
//stream TEMP
WordPtr DF_streamTabIndex(DF_TermPtr tmPtr) //stream table index
{
return ((DF_StreamTerm*)tmPtr)->index;
}
//de Bruijn index
int DF_bvIndex(DF_TermPtr tmPtr) //de Bruijn index
{
return ((DF_BVTerm*)tmPtr)->index;
}
//reference
DF_TermPtr DF_refTarget(DF_TermPtr tmPtr) //target
{
return ((DF_RefTerm*)tmPtr)->target;
}
//list cons
DF_TermPtr DF_consArgs(DF_TermPtr tmPtr) //arg vector
{
return ((DF_ConsTerm*)tmPtr)->args;
}
//abstraction
int DF_lamNumAbs(DF_TermPtr tmPtr) //embedding level
{
return ((DF_LamTerm*)tmPtr)->numOfLams;
}
DF_TermPtr DF_lamBody(DF_TermPtr tmPtr) //abstraction body
{
return ((DF_LamTerm*)tmPtr)->body;
}
//application
int DF_appArity(DF_TermPtr tmPtr) //arity
{
return ((DF_AppTerm*)tmPtr)->arity;
}
DF_TermPtr DF_appFunc(DF_TermPtr tmPtr) //functor
{
return ((DF_AppTerm*)tmPtr)->functor;
}
DF_TermPtr DF_appArgs(DF_TermPtr tmPtr) //arg vector
{
return ((DF_AppTerm*)tmPtr)->args;
}
//suspension
int DF_suspOL(DF_TermPtr tmPtr) //ol
{
return ((DF_SuspTerm*)tmPtr)->ol;
}
int DF_suspNL(DF_TermPtr tmPtr) //nl
{
return ((DF_SuspTerm*)tmPtr)->nl;
}
DF_TermPtr DF_suspTermSkel(DF_TermPtr tmPtr) //term skeleton
{
return ((DF_SuspTerm*)tmPtr)->termSkel;
}
DF_EnvPtr DF_suspEnv(DF_TermPtr tmPtr) //environment list
{
return ((DF_SuspTerm*)tmPtr)->envList;
}
//environment item (dummy/pair)
DF_EnvPtr DF_envListRest(DF_EnvPtr envPtr) //next env item
{
return envPtr->rest;
}
DF_EnvPtr DF_envListNth(DF_EnvPtr envPtr, int n) //nth item
{
int i;
for (i=n; (i!=1); i--) envPtr = envPtr -> rest;
return envPtr;
}
int DF_envIndex(DF_EnvPtr envPtr) //l in @l or (t,l)
{
return envPtr -> embedLevel;
}
//pair environment item
DF_TermPtr DF_envPairTerm(DF_EnvPtr envPtr) //t in (t,l)
{
return ((DF_PairEnv*)envPtr) -> term;
}
/* TERM CONSTRUCTION */
void DF_copyAtomic(DF_TermPtr src, MemPtr dest) //copy atomic
{
*((DF_TermPtr)dest) = *src;
}
void DF_copyApp(DF_TermPtr src, MemPtr dest) //copy application
{
*((DF_AppTerm*)dest) = *((DF_AppTerm*)src);
}
void DF_copySusp(DF_TermPtr src, MemPtr dest) //copy suspension
{
*((DF_SuspTerm*)dest) = *((DF_SuspTerm*)src);
}
void DF_mkVar(MemPtr loc, int uc) //unbound variable
{
((DF_VarTerm*)loc) -> tag.categoryTag = DF_TM_TAG_VAR;
((DF_VarTerm*)loc) -> univCount = uc;
}
void DF_mkBV(MemPtr loc, int ind) //de Bruijn index
{
((DF_BVTerm*)loc) -> tag.categoryTag = DF_TM_TAG_BVAR;
((DF_BVTerm*)loc) -> index = ind;
}
void DF_mkConst(MemPtr loc, int uc, int ind) //const
{
((DF_ConstTerm*)loc) -> tag.categoryTag = DF_TM_TAG_CONST;
((DF_ConstTerm*)loc) -> withType = FALSE;
(((DF_ConstTerm*)loc) -> data).nameAndUC.univCount = uc;
(((DF_ConstTerm*)loc) -> data).nameAndUC.symTabIndex = ind;
}
void DF_mkTConst(MemPtr loc, int uc, int ind, DF_TypePtr typeEnv)
//const with type association
{
((DF_TConstTerm*)loc) -> tag.categoryTag = DF_TM_TAG_CONST;
((DF_TConstTerm*)loc) -> withType = TRUE;
(((DF_TConstTerm*)loc) -> data).nameAndUC.univCount = uc;
(((DF_TConstTerm*)loc) -> data).nameAndUC.symTabIndex = ind;
((DF_TConstTerm*)loc) -> typeEnv = typeEnv;
}
void DF_mkInt(MemPtr loc, long value) //int
{
((DF_IntTerm*)loc) -> tag.categoryTag = DF_TM_TAG_INT;
((DF_IntTerm*)loc) -> value = value;
}
void DF_mkFloat(MemPtr loc, float value) //float
{
((DF_FloatTerm*)loc) -> tag.categoryTag = DF_TM_TAG_FLOAT;
((DF_FloatTerm*)loc) -> value = value;
}
void DF_mkStr(MemPtr loc, DF_StrDataPtr data) //string
{
((DF_StrTerm*)loc) -> tag.categoryTag = DF_TM_TAG_STR;
((DF_StrTerm*)loc) -> value = data;
}
void DF_mkStrDataHead(MemPtr loc) //string data head
{
((DF_StrDataPtr)loc) -> tag.categoryTag = DF_TM_TAG_STRBODY;
}
void DF_mkStream(MemPtr loc, WordPtr ind) //stream
{
((DF_StreamTerm*)loc) -> tag.categoryTag = DF_TM_TAG_STREAM;
((DF_StreamTerm*)loc) -> index = ind;
}
void DF_setStreamInd(DF_TermPtr tm, WordPtr ind) //update stream ind
{
((DF_StreamTerm*)tm) -> index = ind;
}
void DF_mkNil(MemPtr loc) //nil
{
((DF_NilTerm*)loc) -> tag.categoryTag = DF_TM_TAG_NIL;
}
void DF_mkRef(MemPtr loc, DF_TermPtr target) //reference
{
((DF_RefTerm*)loc) -> tag.categoryTag = DF_TM_TAG_REF;
((DF_RefTerm*)loc) -> target = target;
}
void DF_mkCons(MemPtr loc, DF_TermPtr args) //cons
{
((DF_ConsTerm*)loc) -> tag.categoryTag = DF_TM_TAG_CONS;
((DF_ConsTerm*)loc) -> args = args;
}
void DF_mkLam(MemPtr loc, int n, DF_TermPtr body) //abstraction
{
((DF_LamTerm*)loc) -> tag.categoryTag = DF_TM_TAG_LAM;
((DF_LamTerm*)loc) -> numOfLams = n;
((DF_LamTerm*)loc) -> body = body;
}
void DF_mkApp(MemPtr loc, int n, DF_TermPtr func, DF_TermPtr args)
{ //application
((DF_AppTerm*)loc) -> tag.categoryTag = DF_TM_TAG_APP;
((DF_AppTerm*)loc) -> arity = n;
((DF_AppTerm*)loc) -> functor = func;
((DF_AppTerm*)loc) -> args = args;
}
void DF_mkSusp(MemPtr loc, int ol, int nl, DF_TermPtr tmPtr, DF_EnvPtr env)
//suspension
{
((DF_SuspTerm*)loc) -> tag.categoryTag = DF_TM_TAG_SUSP;
((DF_SuspTerm*)loc) -> ol = ol;
((DF_SuspTerm*)loc) -> nl = nl;
((DF_SuspTerm*)loc) -> termSkel = tmPtr;
((DF_SuspTerm*)loc) -> envList = env;
}
void DF_mkDummyEnv(MemPtr loc, int l, DF_EnvPtr rest) //@l env item
{
((DF_DummyEnv*)loc) -> tag.categoryTag = DF_ENV_TAG_DUMMY;
((DF_DummyEnv*)loc) -> embedLevel = l;
((DF_DummyEnv*)loc) -> rest = rest;
}
void DF_mkPairEnv(MemPtr loc, int l, DF_TermPtr t, DF_EnvPtr rest)
{
// (t, l) env item
((DF_PairEnv*)loc) -> tag.categoryTag = DF_ENV_TAG_PAIR;
((DF_PairEnv*)loc) -> embedLevel = l;
((DF_PairEnv*)loc) -> rest = rest;
((DF_PairEnv*)loc) -> term = t;
}
/* TERM MODIFICATION */
void DF_modVarUC(DF_TermPtr vPtr, int uc)
{
((DF_VarTerm*)vPtr) -> univCount = uc;
}
/* (NON_TRIVIAL) TERM COMPARISON */
Boolean DF_sameConsts(DF_TermPtr const1, DF_TermPtr const2) //same constant?
{
return (((DF_ConstTerm*)const1)->data.value ==
((DF_ConstTerm*)const2)->data.value);
}
Boolean DF_sameStrs(DF_TermPtr str1, DF_TermPtr str2) //same string?
{
if (str1 == str2) return TRUE;
else if (((DF_StrTerm*)str1)->value ==
((DF_StrTerm*)str2)->value) return TRUE; //compare data fd addr
//compare literals
return MCSTR_sameStrs(
(MCSTR_Str)(((MemPtr)(((DF_StrTerm*)str1)->value)) +
DF_STRDATA_HEAD_SIZE),
(MCSTR_Str)(((MemPtr)(((DF_StrTerm*)str2)->value)) +
DF_STRDATA_HEAD_SIZE));
}
Boolean DF_sameStrData(DF_TermPtr tmPtr, DF_StrDataPtr strData)
{
if (((DF_StrTerm*)tmPtr) -> value == strData) return TRUE; //compare addr
return MCSTR_sameStrs(
(MCSTR_Str)(((MemPtr)(((DF_StrTerm*)tmPtr)->value)) +
DF_STRDATA_HEAD_SIZE),
(MCSTR_Str)(((MemPtr)strData) + DF_STRDATA_HEAD_SIZE));
}
/********************************************************************/
/* */
/* DISAGREEMENT SET REPRESENTATION */
/* */
/* A double linked list */
/********************************************************************/
//create a new node at the given location
void DF_mkDisPair(MemPtr loc, DF_DisPairPtr next, DF_TermPtr first,
DF_TermPtr second)
{
((DF_DisPairPtr)(loc)) -> tag.categoryTag = DF_DISPAIR;
((DF_DisPairPtr)(loc)) -> next = next;
((DF_DisPairPtr)(loc)) -> firstTerm = first;
((DF_DisPairPtr)(loc)) -> secondTerm = second;
}
//decomposition
DF_DisPairPtr DF_disPairNext(DF_DisPairPtr disPtr){return disPtr -> next; }
DF_TermPtr DF_disPairFirstTerm(DF_DisPairPtr disPtr)
{
return disPtr -> firstTerm;
}
DF_TermPtr DF_disPairSecondTerm(DF_DisPairPtr disPtr)
{
return disPtr -> secondTerm;
}
//whether a given disagreement set is empty
Boolean DF_isEmpDisSet(DF_DisPairPtr disPtr)
{
return (disPtr == DF_EMPTY_DIS_SET);
}
Boolean DF_isNEmpDisSet(DF_DisPairPtr disPtr)
{
return (disPtr != DF_EMPTY_DIS_SET);
}
#endif //DATAFORMATS_C