summaryrefslogtreecommitdiffstats
path: root/nserver/src/stats.c
diff options
context:
space:
mode:
authorrsiddharth <s@ricketyspace.net>2020-04-11 02:22:12 -0400
committerrsiddharth <s@ricketyspace.net>2020-04-17 20:56:37 -0400
commit89919c902061006471760cbddd2fe275ff57c8d8 (patch)
tree1eed43518800f434c7585f088ec4e5f77ef36d2e /nserver/src/stats.c
parent10cc7513914fddbf654e27c795c775a939bc636a (diff)
nserver: Add Stats_unstringify.
* nserver/src/stats.c (Stats_unstringify): New function definition. * nserver/src/stats.h (Stats_unstringify): New function declaration. * nserver/tests/stats_tests.c (tests_stats_unstringify): Test for Stats_unstringify. (tests_stats_unstringify): st_str is now a static variable. Don't free it; it's done in tests_stats_unstringify. (st_str): New static variable.
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;
+}