/************************************************************************* * * * YAP Prolog %W% %G% * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: Atoms.h.m4 * * Last rev: 19/2/88 * * mods: * * comments: atom properties header file for YAP * * * *************************************************************************/ #ifndef ATOMS_H #define ATOMS_H 1 #ifndef EXTERN #ifndef ADTDEFS_C #define EXTERN static #else #define EXTERN #endif #endif #include typedef struct atom_blob { size_t length; char data[MIN_ARRAY]; } atom_blob_t; /********* operations for atoms ****************************************/ /* Atoms are assumed to be uniquely represented by an OFFSET and to have associated with them a struct of type AtomEntry The two functions RepAtom : Atom -> *AtomEntry AbsAtom : *AtomEntry -> Atom are used to encapsulate the implementation of atoms */ typedef struct AtomEntryStruct *Atom; typedef struct PropEntryStruct *Prop; /* I can only define the structure after I define the actual atoms */ /* atom structure */ typedef struct AtomEntryStruct { Atom NextOfAE; /* used to build hash chains */ Prop PropsOfAE; /* property list for this atom */ #if defined(YAPOR) || defined(THREADS) rwlock_t ARWLock; #endif union { char uStrOfAE[MIN_ARRAY]; /* representation of atom as a string */ wchar_t uWStrOfAE[MIN_ARRAY]; /* representation of atom as a string */ struct atom_blob blob[MIN_ARRAY]; } rep; } AtomEntry; // compatible with C and C++; typedef struct ExtraAtomEntryStruct { Atom NextOfAE; /* used to build hash chains */ Prop PropsOfAE; /* property list for this atom */ #if defined(YAPOR) || defined(THREADS) rwlock_t ARWLock; #endif union { char uStrOfAE[4]; /* representation of atom as a string */ wchar_t uWStrOfAE[2]; /* representation of atom as a string */ struct atom_blob blob[2]; } rep; } ExtraAtomEntry; #define StrOfAE rep.uStrOfAE #define WStrOfAE rep.uWStrOfAE /* Props and Atoms are stored in chains, ending with a NIL */ #ifdef USE_OFFSETS # define EndOfPAEntr(P) ( Addr(P) == AtomBase) #else # define EndOfPAEntr(P) ( Addr(P) == NIL ) #endif #define AtomName(at) RepAtom(at)->StrOfAE /* ********************** Properties **********************************/ #if defined(USE_OFFSETS) #define USE_OFFSETS_IN_PROPS 1 #else #define USE_OFFSETS_IN_PROPS 0 #endif typedef SFLAGS PropFlags; /* basic property entry structure */ typedef struct PropEntryStruct { Prop NextOfPE; /* used to chain properties */ PropFlags KindOfPE; /* kind of property */ } PropEntry; /* ************************* Functors **********************************/ /* Functor data type abstype Functor = atom # int with MkFunctor(a,n) = ... and NameOfFunctor(f) = ... and ArityOfFunctor(f) = ... */ #define MaxArity 255 typedef CELL arity_t; #define FunctorProperty ((PropFlags)(0xbb00)) /* functor property */ typedef struct FunctorEntryStruct { Prop NextOfPE; /* used to chain properties */ PropFlags KindOfPE; /* kind of property */ arity_t ArityOfFE; /* arity of functor */ Atom NameOfFE; /* back pointer to owner atom */ Prop PropsOfFE; /* pointer to list of properties for this functor */ #if defined(YAPOR) || defined(THREADS) rwlock_t FRWLock; #endif } FunctorEntry; typedef FunctorEntry *Functor; #endif /* ATOMS_H */