From 42bf1afa5a06926839fb4ccf0bab27aa1a956bae Mon Sep 17 00:00:00 2001 From: Eric Kinzie Date: Fri, 2 Sep 2022 16:33:21 +0200 Subject: [PATCH] lib: convert termtable to json Add a function that returns a JSON-C structure containing a representation of a termtable. This is intended to be a quick way to implement JSON output to CLI commands. Signed-off-by: Eric Kinzie --- lib/termtable.c | 43 +++++++++++++++++++++++++++++++++++++++++++ lib/termtable.h | 12 ++++++++++++ 2 files changed, 55 insertions(+) diff --git a/lib/termtable.c b/lib/termtable.c index 30f1ab74c6..9b36d5ebfa 100644 --- a/lib/termtable.c +++ b/lib/termtable.c @@ -7,6 +7,7 @@ #include #include +#include "lib/json.h" #include "printfrr.h" #include "memory.h" #include "termtable.h" @@ -485,3 +486,45 @@ char *ttable_dump(struct ttable *tt, const char *newline) return buf; } + +/* Crude conversion from ttable to json array. + * Assume that the first row has column headings. + * + * Formats are: + * d int32 + * f double + * l int64 + * s string (default) + */ +json_object *ttable_json(struct ttable *tt, const char *const formats) +{ + struct ttable_cell *row; /* iteration pointers */ + json_object *json = NULL; + + json = json_object_new_array(); + + for (int i = 1; i < tt->nrows; i++) { + json_object *jobj; + json_object *val; + + row = tt->table[i]; + jobj = json_object_new_object(); + json_object_array_add(json, jobj); + for (int j = 0; j < tt->ncols; j++) { + switch (formats[j]) { + case 'd': + case 'l': + val = json_object_new_int64(atol(row[j].text)); + break; + case 'f': + val = json_object_new_double(atof(row[j].text)); + break; + default: + val = json_object_new_string(row[j].text); + } + json_object_object_add(jobj, tt->table[0][j].text, val); + } + } + + return json; +} diff --git a/lib/termtable.h b/lib/termtable.h index 3aa8caee89..7258682bd8 100644 --- a/lib/termtable.h +++ b/lib/termtable.h @@ -8,6 +8,7 @@ #define _TERMTABLE_H_ #include +#include "lib/json.h" #ifdef __cplusplus extern "C" { @@ -277,6 +278,17 @@ void ttable_rowseps(struct ttable *tt, unsigned int row, */ char *ttable_dump(struct ttable *tt, const char *newline); +/** + * Convert a table to a JSON array of objects. + * + * Caller must free the returned json_object structure. + * + * @param tt the table to convert + * @param formats an array of characters indicating what JSON type should be + * used. + */ +json_object *ttable_json(struct ttable *tt, const char *const formats); + #ifdef __cplusplus } #endif