- Fixed a condition check in termlistAddNew.
- Roles are now computed from prec for each claim.
This commit is contained in:
		
							parent
							
								
									542044e36f
								
							
						
					
					
						commit
						d8e0e93bcf
					
				| @ -3,6 +3,7 @@ | ||||
| #include "tac.h" | ||||
| #include "term.h" | ||||
| #include "termlist.h" | ||||
| #include "label.h" | ||||
| #include "memory.h" | ||||
| #include "system.h" | ||||
| #include "knowledge.h" | ||||
| @ -20,19 +21,6 @@ | ||||
| static System sys; | ||||
| static Tac tac_root; | ||||
| 
 | ||||
| /*
 | ||||
|  * Structure to store label information | ||||
|  */ | ||||
| struct labelinfo | ||||
| { | ||||
|     Term label; | ||||
|     Term protocol; | ||||
|     Term sendrole; | ||||
|     Term readrole; | ||||
| }; | ||||
| 
 | ||||
| typedef struct labelinfo Labelinfo; | ||||
| 
 | ||||
| /*
 | ||||
|  * Declaration from system.c | ||||
|  */ | ||||
| @ -391,6 +379,7 @@ commEvent (int event, Tac tc) | ||||
|   Term claimbig = NULL; | ||||
|   int n = 0; | ||||
|   Tac trip; | ||||
|   Labelinfo linfo; | ||||
| 
 | ||||
|   /* Construct label, if any */ | ||||
|   if (tc->t1.sym == NULL) | ||||
| @ -417,6 +406,20 @@ commEvent (int event, Tac tc) | ||||
| 	    makeTermTuple (thisProtocol->nameterm, label); | ||||
| 	} | ||||
|     } | ||||
|   /**
 | ||||
|    * We now know the label. Find the corresponding labelinfo bit or make a new one | ||||
|    */ | ||||
|   linfo = label_find (sys->labellist, label); | ||||
|   if (linfo == NULL) | ||||
|     { | ||||
|       /* Not found, make a new one */ | ||||
|       linfo = label_create (label, thisProtocol); | ||||
|       sys->labellist = list_append (sys->labellist, linfo); | ||||
|     } | ||||
| 
 | ||||
|   /**
 | ||||
|    * Parse the specific event type | ||||
|    */ | ||||
|   trip = tc->t2.tac; | ||||
|   switch (event) | ||||
|     { | ||||
| @ -434,11 +437,24 @@ commEvent (int event, Tac tc) | ||||
| 
 | ||||
|       if (event == SEND) | ||||
| 	{ | ||||
| 	  /* set sendrole */ | ||||
| 	  if (linfo->sendrole != NULL) | ||||
| 	      error ("Label defined twice for sendrole!"); | ||||
| 	  linfo->sendrole = fromrole; | ||||
| 
 | ||||
| 	  /* set keylevels based on send events */ | ||||
| 	  term_set_keylevels (fromrole); | ||||
| 	  term_set_keylevels (torole); | ||||
| 	  term_set_keylevels (msg); | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  // READ
 | ||||
| 	  /* set readrole */ | ||||
| 	  if (linfo->readrole != NULL) | ||||
| 	      error ("Label defined twice for readrole!"); | ||||
| 	  linfo->readrole = torole; | ||||
| 	} | ||||
| 
 | ||||
|       break; | ||||
|     case CLAIM: | ||||
| @ -518,6 +534,7 @@ commEvent (int event, Tac tc) | ||||
|       cl->complete = 0; | ||||
|       cl->failed = 0; | ||||
|       cl->prec = NULL; | ||||
|       cl->roles = NULL; | ||||
|       cl->next = sys->claimlist; | ||||
|       sys->claimlist = cl; | ||||
| 
 | ||||
| @ -905,6 +922,30 @@ compute_role_variables (const System sys, Protocol p, Role r) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| //! Compute term list of rolenames involved in a given term list of labels
 | ||||
| Termlist  | ||||
| compute_label_roles (Termlist labels) | ||||
| { | ||||
|   Termlist roles; | ||||
| 
 | ||||
|   roles = NULL; | ||||
|   while (labels != NULL) | ||||
|     { | ||||
|       Labelinfo linfo; | ||||
| 
 | ||||
|       linfo = label_find (sys->labellist, labels->term); | ||||
| #ifdef DEBUG | ||||
|       if (linfo == NULL) | ||||
| 	  error ("Label in prec list not found in label info list"); | ||||
| #endif | ||||
|       roles = termlistAddNew (roles, linfo->sendrole); | ||||
|       roles = termlistAddNew (roles, linfo->readrole); | ||||
| 
 | ||||
|       labels = labels->next; | ||||
|     } | ||||
|   return roles; | ||||
| } | ||||
| 
 | ||||
| //! Compute prec() sets for each claim.
 | ||||
| /**
 | ||||
|  * Generates two auxiliary structures. First, a table that contains | ||||
| @ -1180,6 +1221,12 @@ compute_prec_sets (const System sys) | ||||
| 	    } | ||||
| 	  r2++; | ||||
| 	} | ||||
|       /**
 | ||||
|        * cl->prec is done, now we infer cl->roles | ||||
|        */ | ||||
| 
 | ||||
|       cl->roles = compute_label_roles (cl->prec); | ||||
| 
 | ||||
|       /**
 | ||||
|        * --------------------------- | ||||
|        * Distinguish types of claims | ||||
| @ -1268,9 +1315,21 @@ compute_prec_sets (const System sys) | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  // printf ("Preceding label set for r:%i, ev:%i = ", r1,ev1);
 | ||||
| 	  // termlistPrint (cl->prec);
 | ||||
| 	  // printf ("\n");
 | ||||
| #ifdef DEBUG | ||||
| 	  if (DEBUGL (3)) | ||||
| 	    { | ||||
| 	      Protocol p; | ||||
| 
 | ||||
| 	      printf ("Preceding label set for r:%i, ev:%i = ", r1,ev1); | ||||
| 	      termlistPrint (cl->prec); | ||||
| 	      printf (", involving roles "); | ||||
| 	      termlistPrint (cl->roles); | ||||
| 	      printf (", from protocol "); | ||||
| 	      p = (Protocol) cl->protocol; | ||||
| 	      termPrint (p->nameterm); | ||||
| 	      printf ("\n"); | ||||
| 	    } | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
|       // Proceed to next claim
 | ||||
|  | ||||
							
								
								
									
										32
									
								
								src/label.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								src/label.c
									
									
									
									
									
								
							| @ -5,8 +5,11 @@ | ||||
| #include "memory.h" | ||||
| #include "term.h" | ||||
| #include "label.h" | ||||
| #include "list.h" | ||||
| #include "system.h" | ||||
| 
 | ||||
| Labelinfo label_create (const Term label, const Term protocol) | ||||
| //! Create a new labelinfo node
 | ||||
| Labelinfo label_create (const Term label, const Protocol protocol) | ||||
| { | ||||
|   Labelinfo li; | ||||
| 
 | ||||
| @ -18,8 +21,35 @@ Labelinfo label_create (const Term label, const Term protocol) | ||||
|   return li; | ||||
| } | ||||
| 
 | ||||
| //! Destroy a labelinfo node
 | ||||
| void label_destroy (Labelinfo linfo) | ||||
| { | ||||
|   memFree (linfo, sizeof (struct labelinfo)); | ||||
| } | ||||
| 
 | ||||
| //! Given a list of label infos, yield the correct one or NULL
 | ||||
| Labelinfo label_find (List labellist, const Term label) | ||||
| { | ||||
|   Labelinfo linfo; | ||||
| 
 | ||||
|   int scan (void *data) | ||||
|     { | ||||
|       Labelinfo linfo_scan; | ||||
| 
 | ||||
|       linfo_scan = (Labelinfo) data; | ||||
|       if (isTermEqual (label, linfo_scan->label)) | ||||
| 	{ | ||||
| 	  linfo = linfo_scan; | ||||
| 	  return 0; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  return 1; | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|   linfo = NULL; | ||||
|   list_iterate (labellist, scan); | ||||
|   return linfo; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -2,6 +2,8 @@ | ||||
| #define LABEL | ||||
| 
 | ||||
| #include "term.h" | ||||
| #include "list.h" | ||||
| #include "system.h" | ||||
| 
 | ||||
| /*
 | ||||
|  * Structure to store label information | ||||
| @ -16,7 +18,8 @@ struct labelinfo | ||||
| 
 | ||||
| typedef struct labelinfo* Labelinfo; | ||||
| 
 | ||||
| Labelinfo label_create (const Term label, const Term protocol); | ||||
| Labelinfo label_create (const Term label, const Protocol protocol); | ||||
| void label_destroy (Labelinfo linfo); | ||||
| Labelinfo label_find (List labellist, const Term label); | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -37,6 +37,8 @@ struct claimlist | ||||
|   int ev;			//!< event index in role
 | ||||
|   //! Preceding label list
 | ||||
|   Termlist prec; | ||||
|   //! Roles that are involved (nameterms)
 | ||||
|   Termlist roles; | ||||
|   //! Next node pointer or NULL for the last element of the function.
 | ||||
|   struct claimlist *next; | ||||
| }; | ||||
|  | ||||
| @ -222,7 +222,7 @@ termlistAppend (const Termlist tl, const Term term) | ||||
| Termlist | ||||
| termlistAddNew (const Termlist tl, const Term t) | ||||
| { | ||||
|   if (inTermlist (tl, t)) | ||||
|   if (t == NULL || inTermlist (tl, t)) | ||||
|     return tl; | ||||
|   else | ||||
|     return termlistAdd (tl, t); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user