tmgr_trace_t tmgr_trace_new_from_string(const char *id, const char *input, double periodicity) { tmgr_trace_t trace = NULL; int linecount = 0; s_tmgr_event_t event; tmgr_event_t last_event = NULL; xbt_dynar_t list; unsigned int cpt; char *val; if (trace_list) { trace = xbt_dict_get_or_null(trace_list, id); if (trace) { XBT_WARN("Ignoring redefinition of trace %s", id); return trace; } } xbt_assert(periodicity >= 0, "Invalid periodicity %lg (must be positive)", periodicity); trace = xbt_new0(s_tmgr_trace_t, 1); trace->type = e_trace_list; trace->s_list.event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL); list = xbt_str_split(input, "\n\r"); xbt_dynar_foreach(list, cpt, val) { linecount++; xbt_str_trim(val, " \t\n\r\x0B"); if (val[0] == '#' || val[0] == '\0' || val[0] == '%') continue; if (sscanf(val, "PERIODICITY " "%lg" "\n", &periodicity) == 1) continue; if (sscanf(val, "%lg" " " "%lg" "\n", &event.delta, &event.value) != 2) xbt_die("%s:%d: Syntax error in trace\n%s", id, linecount, input); if (last_event) { if (last_event->delta > event.delta) { xbt_die("%s:%d: Invalid trace: Events must be sorted, " "but time %lg > time %lg.\n%s", id, linecount, last_event->delta, event.delta, input); } last_event->delta = event.delta - last_event->delta; } xbt_dynar_push(trace->s_list.event_list, &event); last_event = xbt_dynar_get_ptr(trace->s_list.event_list, xbt_dynar_length(trace->s_list.event_list) - 1); }
tmgr_trace_t tmgr_trace_new_from_string(const char *name, const char *input, double periodicity) { int linecount = 0; tmgr_event_t last_event = nullptr; unsigned int cpt; char *val; xbt_assert(trace_list.find(name) == trace_list.end(), "Refusing to define trace %s twice", name); xbt_assert(periodicity >= 0, "Invalid periodicity %g (must be positive)", periodicity); tmgr_trace_t trace = new simgrid::trace_mgr::trace(); xbt_dynar_t list = xbt_str_split(input, "\n\r"); xbt_dynar_foreach(list, cpt, val) { s_tmgr_event_t event; linecount++; xbt_str_trim(val, " \t\n\r\x0B"); if (val[0] == '#' || val[0] == '\0' || val[0] == '%') // pass comments continue; if (sscanf(val, "PERIODICITY " "%lg" "\n", &periodicity) == 1) continue; xbt_assert(sscanf(val, "%lg" " " "%lg" "\n", &event.delta, &event.value) == 2, "%s:%d: Syntax error in trace\n%s", name, linecount, input); if (last_event) { xbt_assert(last_event->delta <= event.delta, "%s:%d: Invalid trace: Events must be sorted, but time %g > time %g.\n%s", name, linecount, last_event->delta, event.delta, input); last_event->delta = event.delta - last_event->delta; } else { if(event.delta > 0.0){ s_tmgr_event_t first_event; first_event.delta=event.delta; first_event.value=-1.0; xbt_dynar_push(trace->event_list, &first_event); } } xbt_dynar_push(trace->event_list, &event); last_event = (tmgr_event_t)xbt_dynar_get_ptr(trace->event_list, xbt_dynar_length(trace->event_list) - 1); }
XBT_INLINE void xbt_strbuff_trim(xbt_strbuff_t b) { xbt_str_trim(b->data, " "); b->used = strlen(b->data); }