Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Avoid dangling pointer.
[simgrid.git] / src / xbt / automaton / automaton.c
index 31ab17c..9fde6ed 100644 (file)
@@ -1,13 +1,15 @@
 /* automaton - representation of büchi automaton */
 
-/* Copyright (c) 2011-2015. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2011-2017. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/automaton.h"
 #include <stdio.h> /* printf */
+#include <xbt/log.h>
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_automaton, xbt, "Automaton");
 
 struct xbt_automaton_propositional_symbol{
   char* pred;
@@ -21,8 +23,7 @@ struct xbt_automaton_propositional_symbol{
 };
 
 xbt_automaton_t xbt_automaton_new(void){
-  xbt_automaton_t automaton = NULL;
-  automaton = xbt_new0(struct xbt_automaton, 1);
+  xbt_automaton_t automaton = xbt_new0(struct xbt_automaton, 1);
   automaton->states = xbt_dynar_new(sizeof(xbt_automaton_state_t), xbt_automaton_state_free_voidp);
   automaton->transitions = xbt_dynar_new(sizeof(xbt_automaton_transition_t), xbt_automaton_transition_free_voidp);
   automaton->propositional_symbols = xbt_dynar_new(sizeof(xbt_automaton_propositional_symbol_t), xbt_automaton_propositional_symbol_free_voidp);
@@ -30,19 +31,17 @@ xbt_automaton_t xbt_automaton_new(void){
 }
 
 xbt_automaton_state_t xbt_automaton_state_new(xbt_automaton_t a, int type, char* id){
-  xbt_automaton_state_t state = NULL;
-  state = xbt_new0(struct xbt_automaton_state, 1);
+  xbt_automaton_state_t state = xbt_new0(struct xbt_automaton_state, 1);
   state->type = type;
   state->id = xbt_strdup(id);
   state->in = xbt_dynar_new(sizeof(xbt_automaton_transition_t), xbt_automaton_transition_free_voidp);
-  state->out = xbt_dynar_new(sizeof(xbt_automaton_transition_t), xbt_automaton_transition_free_voidp); 
+  state->out = xbt_dynar_new(sizeof(xbt_automaton_transition_t), xbt_automaton_transition_free_voidp);
   xbt_dynar_push(a->states, &state);
   return state;
 }
 
 xbt_automaton_transition_t xbt_automaton_transition_new(xbt_automaton_t a, xbt_automaton_state_t src, xbt_automaton_state_t dst, xbt_automaton_exp_label_t label){
-  xbt_automaton_transition_t transition = NULL;
-  transition = xbt_new0(struct xbt_automaton_transition, 1);
+  xbt_automaton_transition_t transition = xbt_new0(struct xbt_automaton_transition, 1);
   if(src != NULL){
     xbt_dynar_push(src->out, &transition);
     transition->src = src;
@@ -57,8 +56,7 @@ xbt_automaton_transition_t xbt_automaton_transition_new(xbt_automaton_t a, xbt_a
 }
 
 xbt_automaton_exp_label_t xbt_automaton_exp_label_new(int type, ...){
-  xbt_automaton_exp_label_t label = NULL;
-  label = xbt_new0(struct xbt_automaton_exp_label, 1);
+  xbt_automaton_exp_label_t label = xbt_new0(struct xbt_automaton_exp_label, 1);
   label->type = type;
   xbt_automaton_exp_label_t left;
   xbt_automaton_exp_label_t right;
@@ -87,6 +85,13 @@ xbt_automaton_exp_label_t xbt_automaton_exp_label_new(int type, ...){
     p = va_arg(ap, char*);
     label->u.predicat = xbt_strdup(p);
     break;
+  case 4:
+    break;
+  default:
+    XBT_DEBUG("Invalid type: %d", type);
+    xbt_free(label);
+    label = NULL;
+    break;
   }
   va_end(ap);
   return label;
@@ -100,7 +105,9 @@ xbt_dynar_t xbt_automaton_get_transitions(xbt_automaton_t a){
   return a->transitions;
 }
 
-xbt_automaton_transition_t xbt_automaton_get_transition(xbt_automaton_t a, xbt_automaton_state_t src, xbt_automaton_state_t dst){
+xbt_automaton_transition_t xbt_automaton_get_transition(XBT_ATTRIB_UNUSED xbt_automaton_t a, xbt_automaton_state_t src,
+                                                        xbt_automaton_state_t dst)
+{
   xbt_automaton_transition_t transition;
   unsigned int cursor;
   xbt_dynar_foreach(src->out, cursor, transition){
@@ -168,33 +175,32 @@ void xbt_automaton_display(xbt_automaton_t a){
 }
 
 void xbt_automaton_exp_label_display(xbt_automaton_exp_label_t label){
+  printf("(");
   switch(label->type){
-  case 0 :
-    printf("(");
-    xbt_automaton_exp_label_display(label->u.or_and.left_exp);
-    printf(" || ");
-    xbt_automaton_exp_label_display(label->u.or_and.right_exp);
-    printf(")");
-    break;
-  case 1 : 
-    printf("(");
-    xbt_automaton_exp_label_display(label->u.or_and.left_exp);
-    printf(" && ");
-    xbt_automaton_exp_label_display(label->u.or_and.right_exp);
-    printf(")");
-    break;
-  case 2 : 
-    printf("(!");
-    xbt_automaton_exp_label_display(label->u.exp_not);
-    printf(")");
-    break;
-  case 3 :
-    printf("(%s)",label->u.predicat);
-    break;
-  case 4 :
-    printf("(1)");
-    break;
+    case 0:
+      xbt_automaton_exp_label_display(label->u.or_and.left_exp);
+      printf(" || ");
+      xbt_automaton_exp_label_display(label->u.or_and.right_exp);
+      break;
+    case 1:
+      xbt_automaton_exp_label_display(label->u.or_and.left_exp);
+      printf(" && ");
+      xbt_automaton_exp_label_display(label->u.or_and.right_exp);
+      break;
+    case 2:
+      printf("!");
+      xbt_automaton_exp_label_display(label->u.exp_not);
+      break;
+    case 3:
+      printf("%s", label->u.predicat);
+      break;
+    case 4:
+      printf("1");
+      break;
+    default:
+      break;
   }
+  printf(")");
 }
 
 xbt_automaton_state_t xbt_automaton_get_current_state(xbt_automaton_t a){
@@ -207,8 +213,7 @@ static int call_simple_function(void* function)
 }
 
 xbt_automaton_propositional_symbol_t xbt_automaton_propositional_symbol_new(xbt_automaton_t a, const char* id, int(*fct)(void)){
-  xbt_automaton_propositional_symbol_t prop_symb = NULL;
-  prop_symb = xbt_new0(struct xbt_automaton_propositional_symbol, 1);
+  xbt_automaton_propositional_symbol_t prop_symb = xbt_new0(struct xbt_automaton_propositional_symbol, 1);
   prop_symb->pred = xbt_strdup(id);
   prop_symb->callback                            = &call_simple_function;
   prop_symb->data = fct;
@@ -219,8 +224,7 @@ xbt_automaton_propositional_symbol_t xbt_automaton_propositional_symbol_new(xbt_
 
 XBT_PUBLIC(xbt_automaton_propositional_symbol_t) xbt_automaton_propositional_symbol_new_pointer(xbt_automaton_t a, const char* id, int* value)
 {
-  xbt_automaton_propositional_symbol_t prop_symb = NULL;
-  prop_symb = xbt_new0(struct xbt_automaton_propositional_symbol, 1);
+  xbt_automaton_propositional_symbol_t prop_symb = xbt_new0(struct xbt_automaton_propositional_symbol, 1);
   prop_symb->pred = xbt_strdup(id);
   prop_symb->callback = NULL;
   prop_symb->data = value;
@@ -234,8 +238,7 @@ XBT_PUBLIC(xbt_automaton_propositional_symbol_t) xbt_automaton_propositional_sym
   xbt_automaton_propositional_symbol_callback_type callback,
   void* data, xbt_automaton_propositional_symbol_free_function_type free_function)
 {
-  xbt_automaton_propositional_symbol_t prop_symb = NULL;
-  prop_symb = xbt_new0(struct xbt_automaton_propositional_symbol, 1);
+  xbt_automaton_propositional_symbol_t prop_symb = xbt_new0(struct xbt_automaton_propositional_symbol, 1);
   prop_symb->pred = xbt_strdup(id);
   prop_symb->callback = callback;
   prop_symb->data = data;
@@ -285,7 +288,7 @@ int xbt_automaton_transition_compare(const void *t1, const void *t2){
 
   if(xbt_automaton_state_compare(((xbt_automaton_transition_t)t1)->src, ((xbt_automaton_transition_t)t2)->src))
     return 1;
-  
+
   if(xbt_automaton_state_compare(((xbt_automaton_transition_t)t1)->dst, ((xbt_automaton_transition_t)t2)->dst))
     return 1;
 
@@ -293,7 +296,7 @@ int xbt_automaton_transition_compare(const void *t1, const void *t2){
     return 1;
 
   return 0;
-  
+
 }
 
 int xbt_automaton_exp_label_compare(xbt_automaton_exp_label_t l1, xbt_automaton_exp_label_t l2){
@@ -302,7 +305,7 @@ int xbt_automaton_exp_label_compare(xbt_automaton_exp_label_t l1, xbt_automaton_
     return 1;
 
   switch(l1->type){
-  case 0 : // OR 
+  case 0 : // OR
   case 1 : // AND
     if(xbt_automaton_exp_label_compare(l1->u.or_and.left_exp, l2->u.or_and.left_exp))
       return 1;
@@ -325,16 +328,14 @@ int xbt_automaton_exp_label_compare(xbt_automaton_exp_label_t l1, xbt_automaton_
 }
 
 int xbt_automaton_propositional_symbols_compare_value(xbt_dynar_t s1, xbt_dynar_t s2){
-  int *iptr1, *iptr2;
-  unsigned int cursor;
   unsigned int nb_elem = xbt_dynar_length(s1);
 
-  for(cursor=0;cursor<nb_elem;cursor++){
-    iptr1 = xbt_dynar_get_ptr(s1, cursor);
-    iptr2 = xbt_dynar_get_ptr(s2, cursor);
+  for (unsigned int cursor = 0; cursor < nb_elem; cursor++) {
+    int* iptr1 = xbt_dynar_get_ptr(s1, cursor);
+    int* iptr2 = xbt_dynar_get_ptr(s2, cursor);
     if(*iptr1 != *iptr2)
       return 1;
-  } 
+  }
 
   return 0;
 }
@@ -406,7 +407,6 @@ void xbt_automaton_propositional_symbol_free_voidp(void *ps){
   xbt_automaton_propositional_symbol_t symbol = (xbt_automaton_propositional_symbol_t) * (void **) ps;
   if (symbol->free_function)
     symbol->free_function(symbol->data);
-  xbt_free(symbol->pred);
   xbt_automaton_propositional_symbol_free(symbol);
 }