diff options
Diffstat (limited to 'nserver/src')
-rw-r--r-- | nserver/src/stats.c | 37 | ||||
-rw-r--r-- | nserver/src/stats.h | 6 |
2 files changed, 41 insertions, 2 deletions
diff --git a/nserver/src/stats.c b/nserver/src/stats.c index c2d3c34..9610301 100644 --- a/nserver/src/stats.c +++ b/nserver/src/stats.c @@ -1,7 +1,5 @@ #include <math.h> #include <stats.h> -#include <stdlib.h> -#include <dbg.h> Stats *Stats_recreate(double sum, double sumsq, unsigned long n, double min, double max) @@ -87,3 +85,38 @@ char *Stats_stringify(Stats *st) } return NULL; } + + +Stats *Stats_unstringify(char *st_str) +{ + Stats *st = NULL; + + check(st_str != NULL, "st_str invalid"); + + bstring st_bstr = bfromcstr(st_str); + check(st_bstr != NULL, "st_str bstring convert failed"); + + struct bstrList *st_list = bsplit(st_bstr, ':'); + check(st_list != NULL, "st_bstr split failed"); + check(st_list->qty == 5, "wrong number of st parts"); + + st = Stats_create(); + check(st != NULL, "stats creation failed"); + + st->sum = atof(bdata(st_list->entry[0])); + st->sumsq = atof(bdata(st_list->entry[1])); + st->n = atoi(bdata(st_list->entry[2])); + st->min = atof(bdata(st_list->entry[3])); + st->max = atof(bdata(st_list->entry[4])); + + // clean up. + int rc = bstrListDestroy(st_list); + check(rc == BSTR_OK, "st_list destroy failed"); + + return st; + error: + if (st) { + free(st); + } + return NULL; +} diff --git a/nserver/src/stats.h b/nserver/src/stats.h index 8fc971e..96bc2b4 100644 --- a/nserver/src/stats.h +++ b/nserver/src/stats.h @@ -1,6 +1,10 @@ #ifndef stats_h #define stats_h + #include <math.h> +#include <stdlib.h> +#include <bstrlib.h> +#include <dbg.h> typedef struct Stats { double sum; @@ -21,6 +25,8 @@ char *Stats_dump(Stats *st); char *Stats_stringify(Stats *st); +Stats *Stats_unstringify(char *st_str); + static inline double Stats_mean(Stats *st) { return st->sum / st->n; |