From: Robin Jarry Date: Thu, 31 Oct 2024 22:16:56 +0000 (+0100) Subject: libsmartcols: add printf api to fill in column data X-Git-Tag: v2.42-start~161^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f0d0817c37931b504a7f6d4eb7ca94e2fb10a99a;p=thirdparty%2Futil-linux.git libsmartcols: add printf api to fill in column data Add new API functions using printf(3) compatible format strings to fill in column data. These can be used to avoid intermediate buffers in the calling application code. Signed-off-by: Robin Jarry --- diff --git a/libsmartcols/docs/libsmartcols-sections.txt b/libsmartcols/docs/libsmartcols-sections.txt index 5b343d01e..5f4c736a7 100644 --- a/libsmartcols/docs/libsmartcols-sections.txt +++ b/libsmartcols/docs/libsmartcols-sections.txt @@ -120,6 +120,10 @@ scols_line_set_color scols_line_set_column_data scols_line_set_data scols_line_set_userdata +scols_line_sprintf +scols_line_sprintf_column +scols_line_vprintf +scols_line_vprintf_column scols_new_line scols_ref_line scols_unref_line diff --git a/libsmartcols/src/libsmartcols.h.in b/libsmartcols/src/libsmartcols.h.in index c97651f35..3947673ba 100644 --- a/libsmartcols/src/libsmartcols.h.in +++ b/libsmartcols/src/libsmartcols.h.in @@ -14,6 +14,7 @@ extern "C" { #endif +#include #include #include #include @@ -291,10 +292,18 @@ extern struct libscols_cell *scols_line_get_column_cell( struct libscols_column *cl); extern int scols_line_set_data(struct libscols_line *ln, size_t n, const char *data); extern int scols_line_refer_data(struct libscols_line *ln, size_t n, char *data); +extern int scols_line_vprintf(struct libscols_line *ln, size_t n, const char *fmt, va_list ap) + __attribute__((format(printf, 3, 0))); +extern int scols_line_sprintf(struct libscols_line *ln, size_t n, const char *fmt, ...) + __attribute__((format(printf, 3, 4))); extern int scols_line_is_filled(struct libscols_line *ln, size_t n); extern int scols_line_set_column_data(struct libscols_line *ln, struct libscols_column *cl, const char *data); extern const char *scols_line_get_column_data(struct libscols_line *ln, struct libscols_column *cl); extern int scols_line_refer_column_data(struct libscols_line *ln, struct libscols_column *cl, char *data); +extern int scols_line_vprintf_column(struct libscols_line *ln, struct libscols_column *cl, const char *fmt, va_list ap) + __attribute__((format(printf, 3, 0))); +extern int scols_line_sprintf_column(struct libscols_line *ln, struct libscols_column *cl, const char *fmt, ...) + __attribute__((format(printf, 3, 4))); extern struct libscols_line *scols_copy_line(const struct libscols_line *ln); /* table */ diff --git a/libsmartcols/src/libsmartcols.sym b/libsmartcols/src/libsmartcols.sym index 41c74552e..e74d92862 100644 --- a/libsmartcols/src/libsmartcols.sym +++ b/libsmartcols/src/libsmartcols.sym @@ -244,3 +244,10 @@ SMARTCOLS_2.40 { scols_column_set_data_type; scols_column_get_data_type; } SMARTCOLS_2.39; + +SMARTCOLS_2.41 { + scols_line_vprintf; + scols_line_sprintf; + scols_line_vprintf_column; + scols_line_sprintf_column; +} SMARTCOLS_2.40; diff --git a/libsmartcols/src/line.c b/libsmartcols/src/line.c index 2289db0f9..ffefcfba0 100644 --- a/libsmartcols/src/line.c +++ b/libsmartcols/src/line.c @@ -504,6 +504,61 @@ int scols_line_refer_data(struct libscols_line *ln, size_t n, char *data) return scols_cell_refer_data(ce, data); } +/** + * scols_line_vprintf: + * @ln: a pointer to a struct libscols_line instance + * @n: number of the cell which will refer to @data + * @fmt: a printf(3) compatible format string used to generate cell data + * @ap: a variable argument list that was initialized with va_start(3) + * + * Returns: 0, a negative value in case of an error. + * + * Since: 2.41 + */ +int scols_line_vprintf(struct libscols_line *ln, size_t n, + const char *fmt, va_list ap) +{ + struct libscols_cell *ce = scols_line_get_cell(ln, n); + char *data = NULL; + int ret; + + if (!ce) + return -EINVAL; + + if (vasprintf(&data, fmt, ap) < 0) + return errno ? -errno : -ENOMEM; + + ret = scols_cell_refer_data(ce, data); + if (ret < 0) + free(data); + + return ret; +} + +/** + * scols_line_sprintf: + * @ln: a pointer to a struct libscols_line instance + * @n: number of the cell which will refer to @data + * @fmt: an printf(3) compatible format string used to generate cell data + * @...: variable argument list + * + * Returns: 0, a negative value in case of an error. + * + * Since: 2.41 + */ +int scols_line_sprintf(struct libscols_line *ln, size_t n, + const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = scols_line_vprintf(ln, n, fmt, ap); + va_end(ap); + + return ret; +} + /** * scols_line_is_filled: * @ln: a pointer to a struct libscols_line instance @@ -537,6 +592,55 @@ int scols_line_refer_column_data(struct libscols_line *ln, return scols_line_refer_data(ln, cl->seqnum, data); } +/** + * scols_line_vprintf_column: + * @ln: a pointer to a struct libscols_line instance + * @cl: column, whose data is to be set + * @fmt: a printf(3) compatible format string used to generate column data + * @ap: a variable argument list that was initialized with va_start(3) + * + * The same as scols_line_vprintf() but cell is referenced by column object. + * + * Returns: 0, a negative value in case of an error. + * + * Since: 2.41 + */ +int scols_line_vprintf_column(struct libscols_line *ln, + struct libscols_column *cl, + const char *fmt, + va_list ap) +{ + return scols_line_vprintf(ln, cl->seqnum, fmt, ap); +} + + +/** + * scols_line_sprintf_column: + * @ln: a pointer to a struct libscols_line instance + * @cl: column, whose data is to be set + * @fmt: a printf(3) compatible format string used to generate column data + * @...: variable argument list + * + * The same as scols_line_sprintf() but cell is referenced by column object. + * + * Returns: 0, a negative value in case of an error. + * + * Since: 2.41 + */ +int scols_line_sprintf_column(struct libscols_line *ln, + struct libscols_column *cl, + const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = scols_line_vprintf(ln, cl->seqnum, fmt, ap); + va_end(ap); + + return ret; +} + /** * scols_copy_line: * @ln: a pointer to a struct libscols_line instance