summaryrefslogtreecommitdiffstats
path: root/nserver/src/stats.c
diff options
context:
space:
mode:
Diffstat (limited to 'nserver/src/stats.c')
-rw-r--r--nserver/src/stats.c37
1 files changed, 35 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;
+}