X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9b73466ada27682d1729f394549479da83ef4a99..12900371925594a27b91457d6db67020eb4df4e5:/src/xbt/automaton/automaton.c diff --git a/src/xbt/automaton/automaton.c b/src/xbt/automaton/automaton.c index e3abf53971..a961720fde 100644 --- a/src/xbt/automaton/automaton.c +++ b/src/xbt/automaton/automaton.c @@ -1,6 +1,6 @@ /* automaton - representation of büchi automaton */ -/* Copyright (c) 2011-2013. The SimGrid Team. +/* Copyright (c) 2011-2014. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -9,6 +9,17 @@ #include "xbt/automaton.h" #include /* printf */ +struct xbt_automaton_propositional_symbol{ + char* pred; + /** Callback used to evaluate the value of the symbol */ + int (*callback)(void*); + /** Additional data for the callback. + Alternatively it can be used as a pointer to the data. */ + void* data; + //** Optional callback used to free the data field */ + void (*free_function)(void*); +}; + xbt_automaton_t xbt_automaton_new(){ xbt_automaton_t automaton = NULL; automaton = xbt_new0(struct xbt_automaton, 1); @@ -197,15 +208,72 @@ xbt_automaton_state_t xbt_automaton_get_current_state(xbt_automaton_t a){ return a->current_state; } -xbt_automaton_propositional_symbol_t xbt_automaton_propositional_symbol_new(xbt_automaton_t a, const char* id, void* fct){ +static int call_simple_function(void* function) +{ + return ((int (*)(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); prop_symb->pred = strdup(id); - prop_symb->function = fct; + prop_symb->callback = call_simple_function; + prop_symb->data = fct; + prop_symb->free_function = NULL; xbt_dynar_push(a->propositional_symbols, &prop_symb); return prop_symb; } +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); + prop_symb->pred = strdup(id); + prop_symb->callback = NULL; + prop_symb->data = value; + prop_symb->free_function = NULL; + xbt_dynar_push(a->propositional_symbols, &prop_symb); + return prop_symb; +} + +XBT_PUBLIC(xbt_automaton_propositional_symbol_t) xbt_automaton_propositional_symbol_new_callback( + xbt_automaton_t a, const char* id, + 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); + prop_symb->pred = strdup(id); + prop_symb->callback = callback; + prop_symb->data = data; + prop_symb->free_function = free_function; + xbt_dynar_push(a->propositional_symbols, &prop_symb); + return prop_symb; +} + +XBT_PUBLIC(int) xbt_automaton_propositional_symbol_evaluate(xbt_automaton_propositional_symbol_t symbol) +{ + if (symbol->callback) + return (symbol->callback)(symbol->data); + else + return *(int*) symbol->data; +} + +XBT_PUBLIC(xbt_automaton_propositional_symbol_callback_type) xbt_automaton_propositional_symbol_get_callback(xbt_automaton_propositional_symbol_t symbol) +{ + return symbol->callback; +} + +XBT_PUBLIC(void*) xbt_automaton_propositional_symbol_get_data(xbt_automaton_propositional_symbol_t symbol) +{ + return symbol->data; +} + +XBT_PUBLIC(const char*) xbt_automaton_propositional_symbol_get_name(xbt_automaton_propositional_symbol_t symbol) +{ + return symbol->pred; +} + int xbt_automaton_state_compare(xbt_automaton_state_t s1, xbt_automaton_state_t s2){ /* single id for each state, id and type sufficient for comparison*/ @@ -354,7 +422,11 @@ static void xbt_automaton_propositional_symbol_free(xbt_automaton_propositional_ } void xbt_automaton_propositional_symbol_free_voidp(void *ps){ - xbt_automaton_propositional_symbol_free((xbt_automaton_propositional_symbol_t) * (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); } void xbt_automaton_free(xbt_automaton_t a){