static void acc_mean_emit(void* pvstate, char* value_field_name, char* acc_name, lrec_t* poutrec) { acc_mean_state_t* pstate = pvstate; double quot = pstate->sum / pstate->count; char* key = mlr_paste_3_strings(value_field_name, "_", acc_name); char* val = mlr_alloc_string_from_double(quot, MLR_GLOBALS.ofmt); lrec_put(poutrec, key, val, LREC_FREE_ENTRY_KEY|LREC_FREE_ENTRY_VALUE); }
static void acc_percentile_emit(void* pvstate, char* value_field_name, char* acc_name, lrec_t* poutrec) { acc_percentile_state_t* pstate = pvstate; char* key = mlr_paste_3_strings(value_field_name, "_", acc_name); double p; (void)sscanf(acc_name, "p%lf", &p); // Assuming this was range-checked earlier on to be in [0,100]. double v = percentile_keeper_emit(pstate->ppercentile_keeper, p); char* s = mlr_alloc_string_from_double(v, MLR_GLOBALS.ofmt); lrec_put(poutrec, key, s, LREC_FREE_ENTRY_KEY|LREC_FREE_ENTRY_VALUE); }
static void acc_max_emit(void* pvstate, char* value_field_name, char* acc_name, lrec_t* poutrec) { acc_max_state_t* pstate = pvstate; char* key = mlr_paste_3_strings(value_field_name, "_", acc_name); if (pstate->have_max) { char* val = mlr_alloc_string_from_double(pstate->max, MLR_GLOBALS.ofmt); lrec_put(poutrec, key, val, LREC_FREE_ENTRY_KEY|LREC_FREE_ENTRY_VALUE); } else { lrec_put(poutrec, key, "", LREC_FREE_ENTRY_KEY); } }
static void step_delta_dprocess(void* pvstate, double dblv, lrec_t* prec) { step_delta_state_t* pstate = pvstate; double delta = dblv; if (pstate->have_prev) { delta = dblv - pstate->prev; } else { pstate->have_prev = TRUE; } lrec_put(prec, pstate->output_field_name, mlr_alloc_string_from_double(delta, MLR_GLOBALS.ofmt), LREC_FREE_ENTRY_VALUE); pstate->prev = dblv; }
// xxx recast all of these in terms of providable outputs static void acc_stddev_var_meaneb_emit(void* pvstate, char* value_field_name, char* acc_name, lrec_t* poutrec) { acc_stddev_var_meaneb_state_t* pstate = pvstate; char* key = mlr_paste_3_strings(value_field_name, "_", acc_name); if (pstate->count < 2LL) { lrec_put(poutrec, key, "", LREC_FREE_ENTRY_KEY); } else { double output = mlr_get_var(pstate->count, pstate->sumx, pstate->sumx2); if (pstate->do_which == DO_STDDEV) output = sqrt(output); else if (pstate->do_which == DO_MEANEB) output = sqrt(output / pstate->count); char* val = mlr_alloc_string_from_double(output, MLR_GLOBALS.ofmt); lrec_put(poutrec, key, val, LREC_FREE_ENTRY_KEY|LREC_FREE_ENTRY_VALUE); } }
static void stats1_kurtosis_emit(void* pvstate, char* value_field_name, char* stats1_acc_name, int copy_data, lrec_t* poutrec) { stats1_kurtosis_state_t* pstate = pvstate; if (pstate->count < 2LL) { if (copy_data) lrec_put(poutrec, mlr_strdup_or_die(pstate->output_field_name), "", FREE_ENTRY_KEY); else lrec_put(poutrec, pstate->output_field_name, "", NO_FREE); } else { double output = mlr_get_kurtosis(pstate->count, pstate->sumx, pstate->sumx2, pstate->sumx3, pstate->sumx4); char* val = mlr_alloc_string_from_double(output, MLR_GLOBALS.ofmt); if (copy_data) lrec_put(poutrec, mlr_strdup_or_die(pstate->output_field_name), val, FREE_ENTRY_KEY|FREE_ENTRY_VALUE); else lrec_put(poutrec, pstate->output_field_name, val, FREE_ENTRY_VALUE); } }
static void stats1_mean_emit(void* pvstate, char* value_field_name, char* stats1_acc_name, int copy_data, lrec_t* poutrec) { stats1_mean_state_t* pstate = pvstate; if (pstate->count == 0LL) { if (copy_data) lrec_put(poutrec, mlr_strdup_or_die(pstate->output_field_name), "", FREE_ENTRY_KEY); else lrec_put(poutrec, pstate->output_field_name, "", NO_FREE); } else { double quot = pstate->sum / pstate->count; char* val = mlr_alloc_string_from_double(quot, MLR_GLOBALS.ofmt); if (copy_data) lrec_put(poutrec, mlr_strdup_or_die(pstate->output_field_name), val, FREE_ENTRY_KEY|FREE_ENTRY_VALUE); else lrec_put(poutrec, pstate->output_field_name, val, FREE_ENTRY_VALUE); } }
static void stats1_stddev_var_meaneb_emit(void* pvstate, char* value_field_name, char* stats1_acc_name, int copy_data, lrec_t* poutrec) { stats1_stddev_var_meaneb_state_t* pstate = pvstate; if (pstate->count < 2LL) { if (copy_data) lrec_put(poutrec, mlr_strdup_or_die(pstate->output_field_name), "", FREE_ENTRY_KEY); else lrec_put(poutrec, pstate->output_field_name, "", NO_FREE); } else { double output = mlr_get_var(pstate->count, pstate->sumx, pstate->sumx2); if (pstate->do_which == DO_STDDEV) output = sqrt(output); else if (pstate->do_which == DO_MEANEB) output = sqrt(output / pstate->count); char* val = mlr_alloc_string_from_double(output, MLR_GLOBALS.ofmt); if (copy_data) lrec_put(poutrec, mlr_strdup_or_die(pstate->output_field_name), val, FREE_ENTRY_KEY|FREE_ENTRY_VALUE); else lrec_put(poutrec, pstate->output_field_name, val, FREE_ENTRY_VALUE); } }
static void step_rsum_dprocess(void* pvstate, double dblv, lrec_t* prec) { step_rsum_state_t* pstate = pvstate; pstate->rsum += dblv; lrec_put(prec, pstate->output_field_name, mlr_alloc_string_from_double(pstate->rsum, MLR_GLOBALS.ofmt), LREC_FREE_ENTRY_VALUE); }
// ---------------------------------------------------------------- static char * test_scanners() { mu_assert("error: mlr_alloc_string_from_double", streq(mlr_alloc_string_from_double(4.25, "%.4f"), "4.2500")); mu_assert("error: mlr_alloc_string_from_ull", streq(mlr_alloc_string_from_ull(12345LL), "12345")); mu_assert("error: mlr_alloc_string_from_int", streq(mlr_alloc_string_from_int(12345), "12345")); return 0; }