On 2016-04-17 at 19:31:30 +0200, Vadim Kochan <[email protected]> wrote:
> Add new module ui.c which is responsible to render
> different kinds of UI widgets - tables, etc.
> 
> Implemented generic API for print table-like list of elements.
> This table API might be used for print flows in curses or text mode.
> 
> Signed-off-by: Vadim Kochan <[email protected]>

Looks good in general, a few minor nits below.

> ---
>  ui.c | 142 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  ui.h |  53 +++++++++++++++++++++++++

How about calling the module ui_table, which is a bit more specific?
Also all function names already start with "ui_table_".

>  2 files changed, 195 insertions(+)
>  create mode 100644 ui.c
>  create mode 100644 ui.h
> 
> diff --git a/ui.c b/ui.c
> new file mode 100644
> index 0000000..d5fe1a7
> --- /dev/null
> +++ b/ui.c
> @@ -0,0 +1,142 @@
> +/*
> + * netsniff-ng - the packet sniffing beast
> + * Subject to the GPL, version 2.
> + */
> +
> +#include "ui.h"
> +#include "xmalloc.h"
> +
> +#include <curses.h>

Global headers should come first, i.e.

#include <curses.h>

#include "ui.h"
#include "xmalloc.h"

> +void ui_table_init(struct ui_table *tbl)
> +{
> +     memset(tbl, 0, sizeof(*tbl));
> +
> +     getsyx(tbl->y, tbl->x);
> +
> +     tbl->rows_y  = tbl->y;
> +     tbl->width   = COLS;
> +     tbl->col_pad = 1;
> +
> +     INIT_LIST_HEAD(&tbl->cols);
> +}
> +
> +void ui_table_uninit(struct ui_table *tbl)
> +{
> +     struct ui_col *col, *tmp;
> +
> +     list_for_each_entry_safe(col, tmp, &tbl->cols, entry)
> +             xfree(col);
> +}
> +
> +void ui_table_pos_set(struct ui_table *tbl, int y, int x)
> +{
> +     tbl->y      = y;
> +     tbl->x      = x;
> +     tbl->rows_y = y;
> +}
> +
> +static struct ui_col *ui_table_col_get(struct ui_table *tbl, uint32_t id)
> +{
> +     struct ui_col *col;
> +
> +     list_for_each_entry(col, &tbl->cols, entry) {
> +             if (col->id == id)
> +                     return col;
> +     }
> +
> +     /* Should not happen in normal case */
> +     panic("Invalid column id %u\n", id);

I'd rather omit the panic() here, return NULL and gracefully handle (if
possible) NULL returns in the callers.

> +}
> +
> +static void __ui_table_pos_update(struct ui_table *tbl)
> +{
> +     struct ui_col *col;
> +     uint32_t pos = tbl->x;
> +
> +     list_for_each_entry(col, &tbl->cols, entry) {
> +             col->pos  = pos;
> +             pos      += col->len + tbl->col_pad;
> +     }
> +}
> +
> +void ui_table_col_add(struct ui_table *tbl, uint32_t id, char *name, 
> uint32_t len)
> +{
> +     struct ui_col *col = xzmalloc(sizeof(*col));
> +
> +     col->id    = id;
> +     col->name  = name;
> +     col->len   = len;
> +     col->align = UI_ALIGN_LEFT;
> +
> +     list_add_tail(&col->entry, &tbl->cols);
> +
> +     __ui_table_pos_update(tbl);
> +}
> +
> +void ui_table_col_color_set(struct ui_table *tbl, int col_id, int color)
> +{
> +     struct ui_col *col = ui_table_col_get(tbl, col_id);
> +
> +     col->color = color;
> +}
> +
> +void ui_table_col_align_set(struct ui_table *tbl, int col_id, enum ui_align 
> align)
> +{
> +     struct ui_col *col = ui_table_col_get(tbl, col_id);
> +
> +     col->align = align;
> +}
> +
> +void ui_table_row_add(struct ui_table *tbl)
> +{
> +     tbl->rows_y++;
> +}
> +
> +void ui_table_clear(struct ui_table *tbl)
> +{
> +     tbl->rows_y = tbl->y;
> +}
> +
> +#define UI_ALIGN_COL(col) (((col)->align == UI_ALIGN_LEFT) ? "%-*.*s" : 
> "%*.*s")
> +
> +static void __ui_table_row_print(struct ui_table *tbl, struct ui_col *col,
> +                              const char *str)
> +{
> +     mvprintw(tbl->rows_y, col->pos, UI_ALIGN_COL(col), col->len, col->len, 
> str);
> +     mvprintw(tbl->rows_y, col->pos + col->len, "%*s", tbl->col_pad, " ");
> +}
> +
> +void ui_table_row_print(struct ui_table *tbl, uint32_t col_id, const char 
> *str)
> +{
> +     struct ui_col *col = ui_table_col_get(tbl, col_id);
> +
> +     attron(col->color);
> +     __ui_table_row_print(tbl, col, str);
> +     attroff(col->color);
> +}
> +
> +void ui_table_header_color_set(struct ui_table *tbl, int color)
> +{
> +     tbl->hdr_color = color;
> +}
> +
> +void ui_table_header_print(struct ui_table *tbl)
> +{
> +     struct ui_col *col;
> +     int max_width = tbl->width;
> +     int width = 0;
> +
> +     attron(tbl->hdr_color);
> +
> +     mvprintw(tbl->y, tbl->x, "%-*.*s", max_width - tbl->x, max_width - 
> tbl->x, "");
> +     mvprintw(tbl->y, tbl->x, "");
> +
> +     list_for_each_entry(col, &tbl->cols, entry) {
> +             __ui_table_row_print(tbl, col, col->name);
> +             width += col->len + tbl->col_pad;
> +     }
> +     

Trailing whitespace (tab) here.

> +     mvprintw(tbl->y, width, "%*s", max_width - width, " ");
> +     attroff(tbl->hdr_color);
> +}
> diff --git a/ui.h b/ui.h
> new file mode 100644
> index 0000000..02d1da2
> --- /dev/null
> +++ b/ui.h
> @@ -0,0 +1,53 @@
> +#ifndef UI_H
> +#define UI_H
> +
> +#include "list.h"
> +
> +#include <stdbool.h>
> +#include <inttypes.h>

Global headers should come first.

> +
> +#define UI_MAX_WIDTH (-1)
> +
> +enum ui_align {
> +     UI_ALIGN_LEFT,
> +     UI_ALIGN_RIGHT,
> +};
> +
> +struct ui_col {
> +     struct list_head entry;
> +     uint32_t id;
> +     char *name;
> +     uint32_t len;
> +     int pos;
> +     int color;
> +     enum ui_align align;
> +};
> +
> +struct ui_table {
> +     int y;
> +     int x;
> +     int rows_y;
> +     struct list_head cols;
> +     int hdr_color;
> +     int col_pad;
> +     int width;
> +};
> +
> +extern void ui_table_init(struct ui_table *tbl);
> +extern void ui_table_uninit(struct ui_table *tbl);
> +extern void ui_table_pos_set(struct ui_table *tbl, int y, int x);
> +extern void ui_table_clear(struct ui_table *tbl);
> +
> +extern void ui_table_col_add(struct ui_table *tbl, uint32_t id, char *name,
> +                          uint32_t len);
> +extern void ui_table_col_color_set(struct ui_table *tbl, int col_id, int 
> color);
> +extern void ui_table_col_align_set(struct ui_table *tbl, int col_id, enum 
> ui_align align);
> +
> +extern void ui_table_row_add(struct ui_table *tbl);
> +extern void ui_table_row_print(struct ui_table *tbl, uint32_t col_id,
> +                            const char *str);
> +
> +extern void ui_table_header_color_set(struct ui_table *tbl, int color);
> +extern void ui_table_header_print(struct ui_table *tbl);
> +
> +#endif /* UI_H */
> -- 
> 2.6.3
> 

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to