aboutsummaryrefslogtreecommitdiff
path: root/columns.h
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2020-12-30 22:47:49 -0800
committerBruce Hill <bruce@bruce-hill.com>2020-12-30 22:47:49 -0800
commit5371a49ce0eda4054cc4dcb73abea351482711c2 (patch)
tree7e0142fdd1ce742f49c1dcda51157941834faf7f /columns.h
parent18681fa449dc10e408128dbe50c482bfff0ead05 (diff)
Refactoring into multiple files better
Diffstat (limited to 'columns.h')
-rw-r--r--columns.h191
1 files changed, 32 insertions, 159 deletions
diff --git a/columns.h b/columns.h
index 297a00a..3c9c599 100644
--- a/columns.h
+++ b/columns.h
@@ -1,154 +1,15 @@
/*
- * This file contains logic for drawing columns.
+ * columns.h - This file contains definitions for bb column-drawing code.
*/
-static void lpad(char *buf, int width)
-{
- int len = strlen(buf);
- if (len < width) {
- int pad = width - len;
- memmove(&buf[pad], buf, (size_t)len + 1);
- while (pad > 0) buf[--pad] = ' ';
- }
-}
+#ifndef FILE_COLUMNS__H
+#define FILE_COLUMNS__H
-static char* stpcpy_escaped(char *buf, const char *str, const char *color)
-{
- static const char *escapes = " abtnvfr e";
- for (const char *c = str; *c; ++c) {
- if (*c > 0 && *c <= '\x1b' && escapes[(int)*c] != ' ') { // "\n", etc.
- buf += sprintf(buf, "\033[31m\\%c%s", escapes[(int)*c], color);
- } else if (*c >= 0 && !(' ' <= *c && *c <= '~')) { // "\x02", etc.
- buf += sprintf(buf, "\033[31m\\x%02X%s", *c, color);
- } else {
- *(buf++) = *c;
- }
- }
- *buf = '\0';
- return buf;
-}
+#include "entry.h"
-static void timeago(char *buf, time_t t)
-{
- const int SECOND = 1;
- const int MINUTE = 60 * SECOND;
- const int HOUR = 60 * MINUTE;
- const int DAY = 24 * HOUR;
- const int MONTH = 30 * DAY;
- const int YEAR = 365 * DAY;
-
- time_t now = time(0);
- double delta = difftime(now, t);
-
- if (delta < 1.5)
- sprintf(buf, "a second");
- else if (delta < 1 * MINUTE)
- sprintf(buf, "%d seconds", (int)delta);
- else if (delta < 2 * MINUTE)
- sprintf(buf, "a minute");
- else if (delta < 1 * HOUR)
- sprintf(buf, "%d minutes", (int)delta/MINUTE);
- else if (delta < 2 * HOUR)
- sprintf(buf, "an hour");
- else if (delta < 1 * DAY)
- sprintf(buf, "%d hours", (int)delta/HOUR);
- else if (delta < 2 * DAY)
- sprintf(buf, "yesterday");
- else if (delta < 1 * MONTH)
- sprintf(buf, "%d days", (int)delta/DAY);
- else if (delta < 2 * MONTH)
- sprintf(buf, "a month");
- else if (delta < 1 * YEAR)
- sprintf(buf, "%d months", (int)delta/MONTH);
- else if (delta < 2 * YEAR)
- sprintf(buf, "a year");
- else
- sprintf(buf, "%d years", (int)delta/YEAR);
-}
-
-static void col_mreltime(entry_t *entry, const char *color, char *buf, int width) {
- (void)color;
- timeago(buf, entry->info.st_mtime);
- lpad(buf, width);
-}
-
-static void col_areltime(entry_t *entry, const char *color, char *buf, int width) {
- (void)color;
- timeago(buf, entry->info.st_atime);
- lpad(buf, width);
-}
-
-static void col_creltime(entry_t *entry, const char *color, char *buf, int width) {
- (void)color;
- timeago(buf, entry->info.st_ctime);
- lpad(buf, width);
-}
-
-static void col_mtime(entry_t *entry, const char *color, char *buf, int width) {
- (void)color;
- strftime(buf, (size_t)width, BB_TIME_FMT, localtime(&(entry->info.st_mtime)));
-}
-
-static void col_atime(entry_t *entry, const char *color, char *buf, int width) {
- (void)color;
- strftime(buf, (size_t)width, BB_TIME_FMT, localtime(&(entry->info.st_atime)));
-}
-
-static void col_ctime(entry_t *entry, const char *color, char *buf, int width) {
- (void)color;
- strftime(buf, (size_t)width, BB_TIME_FMT, localtime(&(entry->info.st_ctime)));
-}
-
-static void col_selected(entry_t *entry, const char *color, char *buf, int width) {
- (void)width;
- buf = stpcpy(buf, IS_SELECTED(entry) ? SELECTED_INDICATOR : NOT_SELECTED_INDICATOR);
- buf = stpcpy(buf, color);
-}
-
-static void col_perm(entry_t *entry, const char *color, char *buf, int width) {
- (void)color; (void)width;
- sprintf(buf, " %03o", entry->info.st_mode & 0777);
-}
-
-static void col_random(entry_t *entry, const char *color, char *buf, int width)
-{
- (void)color;
- sprintf(buf, "%*d", width, entry->shufflepos);
-}
-
-static void col_size(entry_t *entry, const char *color, char *buf, int width)
-{
- (void)color; (void)width;
- int j = 0;
- const char* units = "BKMGTPEZY";
- double bytes = (double)entry->info.st_size;
- while (bytes > 1024) {
- bytes /= 1024;
- j++;
- }
- sprintf(buf, " %6.*f%c ", j > 0 ? 1 : 0, bytes, units[j]);
-}
-
-static void col_name(entry_t *entry, const char *color, char *buf, int width)
-{
- (void)width;
- if (entry->no_esc) buf = stpcpy(buf, entry->name);
- else buf = stpcpy_escaped(buf, entry->name, color);
-
- if (E_ISDIR(entry)) buf = stpcpy(buf, "/");
-
- if (!entry->linkname) return;
-
- buf = stpcpy(buf, "\033[2m -> \033[3m");
- buf = stpcpy(buf, color);
- if (entry->link_no_esc) buf = stpcpy(buf, entry->linkname);
- else buf = stpcpy_escaped(buf, entry->linkname, color);
-
- if (S_ISDIR(entry->linkedmode))
- buf = stpcpy(buf, "/");
-
- buf = stpcpy(buf, "\033[22;23m");
-}
+#define TIME_FMT " %T %D "
+#define SELECTED_INDICATOR " \033[31;7m \033[0m"
+#define NOT_SELECTED_INDICATOR " "
typedef struct {
const char *name;
@@ -156,16 +17,28 @@ typedef struct {
unsigned int stretchy : 1;
} column_t;
-static column_t columns[255] = {
- ['*'] = {.name = "*", .render = col_selected},
- ['n'] = {.name = "Name", .render = col_name, .stretchy = 1},
- ['s'] = {.name = " Size", .render = col_size},
- ['p'] = {.name = "Perm", .render = col_perm},
- ['m'] = {.name = " Modified", .render = col_mreltime},
- ['M'] = {.name = " Modified ", .render = col_mtime},
- ['a'] = {.name = " Accessed", .render = col_areltime},
- ['A'] = {.name = " Accessed ", .render = col_atime},
- ['c'] = {.name = " Created", .render = col_creltime},
- ['C'] = {.name = " Created ", .render = col_ctime},
- ['r'] = {.name = "Random", .render = col_random},
-};
+typedef enum {
+ COL_NONE = 0,
+ COL_NAME = 'n',
+ COL_SIZE = 's',
+ COL_PERM = 'p',
+ COL_MTIME = 'm',
+ COL_CTIME = 'c',
+ COL_ATIME = 'a',
+ COL_RANDOM = 'r',
+ COL_SELECTED = '*',
+} column_e;
+
+void col_mreltime(entry_t *entry, const char *color, char *buf, int width);
+void col_areltime(entry_t *entry, const char *color, char *buf, int width);
+void col_creltime(entry_t *entry, const char *color, char *buf, int width);
+void col_mtime(entry_t *entry, const char *color, char *buf, int width);
+void col_atime(entry_t *entry, const char *color, char *buf, int width);
+void col_ctime(entry_t *entry, const char *color, char *buf, int width);
+void col_selected(entry_t *entry, const char *color, char *buf, int width);
+void col_perm(entry_t *entry, const char *color, char *buf, int width);
+void col_random(entry_t *entry, const char *color, char *buf, int width);
+void col_size(entry_t *entry, const char *color, char *buf, int width);
+void col_name(entry_t *entry, const char *color, char *buf, int width);
+
+#endif