/* CoreBasics.h */ # ifndef CoreBasics # define CoreBasics #define nil 0 #define false 0 #define true 1 #define New(pointerType, recordType) (pointerType)MemoryAllocate(sizeof(recordType)) #define NewSeq(pointerType, recordType, elementType, size) (pointerType)MemoryAllocate(sizeof(recordType)-sizeof(elementType)+(size*sizeof(elementType))) #define Die {char *foo=nil; foo[0]='a';} #define Val(enumerationConstant) (int)enumerationConstant #define NatLast 2147483647L /* Basic Types */ typedef char *Ref; typedef Ref Atom; typedef unsigned Nat; typedef int Int; typedef int Bool; /* Basic Operations */ extern Nat Min(); /* result, Nat a, Nat b */ extern Nat Max(); /* result, Nat a, Nat b */ /* Bit Operations */ extern Nat NBits(); /* result, Nat n */ extern Bool EBFN(); /* result, Nat container, Nat index, Nat containerSize */ /* Memory Management */ extern Ref MemoryAllocate(); /* result, Nat bytes */ /* String */ typedef char *String; extern Bool StringEqual(); /* result, String first, String second */ extern Nat StringLength(); /* length, String string */ extern String StringCat(); /* result, String first, String second */ extern String StringFromNat(); /* string, Nat number */ extern void StringPrintIndent(); /* Nat indent, Bool cr=true */ /* List */ typedef struct ListRec { struct ListRec *rest; Ref first; } ListRec; typedef ListRec *List; typedef struct ListOfStringRec { struct ListOfStringRec *rest; String first; } ListOfStringRec; typedef ListOfStringRec *ListOfString; extern List ListCons(); /* new, List list, Ref item */ extern Nat ListLength(); /* length, List list */ extern Bool ListEnumerate(); /* List list, ListItemProc each, Ref context */ typedef Bool (*ListItemProc)(); /* quit, Ref item, Ref context */ extern Bool ListMemberString(); /* found, ListOfString list, String candidate */ /* Property */ typedef struct PropertyRec { struct PropertyRec *rest; Atom key; Ref value; } PropertyRec; typedef PropertyRec *Property; typedef PropertyRec *Properties; typedef void (* PropertyPrintProc)(); /* Atom property, Ref value, Nat indent, Nat level, Bool cr */ extern Atom PropertyRegister(); /* property, String name, PropertyPrintProc printProc */ extern Ref PropertyGet(); /* value, Properties from, Atom property */ extern Property PropertyPut(); /* new, Properties on, Atom property, Ref value */ /* value==nil => remove property, the storage for the property becomes garbage */ extern void PropertyPrint(); /* Properties properties, Nat indent=0, Bool cr=true, Nat level=2 */ extern void PropertyPrintString(); /* PropertyPrintProc */ /* Hash Table */ typedef struct BucketsRec { Nat size; Properties elements[1]; } BucketsRec; typedef BucketsRec *Buckets; typedef Nat (* HashProc)(); /* index, Ref key */ typedef Bool (* EqualProc)(); /* equal, Ref key1, Ref key2 */ typedef struct HashTableRec { HashProc hash; EqualProc equal; Nat size; Nat sizeLimit; Buckets buckets; } HashTableRec; typedef HashTableRec *HashTable; extern Nat HashTableHashString(); /* HashProc */ extern HashTable HashTableCreate(); /* table, Nat size=17, HashProc hash=nil, EqualProc equal=nil */ /* hash==nil => HashTableRefHash, equal==nil => HashTableRefEqual /* value1==value2 => hash(key1)==hash(key2) */ extern Nat HashTableSize(); /* size, HashTable table */ extern Ref HashTableGet(); /* value, HashTable table, Ref key */ /* value==nil => not found */ extern void HashTablePut(); /* HashTable table, Ref key, Ref value */ /* value==nil => delete pair */ extern void HashTableFree(); /* HashTablePointer table */ /* releases HashTableRec, BucketsRec, and PropertyRec */ typedef Ref (* HashTableUpdateAction)(); /* newValue, Ref key, Ref value, Ref context */ /* newValue==nil => delete pair */ extern void HashTableUpdate(); /* HashTable table, HashTableUpdateAction action, Ref context */ /* enumerates pairs currently in table in unspecified order; applies action to each pair */ # endif