/* add a new line to @tb, the content is based on @st */ static int add_line_from_stat(struct libscols_table *tb, struct libscols_line *parent, int parent_fd, struct stat *st, const char *name) { struct libscols_line *ln; char modbuf[11], *p; mode_t mode = st->st_mode; int rc = 0; ln = scols_table_new_line(tb, parent); if (!ln) err(EXIT_FAILURE, "failed to create output line"); /* MODE; local buffer, use scols_line_set_data() that calls strdup() */ xstrmode(mode, modbuf); if (scols_line_set_data(ln, COL_MODE, modbuf)) goto fail; /* SIZE; already allocated string, use scols_line_refer_data() */ p = size_to_human_string(0, st->st_size); if (!p || scols_line_refer_data(ln, COL_SIZE, p)) goto fail; /* NAME */ if (scols_line_set_data(ln, COL_NAME, name)) goto fail; /* colors */ if (scols_table_colors_wanted(tb)) { struct libscols_cell *ce = scols_line_get_cell(ln, COL_NAME); if (S_ISDIR(mode)) scols_cell_set_color(ce, "blue"); else if (S_ISLNK(mode)) scols_cell_set_color(ce, "cyan"); else if (S_ISBLK(mode)) scols_cell_set_color(ce, "magenta"); else if ((mode & S_IXOTH) || (mode & S_IXGRP) || (mode & S_IXUSR)) scols_cell_set_color(ce, "green"); } if (S_ISDIR(st->st_mode)) { int fd; if (parent_fd >= 0) fd = openat(parent_fd, name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC); else fd = open(name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC); if (fd >= 0) { rc = add_children(tb, ln, fd); close(fd); } } return rc; fail: err(EXIT_FAILURE, "failed to create cell data"); return -1; }
static void add_line(struct libscols_table *tb, const char *name, const char *data) { struct libscols_line *ln = scols_table_new_line(tb, NULL); if (!ln) err(EXIT_FAILURE, "failed to create output line"); if (scols_line_set_data(ln, COL_NAME, name)) goto fail; if (scols_line_set_data(ln, COL_DATA, data)) goto fail; return; fail: scols_unref_table(tb); err(EXIT_FAILURE, "failed to create output line"); }
static int parse_column_data(FILE *f, struct libscols_table *tb, int col) { size_t len = 0, nlines = 0; int i; char *str = NULL; while ((i = getline(&str, &len, f)) != -1) { struct libscols_line *ln; char *p = strrchr(str, '\n'); if (p) *p = '\0'; while ((p = strrchr(str, '\\')) && *(p + 1) == 'n') { *p = '\n'; memmove(p + 1, p + 2, i - (p + 2 - str)); } ln = scols_table_get_line(tb, nlines++); if (!ln) break; scols_line_set_data(ln, col, str); } free(str); return 0; }
static struct libscols_line * add_line( struct libscols_table *tb, struct libscols_line *parent, const char *prefix) { char buf[BUFSIZ]; struct libscols_line *ln = scols_table_new_line(tb, parent); if (!ln) err(EXIT_FAILURE, "failed to create output line"); if (scols_line_set_data(ln, COL_NAME, gen_text(prefix, "N", buf, 15))) goto fail; if (scols_line_set_data(ln, COL_DESC, gen_text(prefix, "D", buf, 10))) goto fail; if (scols_line_set_data(ln, COL_FOO, gen_text(prefix, "U", buf, 55))) goto fail; if (scols_line_set_data(ln, COL_LIKE, "1")) goto fail; if (scols_line_set_data(ln, COL_TEXT, gen_text(prefix, "T", buf, 50))) goto fail; return ln; fail: scols_unref_table(tb); err(EXIT_FAILURE, "faild to create output line"); }