#ifndef TERMS #define TERMS #include "symbol.h" // type <= LEAF means it's a leaf, nkay? enum termtypes { GLOBAL, VARIABLE, LEAF, ENCRYPT, TUPLE }; //! The most basic datatype in the modelchecker. /** * Describes a single term. */ struct term { /* basic : name,runid encrypt: op,key tuple : op,next */ //! The type of term. /** * \sa GLOBAL, VARIABLE, LEAF, ENCRYPT, TUPLE */ int type; //! Data Type termlist (e.g. agent or nonce) /** Only for leaves. */ void *stype; //! Substitution term. /** * If this is non-NULL, this leaf term is apparently substituted by * this term. */ struct term *subst; // only for variable/leaf, substitution term union { Symbol symb; //! Encrypted subterm. struct term *op; //! Left-hand side of tuple pair. struct term *op1; struct term *next; // for alternative memory management } left; union { int runid; //! Key used to encrypt subterm. struct term *key; //! Right-hand side of tuple pair. struct term *op2; } right; }; //! Flag for term status extern int rolelocal_variable; //! Pointer shorthand. typedef struct term *Term; void termsInit (void); void termsDone (void); Term makeTermEncrypt (Term t1, Term t2); Term makeTermTuple (Term t1, Term t2); Term makeTermType (const int type, const Symbol symb, const int runid); __inline__ Term deVarScan (Term t); #define realTermLeaf(t) (t != NULL && t->type <= LEAF) #define realTermTuple(t) (t != NULL && t->type == TUPLE) #define realTermEncrypt(t) (t != NULL && t->type == ENCRYPT) #define realTermVariable(t) (t != NULL && (t->type == VARIABLE || (t->type <= LEAF && rolelocal_variable && t->right.runid == -3))) #define substVar(t) ((realTermVariable (t) && t->subst != NULL) ? 1 : 0) #define deVar(t) ( substVar(t) ? deVarScan(t->subst) : t) #define isTermLeaf(t) realTermLeaf(deVar(t)) #define isTermTuple(t) realTermTuple(deVar(t)) #define isTermEncrypt(t) realTermEncrypt(deVar(t)) #define isTermVariable(t) realTermVariable(deVar(t)) #ifdef DEBUG #define isTermEqual(t1,t2) isTermEqualDebug(t1,t2) int isTermEqualDebug (Term t1, Term t2); #else #define isTermEqual1(t1,t2) ((substVar(t1) || substVar(t2)) \ ? isTermEqualFn(t1,t2) \ : ( \ (t1 == t2) \ ? 1 \ : ( \ (t1 == NULL || t2 == NULL || t1->type != t2->type) \ ? 0 \ : ( \ realTermLeaf(t1) \ ? isTermEqualFn(t1,t2) \ : ( \ realTermEncrypt(t2) \ ? (isTermEqualFn(t1->right.key, t2->right.key) && \ isTermEqualFn(t1->left.op, t2->left.op)) \ : (isTermEqualFn(t1->left.op1, t2->left.op1) && \ isTermEqualFn(t1->right.op2, t2->right.op2)) \ ) \ ) \ ) \ ) \ ) #define isTermEqual2(t1,t2) ((substVar(t1) || substVar(t2)) \ ? isTermEqualFn(t1,t2) \ : ( \ (t1 == t2) \ ? 1 \ : ( \ (t1 == NULL || t2 == NULL || t1->type != t2->type) \ ? 0 \ : ( \ realTermLeaf(t1) \ ? isTermEqualFn(t1,t2) \ : ( \ realTermEncrypt(t2) \ ? (isTermEqual1(t1->right.key, t2->right.key) && \ isTermEqual1(t1->left.op, t2->left.op)) \ : (isTermEqual1(t1->left.op1, t2->left.op1) && \ isTermEqual1(t1->right.op2, t2->right.op2)) \ ) \ ) \ ) \ ) \ ) #define isTermEqual3(t1,t2) ((substVar(t1) || substVar(t2)) \ ? isTermEqualFn(t1,t2) \ : ( \ (t1 == t2) \ ? 1 \ : ( \ (t1 == NULL || t2 == NULL || t1->type != t2->type) \ ? 0 \ : ( \ realTermLeaf(t1) \ ? isTermEqualFn(t1,t2) \ : ( \ realTermEncrypt(t2) \ ? (isTermEqual2(t1->right.key, t2->right.key) && \ isTermEqual2(t1->left.op, t2->left.op)) \ : (isTermEqual2(t1->left.op1, t2->left.op1) && \ isTermEqual2(t1->right.op2, t2->right.op2)) \ ) \ ) \ ) \ ) \ ) #define isTermEqual(t1,t2) isTermEqual2(t1,t2) #endif int hasTermVariable (Term term); int isTermEqualFn (Term term1, Term term2); int termSubTerm (Term t, Term tsub); int termInTerm (Term t, Term tsub); void termPrint (Term term); void termTuplePrint (Term term); Term termDuplicate (const Term term); Term termNodeDuplicate (const Term term); Term termDuplicateDeep (const Term term); Term termDuplicateUV (Term term); void termDelete (const Term term); void termNormalize (Term term); Term termRunid (Term term, int runid); int tupleCount (Term tt); Term tupleProject (Term tt, int n); int termSize (Term t); float termDistance (Term t1, Term t2); int termOrder (Term t1, Term t2); int term_iterate (const Term term, int (*leaf) (), int (*nodel) (), int (*nodem) (), int (*noder) ()); int term_iterate_deVar (Term term, int (*leaf) (), int (*nodel) (), int (*nodem) (), int (*noder) ()); int term_iterate_leaves (const Term t, int (*func) ()); int term_iterate_open_leaves (const Term term, int (*func) ()); void term_rolelocals_are_variables (); int term_encryption_level (const Term term); float term_constrain_level (const Term term); void term_set_keylevels (const Term term); #endif