aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-09-24 20:37:08 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-09-24 20:37:08 -0400
commitb3ad05094b4e778d92a351a743cdf15e7bd990b2 (patch)
treef3b45d636746929e89777c53de51c950c2c1c6b4
parent559a1b012a45fd37faad444050e1de733bbf109f (diff)
Autoformatting with clang-format
-rw-r--r--.clang-format274
-rw-r--r--.clangd3
-rw-r--r--bb.c446
-rw-r--r--draw.c151
-rw-r--r--draw.h14
-rw-r--r--terminal.c197
-rw-r--r--terminal.h144
-rw-r--r--types.h8
-rw-r--r--utils.c15
-rw-r--r--utils.h46
10 files changed, 797 insertions, 501 deletions
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..82e3ce3
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,274 @@
+---
+Language: Cpp
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignArrayOfStructures: None
+AlignConsecutiveAssignments:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ AlignFunctionPointers: false
+ PadOperators: true
+AlignConsecutiveBitFields:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ AlignFunctionPointers: false
+ PadOperators: false
+AlignConsecutiveDeclarations:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ AlignFunctionPointers: false
+ PadOperators: false
+AlignConsecutiveMacros:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ AlignFunctionPointers: false
+ PadOperators: false
+AlignConsecutiveShortCaseStatements:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCaseArrows: false
+ AlignCaseColons: false
+AlignConsecutiveTableGenBreakingDAGArgColons:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ AlignFunctionPointers: false
+ PadOperators: false
+AlignConsecutiveTableGenCondOperatorColons:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ AlignFunctionPointers: false
+ PadOperators: false
+AlignConsecutiveTableGenDefinitionColons:
+ Enabled: false
+ AcrossEmptyLines: false
+ AcrossComments: false
+ AlignCompound: false
+ AlignFunctionPointers: false
+ PadOperators: false
+AlignEscapedNewlines: Right
+AlignOperands: Align
+AlignTrailingComments:
+ Kind: Never
+ OverEmptyLines: 0
+AllowAllArgumentsOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowBreakBeforeNoexceptSpecifier: Never
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseExpressionOnASingleLine: true
+AllowShortCaseLabelsOnASingleLine: true
+AllowShortCompoundRequirementOnASingleLine: true
+AllowShortEnumsOnASingleLine: true
+AllowShortFunctionsOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: AllIfsAndElse
+AllowShortLambdasOnASingleLine: All
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AttributeMacros:
+ - __capability
+BinPackArguments: true
+BinPackParameters: true
+BitFieldColonSpacing: Both
+BraceWrapping:
+ AfterCaseLabel: false
+ AfterClass: false
+ AfterControlStatement: Never
+ AfterEnum: false
+ AfterExternBlock: false
+ AfterFunction: false
+ AfterNamespace: false
+ AfterObjCDeclaration: false
+ AfterStruct: false
+ AfterUnion: false
+ BeforeCatch: false
+ BeforeElse: false
+ BeforeLambdaBody: false
+ BeforeWhile: false
+ IndentBraces: false
+ SplitEmptyFunction: true
+ SplitEmptyRecord: true
+ SplitEmptyNamespace: true
+BreakAdjacentStringLiterals: true
+BreakAfterAttributes: Leave
+BreakAfterJavaFieldAnnotations: false
+BreakAfterReturnType: None
+BreakArrays: true
+BreakBeforeBinaryOperators: NonAssignment
+BreakBeforeConceptDeclarations: Always
+BreakBeforeBraces: Attach
+BreakBeforeInlineASMColon: OnlyMultiline
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: BeforeColon
+BreakFunctionDefinitionParameters: false
+BreakInheritanceList: BeforeColon
+BreakStringLiterals: true
+BreakTemplateDeclarations: MultiLine
+ColumnLimit: 120
+CommentPragmas: '^ IWYU pragma:'
+CompactNamespaces: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+DisableFormat: false
+EmptyLineAfterAccessModifier: Never
+EmptyLineBeforeAccessModifier: LogicalBlock
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: true
+ForEachMacros:
+ - foreach
+ - Q_FOREACH
+ - BOOST_FOREACH
+IfMacros:
+ - KJ_IF_MAYBE
+IncludeBlocks: Preserve
+IncludeCategories:
+ - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
+ Priority: 2
+ SortPriority: 0
+ CaseSensitive: false
+ - Regex: '^(<|"(gtest|gmock|isl|json)/)'
+ Priority: 3
+ SortPriority: 0
+ CaseSensitive: false
+ - Regex: '.*'
+ Priority: 1
+ SortPriority: 0
+ CaseSensitive: false
+IncludeIsMainRegex: '(Test)?$'
+IncludeIsMainSourceRegex: ''
+IndentAccessModifiers: false
+IndentCaseBlocks: false
+IndentCaseLabels: false
+IndentExternBlock: AfterExternBlock
+IndentGotoLabels: true
+IndentPPDirectives: None
+IndentRequiresClause: true
+IndentWidth: 4
+IndentWrappedFunctionNames: false
+InsertBraces: false
+InsertNewlineAtEOF: false
+InsertTrailingCommas: None
+IntegerLiteralSeparator:
+ Binary: 0
+ BinaryMinDigits: 0
+ Decimal: 0
+ DecimalMinDigits: 0
+ Hex: 0
+ HexMinDigits: 0
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLines:
+ AtEndOfFile: false
+ AtStartOfBlock: true
+ AtStartOfFile: true
+LambdaBodyIndentation: Signature
+LineEnding: DeriveLF
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MainIncludeChar: Quote
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 2
+ObjCBreakBeforeNestedBlockParam: true
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PackConstructorInitializers: BinPack
+PenaltyBreakAssignment: 2
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakOpenParenthesis: 0
+PenaltyBreakScopeResolution: 500
+PenaltyBreakString: 1000
+PenaltyBreakTemplateDeclaration: 10
+PenaltyExcessCharacter: 1000000
+PenaltyIndentedWhitespace: 0
+PenaltyReturnTypeOnItsOwnLine: 60
+PointerAlignment: Right
+PPIndentWidth: -1
+QualifierAlignment: Leave
+ReferenceAlignment: Pointer
+ReflowComments: true
+RemoveBracesLLVM: false
+RemoveParentheses: Leave
+RemoveSemicolon: false
+RequiresClausePosition: OwnLine
+RequiresExpressionIndentation: OuterScope
+SeparateDefinitionBlocks: Leave
+ShortNamespaceLines: 1
+SkipMacroDefinitionBody: false
+SortIncludes: CaseSensitive
+SortJavaStaticImport: Before
+SortUsingDeclarations: LexicographicNumeric
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceAroundPointerQualifiers: Default
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCaseColon: false
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeJsonColon: false
+SpaceBeforeParens: ControlStatements
+SpaceBeforeParensOptions:
+ AfterControlStatements: true
+ AfterForeachMacros: true
+ AfterFunctionDefinitionName: false
+ AfterFunctionDeclarationName: false
+ AfterIfMacros: true
+ AfterOverloadedOperator: false
+ AfterPlacementOperator: true
+ AfterRequiresInClause: false
+ AfterRequiresInExpression: false
+ BeforeNonEmptyParentheses: false
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceBeforeSquareBrackets: false
+SpaceInEmptyBlock: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: Never
+SpacesInContainerLiterals: true
+SpacesInLineCommentPrefix:
+ Minimum: 1
+ Maximum: -1
+SpacesInParens: Never
+SpacesInParensOptions:
+ ExceptDoubleParentheses: false
+ InCStyleCasts: false
+ InConditionalStatements: false
+ InEmptyParentheses: false
+ Other: false
+SpacesInSquareBrackets: false
+Standard: Latest
+StatementAttributeLikeMacros:
+ - Q_EMIT
+StatementMacros:
+ - Q_UNUSED
+ - QT_REQUIRE_VERSION
+TableGenBreakInsideDAGArg: DontBreak
+TabWidth: 4
+UseTab: Never
+VerilogBreakBetweenInstancePorts: true
+WhitespaceSensitiveMacros:
+ - BOOST_PP_STRINGIZE
+ - CF_SWIFT_NAME
+ - NS_SWIFT_NAME
+ - PP_STRINGIZE
+ - STRINGIZE
+...
+
diff --git a/.clangd b/.clangd
new file mode 100644
index 0000000..6cf2eba
--- /dev/null
+++ b/.clangd
@@ -0,0 +1,3 @@
+CompileFlags:
+ Add: [-xc]
+Checks: '-bugprone-suspicious-missing-comma'
diff --git a/bb.c b/bb.c
index 7502db1..709dfaa 100644
--- a/bb.c
+++ b/bb.c
@@ -34,10 +34,15 @@
#define BB_VERSION "0.31.0"
#define MAX_BINDINGS 1024
-#define SCROLLOFF MIN(5, (winsize.ws_row-4)/2)
+#define SCROLLOFF MIN(5, (winsize.ws_row - 4) / 2)
#define ONSCREEN (winsize.ws_row - 3)
-#define LOG(...) do { FILE *f = fopen("log.txt", "a"); fprintf(f, __VA_ARGS__); fclose(f); } while (0)
+#define LOG(...) \
+ do { \
+ FILE *f = fopen("log.txt", "a"); \
+ fprintf(f, __VA_ARGS__); \
+ fclose(f); \
+ } while (0)
// Functions
void bb_browse(bb_t *bb, int argc, char *argv[]);
@@ -45,14 +50,13 @@ static void check_cmdfile(bb_t *bb);
static void cleanup(void);
static void cleanup_and_raise(int sig);
static int compare_files(const void *v1, const void *v2);
-__attribute__((format(printf,2,3)))
-void flash_warn(bb_t *bb, const char *fmt, ...);
+__attribute__((format(printf, 2, 3))) void flash_warn(bb_t *bb, const char *fmt, ...);
static void handle_next_key_binding(bb_t *bb);
static void init_term(void);
static int is_simple_bbcmd(const char *s);
-static entry_t* load_entry(bb_t *bb, const char *path);
+static entry_t *load_entry(bb_t *bb, const char *path);
static int matches_cmd(const char *str, const char *cmd);
-static char* normalize_path(const char *path, char *pbuf);
+static char *normalize_path(const char *path, char *pbuf);
static int populate_files(bb_t *bb, const char *path);
static void print_bindings(FILE *f);
static void run_bbcmd(bb_t *bb, const char *cmd);
@@ -73,12 +77,14 @@ static void update_term_size(int sig);
static int wait_for_process(proc_t **proc);
// Constants
-static const char *T_ENTER_BBMODE = T_OFF(T_SHOW_CURSOR ";" T_WRAP) T_ON(T_ALT_SCREEN ";" T_MOUSE_XY ";" T_MOUSE_CELL ";" T_MOUSE_SGR);
-static const char *T_LEAVE_BBMODE = T_OFF(T_MOUSE_XY ";" T_MOUSE_CELL ";" T_MOUSE_SGR ";" T_ALT_SCREEN) T_ON(T_SHOW_CURSOR ";" T_WRAP);
+static const char *T_ENTER_BBMODE =
+ T_OFF(T_SHOW_CURSOR ";" T_WRAP) T_ON(T_ALT_SCREEN ";" T_MOUSE_XY ";" T_MOUSE_CELL ";" T_MOUSE_SGR);
+static const char *T_LEAVE_BBMODE =
+ T_OFF(T_MOUSE_XY ";" T_MOUSE_CELL ";" T_MOUSE_SGR ";" T_ALT_SCREEN) T_ON(T_SHOW_CURSOR ";" T_WRAP);
static const char *T_LEAVE_BBMODE_PARTIAL = T_OFF(T_MOUSE_XY ";" T_MOUSE_CELL ";" T_MOUSE_SGR) T_ON(T_WRAP);
-static const char *description_str = BB_NAME" - an itty bitty console TUI file browser\n";
-static const char *usage_str = "Usage: "BB_NAME" (-h/--help | -v/--version | -s | -d | -0 | +command)* [[--] directory]\n";
-
+static const char *description_str = BB_NAME " - an itty bitty console TUI file browser\n";
+static const char *usage_str =
+ "Usage: " BB_NAME " (-h/--help | -v/--version | -s | -d | -0 | +command)* [[--] directory]\n";
// Variables used within this file to track global state
static binding_t bindings[MAX_BINDINGS];
@@ -95,21 +101,20 @@ typedef struct {
char filename[PATH_MAX];
} outbuf_t;
outbuf_t output_buffers[] = {
- {.name="stdout", .orig_fd=STDOUT_FILENO, .dup_fd=-1, .tmp_fd=-1},
- {.name="stderr", .orig_fd=STDERR_FILENO, .dup_fd=-1, .tmp_fd=-1},
+ {.name = "stdout", .orig_fd = STDOUT_FILENO, .dup_fd = -1, .tmp_fd = -1},
+ {.name = "stderr", .orig_fd = STDERR_FILENO, .dup_fd = -1, .tmp_fd = -1},
};
//
// Use bb to browse the filesystem.
//
-void bb_browse(bb_t *bb, int argc, char *argv[])
-{
+void bb_browse(bb_t *bb, int argc, char *argv[]) {
const char *initial_path;
- if (argc >= 3 && streq(argv[argc-2], "--")) {
- initial_path = argv[argc-1];
+ if (argc >= 3 && streq(argv[argc - 2], "--")) {
+ initial_path = argv[argc - 1];
argc -= 2;
- } else if (argc >= 2 && argv[argc-1][0] != '-' && argv[argc-1][0] != '+') {
- initial_path = argv[argc-1];
+ } else if (argc >= 2 && argv[argc - 1][0] != '-' && argv[argc - 1][0] != '+') {
+ initial_path = argv[argc - 1];
argc -= 1;
} else {
initial_path = ".";
@@ -124,7 +129,7 @@ void bb_browse(bb_t *bb, int argc, char *argv[])
if (!S_ISDIR(path_stat.st_mode)) {
char *slash = strrchr(full_initial_path, '/');
*slash = '\0';
- goto_file = slash+1;
+ goto_file = slash + 1;
}
if (populate_files(bb, full_initial_path))
@@ -137,8 +142,7 @@ void bb_browse(bb_t *bb, int argc, char *argv[])
system("bbstartup");
FILE *cmdfile = fopen(cmdfilename, "a");
- if (goto_file)
- fprintf(cmdfile, "%cgoto:%s", '\0', goto_file);
+ if (goto_file) fprintf(cmdfile, "%cgoto:%s", '\0', goto_file);
for (int i = 0; i < argc; i++) {
if (argv[i][0] == '+') {
char *cmd = argv[i] + 1;
@@ -166,8 +170,7 @@ void bb_browse(bb_t *bb, int argc, char *argv[])
// Check the bb command file and run any and all commands that have been
// written to it.
//
-static void check_cmdfile(bb_t *bb)
-{
+static void check_cmdfile(bb_t *bb) {
FILE *cmdfile = fopen(cmdfilename, "r");
if (!cmdfile) return;
char *cmd = NULL;
@@ -177,7 +180,7 @@ static void check_cmdfile(bb_t *bb)
run_bbcmd(bb, cmd);
if (bb->should_quit) break;
}
- delete(&cmd);
+ delete (&cmd);
fclose(cmdfile);
unlink(cmdfilename);
}
@@ -185,8 +188,7 @@ static void check_cmdfile(bb_t *bb)
//
// Clean up the terminal before going to the default signal handling behavior.
//
-static void cleanup_and_raise(int sig)
-{
+static void cleanup_and_raise(int sig) {
cleanup();
int childsig = (sig == SIGTSTP || sig == SIGSTOP) ? sig : SIGHUP;
if (current_bb) {
@@ -205,8 +207,7 @@ static void cleanup_and_raise(int sig)
//
// Reset the screen, delete the cmdfile, and print the stdout/stderr buffers
//
-static void cleanup(void)
-{
+static void cleanup(void) {
if (cmdfilename[0]) {
unlink(cmdfilename);
cmdfilename[0] = '\0';
@@ -216,13 +217,13 @@ static void cleanup(void)
fflush(tty_out);
tcsetattr(fileno(tty_out), TCSANOW, &orig_termios);
}
- FOREACH(outbuf_t*, ob, output_buffers) {
+ FOREACH(outbuf_t *, ob, output_buffers) {
if (ob->tmp_fd == -1) continue;
fflush(ob->orig_fd == STDOUT_FILENO ? stdout : stderr);
dup2(ob->dup_fd, ob->orig_fd);
lseek(ob->tmp_fd, 0, SEEK_SET);
char buf[256];
- for (ssize_t len; (len = read(ob->tmp_fd, buf, LEN(buf))) > 0; )
+ for (ssize_t len; (len = read(ob->tmp_fd, buf, LEN(buf))) > 0;)
write(ob->orig_fd, buf, len);
close(ob->tmp_fd);
ob->tmp_fd = ob->dup_fd = -1;
@@ -234,12 +235,14 @@ static void cleanup(void)
// Used for sorting, this function compares files according to the sorting-related options,
// like bb->sort
//
-static int compare_files(const void *v1, const void *v2)
-{
-#define COMPARE(a, b) if ((a) != (b)) { return sign*((a) < (b) ? 1 : -1); }
+static int compare_files(const void *v1, const void *v2) {
+#define COMPARE(a, b) \
+ if ((a) != (b)) { \
+ return sign * ((a) < (b) ? 1 : -1); \
+ }
#define COMPARE_TIME(t1, t2) COMPARE((t1).tv_sec, (t2).tv_sec) COMPARE((t1).tv_nsec, (t2).tv_nsec)
bb_t *bb = current_bb;
- const entry_t *e1 = *((const entry_t**)v1), *e2 = *((const entry_t**)v2);
+ const entry_t *e1 = *((const entry_t **)v1), *e2 = *((const entry_t **)v2);
int sign = 1;
if (!bb->interleave_dirs) {
@@ -262,8 +265,8 @@ static int compare_files(const void *v1, const void *v2)
while (*n1 && *n2) {
char c1 = tolower(*n1), c2 = tolower(*n2);
if ('0' <= c1 && c1 <= '9' && '0' <= c2 && c2 <= '9') {
- long i1 = strtol(n1, (char**)&n1, 10);
- long i2 = strtol(n2, (char**)&n2, 10);
+ long i1 = strtol(n1, (char **)&n1, 10);
+ long i2 = strtol(n2, (char **)&n2, 10);
// Shorter numbers always go before longer. In practice, I assume
// filenames padded to the same number of digits should be grouped
// together, instead of
@@ -273,7 +276,8 @@ static int compare_files(const void *v1, const void *v2)
COMPARE(i2, i1);
} else {
COMPARE(c2, c1);
- ++n1; ++n2;
+ ++n1;
+ ++n2;
}
}
COMPARE(tolower(*n2), tolower(*n1));
@@ -297,7 +301,7 @@ static int compare_files(const void *v1, const void *v2)
// Flash a warning message at the bottom of the screen.
//
void flash_warn(bb_t *bb, const char *fmt, ...) {
- move_cursor(tty_out, 0, winsize.ws_row-1);
+ move_cursor(tty_out, 0, winsize.ws_row - 1);
fputs("\033[41;33;1m", tty_out);
va_list args;
va_start(args, fmt);
@@ -305,7 +309,8 @@ void flash_warn(bb_t *bb, const char *fmt, ...) {
va_end(args);
fputs(" Press any key to continue...\033[0m ", tty_out);
fflush(tty_out);
- while (bgetkey(tty_in, NULL, NULL) == -1) usleep(100);
+ while (bgetkey(tty_in, NULL, NULL) == -1)
+ usleep(100);
bb->dirty = 1;
}
@@ -313,8 +318,7 @@ void flash_warn(bb_t *bb, const char *fmt, ...) {
// Wait until the user has pressed a key with an associated key binding and run
// that binding.
//
-static void handle_next_key_binding(bb_t *bb)
-{
+static void handle_next_key_binding(bb_t *bb) {
int key, mouse_x, mouse_y;
binding_t *binding;
do {
@@ -322,13 +326,12 @@ static void handle_next_key_binding(bb_t *bb)
struct winsize prevsize = winsize;
key = bgetkey(tty_in, &mouse_x, &mouse_y);
// Window size changed while waiting for keypress:
- if (winsize.ws_row != prevsize.ws_row || winsize.ws_col != prevsize.ws_col)
- bb->dirty = 1;
+ if (winsize.ws_row != prevsize.ws_row || winsize.ws_col != prevsize.ws_col) bb->dirty = 1;
if (key == -1 && bb->dirty) return;
} while (key == -1);
binding = NULL;
- FOREACH(binding_t*, b, bindings) {
+ FOREACH(binding_t *, b, bindings) {
if (key == b->key) {
binding = b;
break;
@@ -338,7 +341,7 @@ static void handle_next_key_binding(bb_t *bb)
char bbmousecol[2] = {0, 0}, bbclicked[PATH_MAX];
if (mouse_x != -1 && mouse_y != -1) {
- int *colwidths = get_column_widths(bb->columns, winsize.ws_col-1);
+ int *colwidths = get_column_widths(bb->columns, winsize.ws_col - 1);
// Get bb column:
for (int col = 0, x = 0; bb->columns[col]; col++, x++) {
x += colwidths[col];
@@ -349,8 +352,7 @@ static void handle_next_key_binding(bb_t *bb)
}
if (mouse_y == 1) {
strcpy(bbclicked, "<column label>");
- } else if (2 <= mouse_y && mouse_y <= winsize.ws_row - 2
- && bb->scroll + (mouse_y - 2) <= bb->nfiles - 1) {
+ } else if (2 <= mouse_y && mouse_y <= winsize.ws_row - 2 && bb->scroll + (mouse_y - 2) <= bb->nfiles - 1) {
strcpy(bbclicked, bb->files[bb->scroll + (mouse_y - 2)]->fullname);
} else {
bbclicked[0] = '\0';
@@ -362,15 +364,14 @@ static void handle_next_key_binding(bb_t *bb)
if (is_simple_bbcmd(binding->script)) {
run_bbcmd(bb, binding->script);
} else {
- move_cursor(tty_out, 0, winsize.ws_row-1);
+ move_cursor(tty_out, 0, winsize.ws_row - 1);
fputs("\033[K", tty_out);
restore_term(&orig_termios);
run_script(bb, binding->script);
for (entry_t *next, *e = bb->selected; e; e = next) {
next = e->selected.next;
struct stat buf;
- if (stat(e->fullname, &buf) != 0)
- set_selected(bb, e, 0);
+ if (stat(e->fullname, &buf) != 0) set_selected(bb, e, 0);
}
init_term();
set_title(bb);
@@ -386,8 +387,7 @@ static void handle_next_key_binding(bb_t *bb)
// Initialize the terminal files for /dev/tty and set up some desired
// attributes like passing Ctrl-c as a key instead of interrupting
//
-static void init_term(void)
-{
+static void init_term(void) {
nonnegative(tcsetattr(fileno(tty_out), TCSANOW, &bb_termios));
update_term_size(0);
// Initiate mouse tracking and disable text wrapping:
@@ -399,16 +399,14 @@ static void init_term(void)
// Return whether or not 's' is a simple bb command that doesn't need
// a full shell instance (e.g. "bbcmd cd:.." or "bbcmd move:+1").
//
-static int is_simple_bbcmd(const char *s)
-{
+static int is_simple_bbcmd(const char *s) {
if (!s) return 0;
- while (*s == ' ') ++s;
- if (strncmp(s, "bbcmd ", strlen("bbcmd ")) != 0)
- return 0;
+ while (*s == ' ')
+ ++s;
+ if (strncmp(s, "bbcmd ", strlen("bbcmd ")) != 0) return 0;
const char *special = ";$&<>|\n*?\\\"'";
for (const char *p = special; *p; ++p) {
- if (strchr(s, *p))
- return 0;
+ if (strchr(s, *p)) return 0;
}
return 1;
}
@@ -419,22 +417,19 @@ static int is_simple_bbcmd(const char *s)
// Warning: this does not deduplicate entries, and it's best if there aren't
// duplicate entries hanging around.
//
-static entry_t* load_entry(bb_t *bb, const char *path)
-{
+static entry_t *load_entry(bb_t *bb, const char *path) {
struct stat linkedstat, filestat;
if (!path || !path[0]) return NULL;
if (lstat(path, &filestat) == -1) return NULL;
char pbuf[PATH_MAX];
- if (path[0] == '/')
- strcpy(pbuf, path);
- else
- sprintf(pbuf, "%s%s", bb->path, path);
- if (pbuf[strlen(pbuf)-1] == '/' && pbuf[1])
- pbuf[strlen(pbuf)-1] = '\0';
+ if (path[0] == '/') strcpy(pbuf, path);
+ else sprintf(pbuf, "%s%s", bb->path, path);
+ if (pbuf[strlen(pbuf) - 1] == '/' && pbuf[1]) pbuf[strlen(pbuf) - 1] = '\0';
// Check for pre-existing:
for (entry_t *e = bb->hash[(int)filestat.st_ino & HASH_MASK]; e; e = e->hash.next) {
- if (e->info.st_ino == filestat.st_ino && e->info.st_dev == filestat.st_dev
+ if (e->info.st_ino == filestat.st_ino
+ && e->info.st_dev == filestat.st_dev
// Need to check filename in case of hard links
&& streq(pbuf, e->fullname))
return e;
@@ -445,25 +440,22 @@ static entry_t* load_entry(bb_t *bb, const char *path)
if (S_ISLNK(filestat.st_mode)) {
linkpathlen = nonnegative(readlink(pbuf, linkbuf, sizeof(linkbuf)), "Couldn't read link: '%s'", pbuf);
linkbuf[linkpathlen] = '\0';
- while (linkpathlen > 0 && linkbuf[linkpathlen-1] == '/') linkbuf[--linkpathlen] = '\0';
+ while (linkpathlen > 0 && linkbuf[linkpathlen - 1] == '/')
+ linkbuf[--linkpathlen] = '\0';
if (stat(pbuf, &linkedstat) == -1) memset(&linkedstat, 0, sizeof(linkedstat));
}
size_t pathlen = strlen(pbuf);
size_t entry_size = sizeof(entry_t) + (pathlen + 1) + (size_t)(linkpathlen + 1);
entry_t *entry = new_bytes(entry_size);
char *end = stpcpy(entry->fullname, pbuf);
- if (linkpathlen >= 0)
- entry->linkname = strcpy(end + 1, linkbuf);
+ if (linkpathlen >= 0) entry->linkname = strcpy(end + 1, linkbuf);
if (streq(entry->fullname, "/")) {
entry->name = entry->fullname;
} else {
- if (strncmp(entry->fullname, bb->path, strlen(bb->path)) == 0)
- entry->name = entry->fullname + strlen(bb->path);
- else
- entry->name = strrchr(entry->fullname, '/') + 1; // Last path component
+ if (strncmp(entry->fullname, bb->path, strlen(bb->path)) == 0) entry->name = entry->fullname + strlen(bb->path);
+ else entry->name = strrchr(entry->fullname, '/') + 1; // Last path component
}
- if (S_ISLNK(filestat.st_mode))
- entry->linkedmode = linkedstat.st_mode;
+ if (S_ISLNK(filestat.st_mode)) entry->linkedmode = linkedstat.st_mode;
entry->info = filestat;
LL_PREPEND(bb->hash[(int)filestat.st_ino & HASH_MASK], entry, hash);
entry->index = -1;
@@ -475,11 +467,10 @@ static entry_t* load_entry(bb_t *bb, const char *path)
// Return whether a string matches a command
// e.g. matches_cmd("sel:x", "select:") == 1, matches_cmd("q", "quit") == 1
//
-static int matches_cmd(const char *str, const char *cmd)
-{
- if ((strchr(cmd, ':') == NULL) != (strchr(str, ':') == NULL))
- return 0;
- while (*str == *cmd && *cmd && *cmd != ':') ++str, ++cmd;
+static int matches_cmd(const char *str, const char *cmd) {
+ if ((strchr(cmd, ':') == NULL) != (strchr(str, ':') == NULL)) return 0;
+ while (*str == *cmd && *cmd && *cmd != ':')
+ ++str, ++cmd;
return *str == '\0' || *str == ':';
}
@@ -487,8 +478,7 @@ static int matches_cmd(const char *str, const char *cmd)
// Prepend `./` to relative paths, replace "~" with $HOME.
// The normalized path is stored in `normalized`.
//
-static char *normalize_path(const char *path, char *normalized)
-{
+static char *normalize_path(const char *path, char *normalized) {
char pbuf[PATH_MAX] = {0};
if (path[0] == '~' && (path[1] == '\0' || path[1] == '/')) {
char *home;
@@ -510,25 +500,19 @@ static char *normalize_path(const char *path, char *normalized)
// Remove all the files currently stored in bb->files and if `bb->path` is
// non-NULL, update `bb` with a listing of the files in `path`
//
-static int populate_files(bb_t *bb, const char *path)
-{
+static int populate_files(bb_t *bb, const char *path) {
int clear_future_history = 0;
if (path == NULL)
;
else if (streq(path, "-")) {
- if (!bb->history)
- return -1;
- if (bb->history->prev)
- bb->history = bb->history->prev;
+ if (!bb->history) return -1;
+ if (bb->history->prev) bb->history = bb->history->prev;
path = bb->history->path;
} else if (streq(path, "+")) {
- if (!bb->history)
- return -1;
- if (bb->history->next)
- bb->history = bb->history->next;
+ if (!bb->history) return -1;
+ if (bb->history->next) bb->history = bb->history->next;
path = bb->history->path;
- } else
- clear_future_history = 1;
+ } else clear_future_history = 1;
int samedir = path && streq(bb->path, path);
int old_scroll = bb->scroll;
@@ -539,10 +523,8 @@ static int populate_files(bb_t *bb, const char *path)
char pbuf[PATH_MAX] = {0}, prev[PATH_MAX] = {0};
strcpy(prev, bb->path);
if (path != NULL) {
- if (!normalize_path(path, pbuf))
- flash_warn(bb, "Could not normalize path: \"%s\"", path);
- if (pbuf[strlen(pbuf)-1] != '/')
- strcat(pbuf, "/");
+ if (!normalize_path(path, pbuf)) flash_warn(bb, "Could not normalize path: \"%s\"", path);
+ if (pbuf[strlen(pbuf) - 1] != '/') strcat(pbuf, "/");
if (chdir(pbuf)) {
flash_warn(bb, "Could not cd to: \"%s\"", pbuf);
return -1;
@@ -552,10 +534,10 @@ static int populate_files(bb_t *bb, const char *path)
if (clear_future_history && !samedir) {
for (bb_history_t *next, *h = bb->history ? bb->history->next : NULL; h; h = next) {
next = h->next;
- delete(&h);
+ delete (&h);
}
- bb_history_t *h = new(bb_history_t);
+ bb_history_t *h = new (bb_history_t);
strcpy(h->path, pbuf);
h->prev = bb->history;
if (bb->history) bb->history->next = h;
@@ -573,21 +555,20 @@ static int populate_files(bb_t *bb, const char *path)
try_free_entry(bb->files[i]);
bb->files[i] = NULL;
}
- delete(&bb->files);
+ delete (&bb->files);
}
bb->nfiles = 0;
bb->cursor = 0;
bb->scroll = 0;
- if (!bb->path[0])
- return 0;
+ if (!bb->path[0]) return 0;
size_t space = 0;
glob_t globbuf = {0};
char *pat, *tmpglob = check_strdup(bb->globpats);
while ((pat = strsep(&tmpglob, " ")) != NULL)
- glob(pat, GLOB_NOSORT|GLOB_APPEND, NULL, &globbuf);
- delete(&tmpglob);
+ glob(pat, GLOB_NOSORT | GLOB_APPEND, NULL, &globbuf);
+ delete (&tmpglob);
for (size_t i = 0; i < globbuf.gl_pathc; i++) {
// Don't normalize path so we can get "." and ".."
entry_t *entry = load_entry(bb, globbuf.gl_pathv[i]);
@@ -596,8 +577,7 @@ static int populate_files(bb_t *bb, const char *path)
continue;
}
entry->index = bb->nfiles;
- if ((size_t)bb->nfiles + 1 > space)
- bb->files = grow(bb->files, space += 100);
+ if ((size_t)bb->nfiles + 1 > space) bb->files = grow(bb->files, space += 100);
bb->files[bb->nfiles++] = entry;
}
globfree(&globbuf);
@@ -609,7 +589,7 @@ static int populate_files(bb_t *bb, const char *path)
seed ^= ((bb->files[i]->info.st_ino ^ 89869747UL) ^ (bb->files[i]->info.st_ino << 16)) * 3644798167UL;
srand((unsigned int)seed);
for (int i = 0; i < bb->nfiles; i++) {
- int j = rand() % (i+1); // This introduces some RNG bias, but it's not important here
+ int j = rand() % (i + 1); // This introduces some RNG bias, but it's not important here
bb->files[i]->shufflepos = bb->files[j]->shufflepos;
bb->files[j]->shufflepos = i;
}
@@ -617,7 +597,7 @@ static int populate_files(bb_t *bb, const char *path)
sort_files(bb);
if (samedir) {
set_scroll(bb, old_scroll);
- bb->cursor = old_cursor > bb->nfiles-1 ? bb->nfiles-1 : old_cursor;
+ bb->cursor = old_cursor > bb->nfiles - 1 ? bb->nfiles - 1 : old_cursor;
if (old_selected[0]) {
entry_t *e = load_entry(bb, old_selected);
if (e) set_cursor(bb, e->index);
@@ -635,25 +615,25 @@ static int populate_files(bb_t *bb, const char *path)
//
// Print the current key bindings
//
-static void print_bindings(FILE *f)
-{
- FOREACH(binding_t*, b, bindings) {
+static void print_bindings(FILE *f) {
+ FOREACH(binding_t *, b, bindings) {
if (!b->description) break;
if (b->key == -1) {
const char *label = b->description;
- fprintf(f, "\n\033[33;1;4m\033[%dG%s\033[0m\n", (winsize.ws_col-(int)strlen(label))/2, label);
+ fprintf(f, "\n\033[33;1;4m\033[%dG%s\033[0m\n", (winsize.ws_col - (int)strlen(label)) / 2, label);
continue;
}
char buf[1000];
char *p = buf;
- for (binding_t *next = b; next < &bindings[LEN(bindings)] && next->script && streq(b->description, next->description); next++) {
+ for (binding_t *next = b;
+ next < &bindings[LEN(bindings)] && next->script && streq(b->description, next->description); next++) {
if (next > b) p = stpcpy(p, ", ");
p = bkeyname(next->key, p);
b = next;
}
*p = '\0';
- fprintf(f, "\033[1m\033[%dG%s\033[0m", winsize.ws_col/2 - 1 - (int)strlen(buf), buf);
- fprintf(f, "\033[1m\033[%dG\033[34m%s\033[0m", winsize.ws_col/2 + 1, b->description);
+ fprintf(f, "\033[1m\033[%dG%s\033[0m", winsize.ws_col / 2 - 1 - (int)strlen(buf), buf);
+ fprintf(f, "\033[1m\033[%dG\033[34m%s\033[0m", winsize.ws_col / 2 + 1, b->description);
fprintf(f, "\033[0m\n");
}
fprintf(f, "\n");
@@ -663,19 +643,22 @@ static void print_bindings(FILE *f)
// Run a bb internal command (e.g. "+refresh") and return an indicator of what
// needs to happen next.
//
-static void run_bbcmd(bb_t *bb, const char *cmd)
-{
- while (*cmd == ' ' || *cmd == '\n') ++cmd;
+static void run_bbcmd(bb_t *bb, const char *cmd) {
+ while (*cmd == ' ' || *cmd == '\n')
+ ++cmd;
if (strncmp(cmd, "bbcmd ", strlen("bbcmd ")) == 0) cmd = &cmd[strlen("bbcmd ")];
const char *value = strchr(cmd, ':');
if (value) ++value;
if (matches_cmd(cmd, "bind:")) { // +bind:<keys>:<script>
char *value_copy = check_strdup(value);
char *keys = trim(value_copy);
- if (!keys[0]) { delete(&value_copy); return; }
- char *script = strchr(keys+1, ':');
+ if (!keys[0]) {
+ delete (&value_copy);
+ return;
+ }
+ char *script = strchr(keys + 1, ':');
if (!script) {
- delete(&value_copy);
+ delete (&value_copy);
flash_warn(bb, "No script provided.");
return;
}
@@ -684,10 +667,10 @@ static void run_bbcmd(bb_t *bb, const char *cmd)
char *description;
if (script[0] == '#') {
description = trim(strsep(&script, "\n") + 1);
- if (!script) script = (char*)"";
+ if (!script) script = (char *)"";
else script = trim(script);
} else description = script;
- for (char *key; (key = strsep(&keys, ",")); ) {
+ for (char *key; (key = strsep(&keys, ","));) {
int keyval;
if (streq(key, "Section")) {
keyval = -1;
@@ -695,32 +678,29 @@ static void run_bbcmd(bb_t *bb, const char *cmd)
keyval = bkeywithname(key);
if (keyval == -1) continue;
// Delete existing bindings for this key (if any):
- FOREACH(binding_t*, b, bindings) {
+ FOREACH(binding_t *, b, bindings) {
if (b->key == keyval) {
- delete((char**)&b->description);
- delete((char**)&b->script);
+ delete ((char **)&b->description);
+ delete ((char **)&b->script);
int i = (int)(b - bindings);
- memmove(&bindings[i], &bindings[i+1], sizeof(binding_t)*(LEN(bindings) - i - 1));
- memset(&bindings[LEN(bindings)-1], 0, sizeof(binding_t));
+ memmove(&bindings[i], &bindings[i + 1], sizeof(binding_t) * (LEN(bindings) - i - 1));
+ memset(&bindings[LEN(bindings) - 1], 0, sizeof(binding_t));
}
}
}
// Append binding:
- FOREACH(binding_t*, b, bindings) {
+ FOREACH(binding_t *, b, bindings) {
if (b->script) continue;
b->key = keyval;
- if (is_simple_bbcmd(script))
- b->script = check_strdup(script);
- else
- nonnegative(asprintf((char**)&b->script, "set -e\n%s", script), "Could not copy script");
+ if (is_simple_bbcmd(script)) b->script = check_strdup(script);
+ else nonnegative(asprintf((char **)&b->script, "set -e\n%s", script), "Could not copy script");
b->description = check_strdup(description);
break;
}
}
- delete(&value_copy);
+ delete (&value_copy);
} else if (matches_cmd(cmd, "cd:")) { // +cd:
- if (populate_files(bb, value))
- flash_warn(bb, "Could not open directory: \"%s\"", value);
+ if (populate_files(bb, value)) flash_warn(bb, "Could not open directory: \"%s\"", value);
} else if (matches_cmd(cmd, "columns:")) { // +columns:
set_columns(bb, value);
} else if (matches_cmd(cmd, "deselect")) { // +deselect
@@ -743,14 +723,15 @@ static void run_bbcmd(bb_t *bb, const char *cmd)
}
} else if (matches_cmd(cmd, "fg:") || matches_cmd(cmd, "fg")) { // +fg:
int nprocs = 0;
- for (proc_t *p = bb->running_procs; p; p = p->running.next) ++nprocs;
+ for (proc_t *p = bb->running_procs; p; p = p->running.next)
+ ++nprocs;
int fg = value ? nprocs - (int)strtol(value, NULL, 10) : 0;
proc_t *child = NULL;
for (proc_t *p = bb->running_procs; p && !child; p = p->running.next) {
if (fg-- == 0) child = p;
}
if (!child) return;
- move_cursor(tty_out, 0, winsize.ws_row-1);
+ move_cursor(tty_out, 0, winsize.ws_row - 1);
fputs("\033[K", tty_out);
restore_term(&orig_termios);
signal(SIGTTOU, SIG_IGN);
@@ -779,12 +760,11 @@ static void run_bbcmd(bb_t *bb, const char *cmd)
try_free_entry(e);
// Move to dir and reselect
populate_files(bb, pbuf);
- e = load_entry(bb, lastslash+1);
+ e = load_entry(bb, lastslash + 1);
if (!e) {
- flash_warn(bb, "Could not find file again: \"%s\"", lastslash+1);
+ flash_warn(bb, "Could not find file again: \"%s\"", lastslash + 1);
}
- if (IS_VIEWED(e))
- set_cursor(bb, e->index);
+ if (IS_VIEWED(e)) set_cursor(bb, e->index);
else try_free_entry(e);
} else if (matches_cmd(cmd, "help")) { // +help
FILE *p = popen("less -rfKX >/dev/tty", "w");
@@ -797,13 +777,12 @@ static void run_bbcmd(bb_t *bb, const char *cmd)
sort_files(bb);
} else if (matches_cmd(cmd, "move:")) { // +move:
int oldcur, isdelta, n;
- move:
+ move:
if (bb->nfiles == 0) return;
oldcur = bb->cursor;
isdelta = value[0] == '-' || value[0] == '+';
- n = (int)strtol(value, (char**)&value, 10);
- if (*value == '%')
- n = (n * (value[1] == 'n' ? bb->nfiles : winsize.ws_row)) / 100;
+ n = (int)strtol(value, (char **)&value, 10);
+ if (*value == '%') n = (n * (value[1] == 'n' ? bb->nfiles : winsize.ws_row)) / 100;
if (isdelta) set_cursor(bb, bb->cursor + n);
else set_cursor(bb, n);
if (matches_cmd(cmd, "spread:")) { // +spread:
@@ -818,13 +797,10 @@ static void run_bbcmd(bb_t *bb, const char *cmd)
} else if (matches_cmd(cmd, "scroll:")) { // +scroll:
// TODO: figure out the best version of this
int isdelta = value[0] == '+' || value[0] == '-';
- int n = (int)strtol(value, (char**)&value, 10);
- if (*value == '%')
- n = (n * (value[1] == 'n' ? bb->nfiles : winsize.ws_row)) / 100;
- if (isdelta)
- set_scroll(bb, bb->scroll + n);
- else
- set_scroll(bb, n);
+ int n = (int)strtol(value, (char **)&value, 10);
+ if (*value == '%') n = (n * (value[1] == 'n' ? bb->nfiles : winsize.ws_row)) / 100;
+ if (isdelta) set_scroll(bb, bb->scroll + n);
+ else set_scroll(bb, n);
} else if (matches_cmd(cmd, "select")) { // +select
for (int i = 0; i < bb->nfiles; i++)
set_selected(bb, bb->files[i], 1);
@@ -852,8 +828,7 @@ static void run_bbcmd(bb_t *bb, const char *cmd)
//
// Close the /dev/tty terminals and restore some of the attributes.
//
-static void restore_term(const struct termios *term)
-{
+static void restore_term(const struct termios *term) {
tcsetattr(fileno(tty_out), TCSANOW, term);
fputs(T_LEAVE_BBMODE_PARTIAL, tty_out);
fflush(tty_out);
@@ -864,19 +839,18 @@ static void restore_term(const struct termios *term)
// the script (or pass the cursor file if none are selected).
// Return the exit status of the script.
//
-static int run_script(bb_t *bb, const char *cmd)
-{
- proc_t *proc = new(proc_t);
+static int run_script(bb_t *bb, const char *cmd) {
+ proc_t *proc = new (proc_t);
signal(SIGTTOU, SIG_IGN);
if ((proc->pid = nonnegative(fork())) == 0) {
pid_t pgrp = getpid();
(void)setpgid(0, pgrp);
nonnegative(tcsetpgrp(STDIN_FILENO, pgrp));
- const char **args = new(char*[4 + (size_t)bb->nselected + 1]);
+ const char **args = new (char * [4 + (size_t)bb->nselected + 1]);
int i = 0;
args[i++] = "sh";
args[i++] = "-c";
- args[i++] = (char*)cmd;
+ args[i++] = (char *)cmd;
args[i++] = "--"; // ensure files like "-i" are not interpreted as flags for sh
// bb->selected is in most-recent order, so populate args in reverse to make sure
// that $1 is the first selected, etc.
@@ -889,7 +863,7 @@ static int run_script(bb_t *bb, const char *cmd)
dup2(fileno(tty_out), STDOUT_FILENO);
dup2(fileno(tty_out), STDERR_FILENO);
dup2(fileno(tty_in), STDIN_FILENO);
- execvp(args[0], (char**)args);
+ execvp(args[0], (char **)args);
err(EXIT_FAILURE, "Failed to execute command: '%s'", cmd);
return -1;
}
@@ -904,8 +878,7 @@ static int run_script(bb_t *bb, const char *cmd)
//
// Set the columns displayed by bb.
//
-static void set_columns(bb_t *bb, const char *cols)
-{
+static void set_columns(bb_t *bb, const char *cols) {
strncpy(bb->columns, cols, MAX_COLS);
setenv("BBCOLUMNS", bb->columns, 1);
}
@@ -913,8 +886,7 @@ static void set_columns(bb_t *bb, const char *cols)
//
// Set bb's file cursor to the given index (and adjust the scroll as necessary)
//
-static void set_cursor(bb_t *bb, int newcur)
-{
+static void set_cursor(bb_t *bb, int newcur) {
int oldcur = bb->cursor;
if (newcur > bb->nfiles - 1) newcur = bb->nfiles - 1;
if (newcur < 0) newcur = 0;
@@ -925,36 +897,30 @@ static void set_cursor(bb_t *bb, int newcur)
}
if (oldcur < bb->cursor) {
- if (bb->scroll > bb->cursor)
- bb->scroll = MAX(0, bb->cursor);
+ if (bb->scroll > bb->cursor) bb->scroll = MAX(0, bb->cursor);
else if (bb->scroll < bb->cursor - ONSCREEN + 1 + SCROLLOFF)
- bb->scroll = MIN(bb->nfiles - 1 - ONSCREEN + 1,
- bb->scroll + (newcur - oldcur));
+ bb->scroll = MIN(bb->nfiles - 1 - ONSCREEN + 1, bb->scroll + (newcur - oldcur));
} else {
if (bb->scroll > bb->cursor - SCROLLOFF)
- bb->scroll = MAX(0, bb->scroll + (newcur - oldcur));//bb->cursor - SCROLLOFF);
+ bb->scroll = MAX(0, bb->scroll + (newcur - oldcur)); // bb->cursor - SCROLLOFF);
else if (bb->scroll < bb->cursor - ONSCREEN + 1)
- bb->scroll = MIN(bb->cursor - ONSCREEN + 1,
- bb->nfiles - 1 - ONSCREEN + 1);
+ bb->scroll = MIN(bb->cursor - ONSCREEN + 1, bb->nfiles - 1 - ONSCREEN + 1);
}
}
//
// Set the glob pattern(s) used by bb. Patterns are ' ' delimited
//
-static void set_globs(bb_t *bb, const char *globs)
-{
- delete(&bb->globpats);
+static void set_globs(bb_t *bb, const char *globs) {
+ delete (&bb->globpats);
bb->globpats = check_strdup(globs);
setenv("BBGLOB", bb->globpats, 1);
}
-
//
// Set whether or not bb should interleave directories and files.
//
-static void set_interleave(bb_t *bb, int interleave)
-{
+static void set_interleave(bb_t *bb, int interleave) {
bb->interleave_dirs = interleave;
if (interleave) setenv("BBINTERLEAVE", "interleave", 1);
else unsetenv("BBINTERLEAVE");
@@ -964,14 +930,12 @@ static void set_interleave(bb_t *bb, int interleave)
//
// Set bb's scroll to the given index (and adjust the cursor as necessary)
//
-static void set_scroll(bb_t *bb, int newscroll)
-{
+static void set_scroll(bb_t *bb, int newscroll) {
int delta = newscroll - bb->scroll;
if (bb->nfiles <= ONSCREEN) {
newscroll = 0;
} else {
- if (newscroll > bb->nfiles - 1 - ONSCREEN + 1)
- newscroll = bb->nfiles - 1 - ONSCREEN + 1;
+ if (newscroll > bb->nfiles - 1 - ONSCREEN + 1) newscroll = bb->nfiles - 1 - ONSCREEN + 1;
if (newscroll < 0) newscroll = 0;
}
@@ -984,12 +948,10 @@ static void set_scroll(bb_t *bb, int newscroll)
//
// Select or deselect a file.
//
-static void set_selected(bb_t *bb, entry_t *e, int selected)
-{
+static void set_selected(bb_t *bb, entry_t *e, int selected) {
if (IS_SELECTED(e) == selected) return;
- if (bb->nfiles > 0 && e != bb->files[bb->cursor])
- bb->dirty = 1;
+ if (bb->nfiles > 0 && e != bb->files[bb->cursor]) bb->dirty = 1;
if (selected) {
LL_PREPEND(bb->selected, e, selected);
@@ -1004,21 +966,18 @@ static void set_selected(bb_t *bb, entry_t *e, int selected)
//
// Set the sorting method used by bb to display files.
//
-static void set_sort(bb_t *bb, const char *sort)
-{
- char sortbuf[MAX_SORT+1];
+static void set_sort(bb_t *bb, const char *sort) {
+ char sortbuf[MAX_SORT + 1];
strncpy(sortbuf, sort, MAX_SORT);
for (char *s = sortbuf; s[0] && s[1]; s += 2) {
char *found = strchr(bb->sort, s[1]);
if (found) {
- if (*s == '~')
- *s = found[-1] == '+' && found == &bb->sort[1] ? '-' : '+';
- memmove(found-1, found+1, strlen(found+1)+1);
- } else if (*s == '~')
- *s = '+';
+ if (*s == '~') *s = found[-1] == '+' && found == &bb->sort[1] ? '-' : '+';
+ memmove(found - 1, found + 1, strlen(found + 1) + 1);
+ } else if (*s == '~') *s = '+';
}
size_t len = MIN(MAX_SORT, strlen(sort));
- memmove(bb->sort + len, bb->sort, MAX_SORT+1 - len);
+ memmove(bb->sort + len, bb->sort, MAX_SORT + 1 - len);
memmove(bb->sort, sortbuf, len);
setenv("BBSORT", bb->sort, 1);
}
@@ -1026,33 +985,29 @@ static void set_sort(bb_t *bb, const char *sort)
//
// Set the xwindow title property to: bb - current path
//
-static void set_title(bb_t *bb)
-{
+static void set_title(bb_t *bb) {
char *home = getenv("HOME");
if (home && strncmp(bb->path, home, strlen(home)) == 0)
- fprintf(tty_out, "\033]2;"BB_NAME": ~%s\007", bb->path + strlen(home));
- else
- fprintf(tty_out, "\033]2;"BB_NAME": %s\007", bb->path);
+ fprintf(tty_out, "\033]2;" BB_NAME ": ~%s\007", bb->path + strlen(home));
+ else fprintf(tty_out, "\033]2;" BB_NAME ": %s\007", bb->path);
}
//
// If the given entry is not viewed or selected, remove it from the
// hash, free it, and return 1.
//
-static int try_free_entry(entry_t *e)
-{
+static int try_free_entry(entry_t *e) {
if (IS_SELECTED(e) || IS_VIEWED(e) || !IS_LOADED(e)) return 0;
LL_REMOVE(e, hash);
- delete(&e);
+ delete (&e);
return 1;
}
//
// Sort the files in bb according to bb's settings.
//
-static void sort_files(bb_t *bb)
-{
- qsort(bb->files, (size_t)bb->nfiles, sizeof(entry_t*), compare_files);
+static void sort_files(bb_t *bb) {
+ qsort(bb->files, (size_t)bb->nfiles, sizeof(entry_t *), compare_files);
for (int i = 0; i < bb->nfiles; i++)
bb->files[i]->index = i;
bb->dirty = 1;
@@ -1062,12 +1017,12 @@ static void sort_files(bb_t *bb)
// Trim trailing whitespace by inserting '\0' and return a pointer to after the
// first non-whitespace char
//
-static char *trim(char *s)
-{
+static char *trim(char *s) {
if (!s) return NULL;
- while (*s == ' ' || *s == '\n') ++s;
+ while (*s == ' ' || *s == '\n')
+ ++s;
char *end;
- for (end = &s[strlen(s)-1]; end >= s && (*end == ' ' || *end == '\n'); end--)
+ for (end = &s[strlen(s) - 1]; end >= s && (*end == ' ' || *end == '\n'); end--)
*end = '\0';
return s;
}
@@ -1075,8 +1030,7 @@ static char *trim(char *s)
//
// Hanlder for SIGWINCH events
//
-static void update_term_size(int sig)
-{
+static void update_term_size(int sig) {
(void)sig;
ioctl(STDIN_FILENO, TIOCGWINSZ, &winsize);
}
@@ -1084,43 +1038,38 @@ static void update_term_size(int sig)
//
// Wait for a process to either suspend or exit and return the status.
//
-static int wait_for_process(proc_t **proc)
-{
+static int wait_for_process(proc_t **proc) {
tcsetpgrp(fileno(tty_out), (*proc)->pid);
int status;
while (*proc) {
- if (waitpid((*proc)->pid, &status, WUNTRACED) < 0)
- continue;
+ if (waitpid((*proc)->pid, &status, WUNTRACED) < 0) continue;
if (WIFEXITED(status) || WIFSIGNALED(status)) {
LL_REMOVE((*proc), running);
- delete(proc);
- } else if (WIFSTOPPED(status))
- break;
+ delete (proc);
+ } else if (WIFSTOPPED(status)) break;
}
nonnegative(tcsetpgrp(fileno(tty_out), getpid()));
signal(SIGTTOU, SIG_DFL);
return status;
}
-int main(int argc, char *argv[])
-{
+int main(int argc, char *argv[]) {
char sep = '\n';
int print_dir = 0, print_selection = 0;
for (int i = 1; i < argc; i++) {
// Commands are processed below, after flags have been parsed
if (argv[i][0] == '+') {
char *colon = strchr(argv[i], ':');
- if (colon && !colon[1])
- break;
+ if (colon && !colon[1]) break;
} else if (streq(argv[i], "--")) {
break;
} else if (streq(argv[i], "--help")) {
- help:
+ help:
printf("%s%s", description_str, usage_str);
return 0;
} else if (streq(argv[i], "--version")) {
- version:
- printf(BB_NAME" "BB_VERSION"\n");
+ version:
+ printf(BB_NAME " " BB_VERSION "\n");
return 0;
} else if (argv[i][0] == '-' && argv[i][1] != '-') {
for (char *c = &argv[i][1]; *c; c++) {
@@ -1130,11 +1079,10 @@ int main(int argc, char *argv[])
case 'd': print_dir = 1; break;
case '0': sep = '\0'; break;
case 's': print_selection = 1; break;
- default: printf("Unknown command line argument: -%c\n%s", *c, usage_str);
- return 1;
+ default: printf("Unknown command line argument: -%c\n%s", *c, usage_str); return 1;
}
}
- } else if (i < argc-1) {
+ } else if (i < argc - 1) {
printf("Unknown command line argument: \"%s\"\n%s", argv[i], usage_str);
return 1;
}
@@ -1150,10 +1098,9 @@ int main(int argc, char *argv[])
// Set up environment variables
// Default values
setenv("TMPDIR", "/tmp", 0);
- sprintf(cmdfilename, "%s/"BB_NAME".cmd.XXXXXX", getenv("TMPDIR"));
- int cmdfd = nonnegative(
- mkostemp(cmdfilename, O_APPEND),
- "Couldn't create "BB_NAME" command file: '%s'", cmdfilename);
+ sprintf(cmdfilename, "%s/" BB_NAME ".cmd.XXXXXX", getenv("TMPDIR"));
+ int cmdfd =
+ nonnegative(mkostemp(cmdfilename, O_APPEND), "Couldn't create " BB_NAME " command file: '%s'", cmdfilename);
close(cmdfd);
setenv("BBCMD", cmdfilename, 1);
char xdg_config_home[PATH_MAX], xdg_data_home[PATH_MAX];
@@ -1174,15 +1121,13 @@ int main(int argc, char *argv[])
setenv("BBPATH", bbpath, 1);
}
if (getenv("BBPATH")) {
- nonnegative(
- asprintf(&newpath, "%s/"BB_NAME":%s/scripts:%s",
- getenv("XDG_CONFIG_HOME"), getenv("BBPATH"), getenv("PATH")),
- "Could not allocate memory for PATH");
+ nonnegative(asprintf(&newpath, "%s/" BB_NAME ":%s/scripts:%s", getenv("XDG_CONFIG_HOME"), getenv("BBPATH"),
+ getenv("PATH")),
+ "Could not allocate memory for PATH");
} else {
- nonnegative(
- asprintf(&newpath, "%s/"BB_NAME":%s/"BB_NAME":%s",
- getenv("XDG_CONFIG_HOME"), getenv("sysconfdir"), getenv("PATH")),
- "Could not allocate memory for PATH");
+ nonnegative(asprintf(&newpath, "%s/" BB_NAME ":%s/" BB_NAME ":%s", getenv("XDG_CONFIG_HOME"),
+ getenv("sysconfdir"), getenv("PATH")),
+ "Could not allocate memory for PATH");
}
setenv("PATH", newpath, 1);
@@ -1196,8 +1141,8 @@ int main(int argc, char *argv[])
atexit(cleanup);
- FOREACH(outbuf_t*, ob, output_buffers) {
- sprintf(ob->filename, "%s/"BB_NAME".%s.XXXXXX", getenv("TMPDIR"), ob->name);
+ FOREACH(outbuf_t *, ob, output_buffers) {
+ sprintf(ob->filename, "%s/" BB_NAME ".%s.XXXXXX", getenv("TMPDIR"), ob->name);
ob->tmp_fd = nonnegative(mkostemp(ob->filename, O_RDWR), "Couldn't create error file");
ob->dup_fd = nonnegative(dup(ob->orig_fd));
nonnegative(dup2(ob->tmp_fd, ob->orig_fd), "Couldn't redirect error output");
@@ -1234,17 +1179,16 @@ int main(int argc, char *argv[])
}
}
- if (print_dir)
- printf("%s\n", bb.path);
+ if (print_dir) printf("%s\n", bb.path);
// Cleanup:
populate_files(&bb, NULL);
while (bb.selected)
set_selected(&bb, bb.selected, 0);
- delete(&bb.globpats);
+ delete (&bb.globpats);
for (bb_history_t *next; bb.history; bb.history = next) {
next = bb.history->next;
- delete(&bb.history);
+ delete (&bb.history);
}
return 0;
}
diff --git a/draw.c b/draw.c
index 806198d..7fd1f90 100644
--- a/draw.c
+++ b/draw.c
@@ -16,37 +16,31 @@
#include "utils.h"
column_t column_info[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},
+ ['*'] = {.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},
};
//
// Left-pad a string with spaces.
//
-static void lpad(char *buf, int width)
-{
+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] = ' ';
+ while (pad > 0)
+ buf[--pad] = ' ';
}
}
//
// Append a string to an existing string, but with escape sequences made explicit.
//
-static char* stpcpy_escaped(char *buf, const char *str, const char *color)
-{
+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.
@@ -66,8 +60,7 @@ static char* stpcpy_escaped(char *buf, const char *str, const char *color)
// The color argument is what color to put back after the red.
// Returns the number of bytes that were escaped.
//
-static int fputs_escaped(FILE *f, const char *str, const char *color)
-{
+static int fputs_escaped(FILE *f, const char *str, const char *color) {
static const char *escapes = " abtnvfr e";
int escaped = 0;
for (const char *c = str; *c; ++c) {
@@ -87,8 +80,7 @@ static int fputs_escaped(FILE *f, const char *str, const char *color)
//
// Return a human-readable string representing how long ago a time was.
//
-static void timeago(char *buf, time_t t)
-{
+static void timeago(char *buf, time_t t) {
const int SECOND = 1;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
@@ -99,30 +91,18 @@ static void timeago(char *buf, time_t t)
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);
+ 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);
}
void col_mreltime(entry_t *entry, const char *color, char *buf, int width) {
@@ -165,32 +145,31 @@ 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)color; (void)width;
+ (void)color;
+ (void)width;
sprintf(buf, " %03o", entry->info.st_mode & 0777);
}
-void col_random(entry_t *entry, const char *color, char *buf, int width)
-{
+void col_random(entry_t *entry, const char *color, char *buf, int width) {
(void)color;
sprintf(buf, "%*d", width, entry->shufflepos);
}
-void col_size(entry_t *entry, const char *color, char *buf, int width)
-{
- (void)color; (void)width;
+void col_size(entry_t *entry, const char *color, char *buf, int width) {
+ (void)color;
+ (void)width;
int mag = 0;
- const char* units = "BKMGTPEZY";
+ const char *units = "BKMGTPEZY";
double bytes = (double)entry->info.st_size;
- while (bytes > 1024 && units[mag+1]) {
+ while (bytes > 1024 && units[mag + 1]) {
bytes /= 1024;
mag++;
}
// Add 1 extra digit of precision if it would be nonzero:
- sprintf(buf, "%5.*f%c ", ((int)(bytes*10.0 + 0.5)%10 >= 1) ? 1 : 0, bytes, units[mag]);
+ sprintf(buf, "%5.*f%c ", ((int)(bytes * 10.0 + 0.5) % 10 >= 1) ? 1 : 0, bytes, units[mag]);
}
-void col_name(entry_t *entry, const char *color, char *buf, int width)
-{
+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);
@@ -204,8 +183,7 @@ void col_name(entry_t *entry, const char *color, char *buf, int width)
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, "/");
+ if (S_ISDIR(entry->linkedmode)) buf = stpcpy(buf, "/");
buf = stpcpy(buf, "\033[22;23m");
}
@@ -213,8 +191,7 @@ void col_name(entry_t *entry, const char *color, char *buf, int width)
//
// Calculate the column widths.
//
-int *get_column_widths(char columns[], int width)
-{
+int *get_column_widths(char columns[], int width) {
// TODO: maybe memoize
static int colwidths[16] = {0};
int space = width, nstretchy = 0;
@@ -230,16 +207,14 @@ int *get_column_widths(char columns[], int width)
if (c > 0) --space;
}
for (int c = 0; columns[c]; c++)
- if (column_info[(int)columns[c]].stretchy)
- colwidths[c] = space / nstretchy;
+ if (column_info[(int)columns[c]].stretchy) colwidths[c] = space / nstretchy;
return colwidths;
}
//
// Draw the column header labels.
//
-void draw_column_labels(FILE *out, char columns[], char *sort, int width)
-{
+void draw_column_labels(FILE *out, char columns[], char *sort, int width) {
int *colwidths = get_column_widths(columns, width);
fputs("\033[0;44;30m\033[K", out);
int x = 0;
@@ -253,8 +228,7 @@ void draw_column_labels(FILE *out, char columns[], char *sort, int width)
x += 1;
}
const char *indicator = " ";
- if (columns[c] == sort[1])
- indicator = sort[0] == '-' ? RSORT_INDICATOR : SORT_INDICATOR;
+ if (columns[c] == sort[1]) indicator = sort[0] == '-' ? RSORT_INDICATOR : SORT_INDICATOR;
move_cursor_col(out, x);
fputs(indicator, out);
if (title) fputs(title, out);
@@ -266,8 +240,7 @@ void draw_column_labels(FILE *out, char columns[], char *sort, int width)
//
// Draw a row (one file).
//
-void draw_row(FILE *out, char columns[], entry_t *entry, const char *color, int width)
-{
+void draw_row(FILE *out, char columns[], entry_t *entry, const char *color, int width) {
int *colwidths = get_column_widths(columns, width);
fputs(color, out);
int x = 0;
@@ -292,14 +265,13 @@ void draw_row(FILE *out, char columns[], entry_t *entry, const char *color, int
// If `bb->dirty` is false, then use terminal scrolling to move the file
// listing around and only update the files that have changed.
//
-void render(FILE *out, bb_t *bb)
-{
+void render(FILE *out, bb_t *bb) {
static int lastcursor = -1, lastscroll = -1;
static struct winsize oldsize = {0};
struct winsize winsize;
ioctl(STDIN_FILENO, TIOCGWINSZ, &winsize);
- int onscreen = winsize.ws_row - 3;
+ int onscreen = winsize.ws_row - 3;
bb->dirty |= (winsize.ws_row != oldsize.ws_row) || (winsize.ws_col != oldsize.ws_col);
oldsize = winsize;
@@ -307,9 +279,9 @@ void render(FILE *out, bb_t *bb)
if (!bb->dirty) {
// Use terminal scrolling:
if (lastscroll > bb->scroll) {
- fprintf(out, "\033[3;%dr\033[%dT\033[1;%dr", winsize.ws_row-1, lastscroll - bb->scroll, winsize.ws_row);
+ fprintf(out, "\033[3;%dr\033[%dT\033[1;%dr", winsize.ws_row - 1, lastscroll - bb->scroll, winsize.ws_row);
} else if (lastscroll < bb->scroll) {
- fprintf(out, "\033[3;%dr\033[%dS\033[1;%dr", winsize.ws_row-1, bb->scroll - lastscroll, winsize.ws_row);
+ fprintf(out, "\033[3;%dr\033[%dS\033[1;%dr", winsize.ws_row - 1, bb->scroll - lastscroll, winsize.ws_row);
}
}
@@ -337,7 +309,7 @@ void render(FILE *out, bb_t *bb)
// Columns
move_cursor(out, 0, 1);
fputs("\033[0;44;30m\033[K", out);
- draw_column_labels(out, bb->columns, bb->sort, winsize.ws_col-1);
+ draw_column_labels(out, bb->columns, bb->sort, winsize.ws_col - 1);
}
if (bb->nfiles == 0) {
@@ -346,8 +318,7 @@ void render(FILE *out, bb_t *bb)
} else {
entry_t **files = bb->files;
for (int i = bb->scroll; i < bb->scroll + onscreen && i < bb->nfiles; i++) {
- if (!(bb->dirty || i == bb->cursor || i == lastcursor ||
- i < lastscroll || i >= lastscroll + onscreen)) {
+ if (!(bb->dirty || i == bb->cursor || i == lastcursor || i < lastscroll || i >= lastscroll + onscreen)) {
continue;
}
@@ -356,12 +327,11 @@ void render(FILE *out, bb_t *bb)
if (i == bb->cursor) color = CURSOR_COLOR;
else if (S_ISDIR(entry->info.st_mode)) color = DIR_COLOR;
else if (S_ISLNK(entry->info.st_mode)) color = LINK_COLOR;
- else if (entry->info.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
- color = EXECUTABLE_COLOR;
+ else if (entry->info.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) color = EXECUTABLE_COLOR;
int x = 0, y = i - bb->scroll + 2;
move_cursor(out, x, y);
- draw_row(out, bb->columns, entry, color, winsize.ws_col-1);
+ draw_row(out, bb->columns, entry, color, winsize.ws_col - 1);
}
move_cursor(out, 0, MIN(bb->nfiles - bb->scroll, onscreen) + 2);
fputs("\033[J", out);
@@ -369,36 +339,39 @@ void render(FILE *out, bb_t *bb)
// Scrollbar:
if (bb->nfiles > onscreen) {
- int height = (onscreen*onscreen + (bb->nfiles-1))/bb->nfiles;
- int start = 2 + (bb->scroll*onscreen)/bb->nfiles;
+ int height = (onscreen * onscreen + (bb->nfiles - 1)) / bb->nfiles;
+ int start = 2 + (bb->scroll * onscreen) / bb->nfiles;
for (int i = 2; i < 2 + onscreen; i++) {
- move_cursor(out, winsize.ws_col-1, i);
- fprintf(out, "%s\033[0m",
- (i >= start && i < start + height) ? SCROLLBAR_FG : SCROLLBAR_BG);
+ move_cursor(out, winsize.ws_col - 1, i);
+ fprintf(out, "%s\033[0m", (i >= start && i < start + height) ? SCROLLBAR_FG : SCROLLBAR_BG);
}
}
// Bottom Line:
- move_cursor(out, winsize.ws_col/2, winsize.ws_row - 1);
+ move_cursor(out, winsize.ws_col / 2, winsize.ws_row - 1);
fputs("\033[0m\033[K", out);
int x = winsize.ws_col;
if (bb->selected) { // Number of selected files
int n = 0;
- for (entry_t *s = bb->selected; s; s = s->selected.next) ++n;
+ for (entry_t *s = bb->selected; s; s = s->selected.next)
+ ++n;
x -= 14;
- for (int k = n; k; k /= 10) x--;
+ for (int k = n; k; k /= 10)
+ x--;
move_cursor(out, MAX(0, x), winsize.ws_row - 1);
fprintf(out, "\033[41;30m %d Selected \033[0m", n);
}
int nprocs = 0;
- for (proc_t *p = bb->running_procs; p; p = p->running.next) ++nprocs;
+ for (proc_t *p = bb->running_procs; p; p = p->running.next)
+ ++nprocs;
if (nprocs > 0) { // Number of suspended processes
x -= 13;
- for (int k = nprocs; k; k /= 10) x--;
+ for (int k = nprocs; k; k /= 10)
+ x--;
move_cursor(out, MAX(0, x), winsize.ws_row - 1);
fprintf(out, "\033[44;30m %d Suspended \033[0m", nprocs);
}
- move_cursor(out, winsize.ws_col/2, winsize.ws_row - 1);
+ move_cursor(out, winsize.ws_col / 2, winsize.ws_row - 1);
lastcursor = bb->cursor;
lastscroll = bb->scroll;
diff --git a/draw.h b/draw.h
index 692a601..ec32ac0 100644
--- a/draw.h
+++ b/draw.h
@@ -14,11 +14,11 @@
#include "types.h"
// Colors (using ANSI escape sequences):
-#define TITLE_COLOR "\033[37;1m"
-#define NORMAL_COLOR "\033[37m"
-#define CURSOR_COLOR "\033[43;30;1m"
-#define LINK_COLOR "\033[35m"
-#define DIR_COLOR "\033[34m"
+#define TITLE_COLOR "\033[37;1m"
+#define NORMAL_COLOR "\033[37m"
+#define CURSOR_COLOR "\033[43;30;1m"
+#define LINK_COLOR "\033[35m"
+#define DIR_COLOR "\033[34m"
#define EXECUTABLE_COLOR "\033[31m"
#define SCROLLBAR_FG "\033[48;5;247m "
#define SCROLLBAR_BG "\033[48;5;239m "
@@ -26,12 +26,12 @@
#define TIME_FMT " %T %D "
#define SELECTED_INDICATOR " \033[31;7m \033[0m"
#define NOT_SELECTED_INDICATOR " "
-#define SORT_INDICATOR "↓"
+#define SORT_INDICATOR "↓"
#define RSORT_INDICATOR "↑"
typedef struct {
const char *name;
- void (*render)(entry_t*, const char*, char*, int);
+ void (*render)(entry_t *, const char *, char *, int);
unsigned int stretchy : 1;
} column_t;
diff --git a/terminal.c b/terminal.c
index 8f5e72f..ee2942c 100644
--- a/terminal.c
+++ b/terminal.c
@@ -20,54 +20,112 @@ typedef struct {
} keyname_t;
static keyname_t key_names[] = {
- {KEY_SPACE, "Space"}, {KEY_BACKSPACE2, "Backspace"},
- {KEY_F1, "F1"}, {KEY_F2, "F2"}, {KEY_F3, "F3"}, {KEY_F4, "F4"}, {KEY_F5, "F5"},
- {KEY_F6, "F6"}, {KEY_F7, "F7"}, {KEY_F8, "F8"}, {KEY_F9, "F9"}, {KEY_F10, "F10"},
- {KEY_F11, "F11"}, {KEY_F12, "F12"},
- {KEY_INSERT, "Insert"}, {KEY_DELETE, "Delete"},
- {KEY_HOME, "Home"}, {KEY_END, "End"},
- {KEY_PGUP, "PgUp"}, {KEY_PGUP, "Page Up"},
- {KEY_PGDN, "PgDn"}, {KEY_PGDN, "Page Down"},
- {KEY_ARROW_UP, "Up"}, {KEY_ARROW_DOWN, "Down"}, {KEY_ARROW_LEFT, "Left"}, {KEY_ARROW_RIGHT, "Right"},
- {MOUSE_LEFT_PRESS, "Left press"}, {MOUSE_RIGHT_PRESS, "Right press"}, {MOUSE_MIDDLE_PRESS, "Middle press"},
- {MOUSE_LEFT_DRAG, "Left drag"}, {MOUSE_RIGHT_DRAG, "Right drag"}, {MOUSE_MIDDLE_DRAG, "Middle drag"},
- {MOUSE_LEFT_RELEASE, "Left click"}, {MOUSE_RIGHT_RELEASE, "Right click"}, {MOUSE_MIDDLE_RELEASE, "Middle click"},
- {MOUSE_LEFT_RELEASE, "Left up"}, {MOUSE_RIGHT_RELEASE, "Right up"}, {MOUSE_MIDDLE_RELEASE, "Middle up"},
- {MOUSE_LEFT_RELEASE, "Left release"}, {MOUSE_RIGHT_RELEASE, "Right release"}, {MOUSE_MIDDLE_RELEASE, "Middle release"},
- {MOUSE_LEFT_DOUBLE, "Double left click"}, {MOUSE_RIGHT_DOUBLE, "Double right click"}, {MOUSE_MIDDLE_DOUBLE, "Double middle click"},
- {MOUSE_WHEEL_RELEASE, "Mouse wheel up"}, {MOUSE_WHEEL_PRESS, "Mouse wheel down"},
- {KEY_TAB, "Tab"}, {KEY_ENTER, "Enter"}, {KEY_ENTER, "Return"},
- {KEY_CTRL_A, "Ctrl-a"}, {KEY_CTRL_B, "Ctrl-b"}, {KEY_CTRL_C, "Ctrl-c"},
- {KEY_CTRL_D, "Ctrl-d"}, {KEY_CTRL_E, "Ctrl-e"}, {KEY_CTRL_F, "Ctrl-f"},
- {KEY_CTRL_G, "Ctrl-g"}, {KEY_CTRL_H, "Ctrl-h"}, {KEY_CTRL_I, "Ctrl-i"},
- {KEY_CTRL_J, "Ctrl-j"}, {KEY_CTRL_K, "Ctrl-k"}, {KEY_CTRL_L, "Ctrl-l"},
- {KEY_CTRL_M, "Ctrl-m"}, {KEY_CTRL_N, "Ctrl-n"}, {KEY_CTRL_O, "Ctrl-o"},
- {KEY_CTRL_P, "Ctrl-p"}, {KEY_CTRL_Q, "Ctrl-q"}, {KEY_CTRL_R, "Ctrl-r"},
- {KEY_CTRL_S, "Ctrl-s"}, {KEY_CTRL_T, "Ctrl-t"}, {KEY_CTRL_U, "Ctrl-u"},
- {KEY_CTRL_V, "Ctrl-v"}, {KEY_CTRL_W, "Ctrl-w"}, {KEY_CTRL_X, "Ctrl-x"},
- {KEY_CTRL_Y, "Ctrl-y"}, {KEY_CTRL_Z, "Ctrl-z"},
- {KEY_ESC, "Esc"}, {KEY_ESC, "Escape"},
- {KEY_CTRL_TILDE, "Ctrl-~"}, {KEY_CTRL_BACKSLASH, "Ctrl-\\"},
- {KEY_CTRL_LSQ_BRACKET, "Ctrl-]"}, {KEY_CTRL_RSQ_BRACKET, "Ctrl-]"},
- {KEY_CTRL_UNDERSCORE, "Ctrl-_"}, {KEY_CTRL_SLASH, "Ctrl-/"},
- {KEY_CTRL_AT, "Ctrl-@"}, {KEY_CTRL_CARET, "Ctrl-^"},
+ {KEY_SPACE, "Space"},
+ {KEY_BACKSPACE2, "Backspace"},
+ {KEY_F1, "F1"},
+ {KEY_F2, "F2"},
+ {KEY_F3, "F3"},
+ {KEY_F4, "F4"},
+ {KEY_F5, "F5"},
+ {KEY_F6, "F6"},
+ {KEY_F7, "F7"},
+ {KEY_F8, "F8"},
+ {KEY_F9, "F9"},
+ {KEY_F10, "F10"},
+ {KEY_F11, "F11"},
+ {KEY_F12, "F12"},
+ {KEY_INSERT, "Insert"},
+ {KEY_DELETE, "Delete"},
+ {KEY_HOME, "Home"},
+ {KEY_END, "End"},
+ {KEY_PGUP, "PgUp"},
+ {KEY_PGUP, "Page Up"},
+ {KEY_PGDN, "PgDn"},
+ {KEY_PGDN, "Page Down"},
+ {KEY_ARROW_UP, "Up"},
+ {KEY_ARROW_DOWN, "Down"},
+ {KEY_ARROW_LEFT, "Left"},
+ {KEY_ARROW_RIGHT, "Right"},
+ {MOUSE_LEFT_PRESS, "Left press"},
+ {MOUSE_RIGHT_PRESS, "Right press"},
+ {MOUSE_MIDDLE_PRESS, "Middle press"},
+ {MOUSE_LEFT_DRAG, "Left drag"},
+ {MOUSE_RIGHT_DRAG, "Right drag"},
+ {MOUSE_MIDDLE_DRAG, "Middle drag"},
+ {MOUSE_LEFT_RELEASE, "Left click"},
+ {MOUSE_RIGHT_RELEASE, "Right click"},
+ {MOUSE_MIDDLE_RELEASE, "Middle click"},
+ {MOUSE_LEFT_RELEASE, "Left up"},
+ {MOUSE_RIGHT_RELEASE, "Right up"},
+ {MOUSE_MIDDLE_RELEASE, "Middle up"},
+ {MOUSE_LEFT_RELEASE, "Left release"},
+ {MOUSE_RIGHT_RELEASE, "Right release"},
+ {MOUSE_MIDDLE_RELEASE, "Middle release"},
+ {MOUSE_LEFT_DOUBLE, "Double left click"},
+ {MOUSE_RIGHT_DOUBLE, "Double right click"},
+ {MOUSE_MIDDLE_DOUBLE, "Double middle click"},
+ {MOUSE_WHEEL_RELEASE, "Mouse wheel up"},
+ {MOUSE_WHEEL_PRESS, "Mouse wheel down"},
+ {KEY_TAB, "Tab"},
+ {KEY_ENTER, "Enter"},
+ {KEY_ENTER, "Return"},
+ {KEY_CTRL_A, "Ctrl-a"},
+ {KEY_CTRL_B, "Ctrl-b"},
+ {KEY_CTRL_C, "Ctrl-c"},
+ {KEY_CTRL_D, "Ctrl-d"},
+ {KEY_CTRL_E, "Ctrl-e"},
+ {KEY_CTRL_F, "Ctrl-f"},
+ {KEY_CTRL_G, "Ctrl-g"},
+ {KEY_CTRL_H, "Ctrl-h"},
+ {KEY_CTRL_I, "Ctrl-i"},
+ {KEY_CTRL_J, "Ctrl-j"},
+ {KEY_CTRL_K, "Ctrl-k"},
+ {KEY_CTRL_L, "Ctrl-l"},
+ {KEY_CTRL_M, "Ctrl-m"},
+ {KEY_CTRL_N, "Ctrl-n"},
+ {KEY_CTRL_O, "Ctrl-o"},
+ {KEY_CTRL_P, "Ctrl-p"},
+ {KEY_CTRL_Q, "Ctrl-q"},
+ {KEY_CTRL_R, "Ctrl-r"},
+ {KEY_CTRL_S, "Ctrl-s"},
+ {KEY_CTRL_T, "Ctrl-t"},
+ {KEY_CTRL_U, "Ctrl-u"},
+ {KEY_CTRL_V, "Ctrl-v"},
+ {KEY_CTRL_W, "Ctrl-w"},
+ {KEY_CTRL_X, "Ctrl-x"},
+ {KEY_CTRL_Y, "Ctrl-y"},
+ {KEY_CTRL_Z, "Ctrl-z"},
+ {KEY_ESC, "Esc"},
+ {KEY_ESC, "Escape"},
+ {KEY_CTRL_TILDE, "Ctrl-~"},
+ {KEY_CTRL_BACKSLASH, "Ctrl-\\"},
+ {KEY_CTRL_LSQ_BRACKET, "Ctrl-]"},
+ {KEY_CTRL_RSQ_BRACKET, "Ctrl-]"},
+ {KEY_CTRL_UNDERSCORE, "Ctrl-_"},
+ {KEY_CTRL_SLASH, "Ctrl-/"},
+ {KEY_CTRL_AT, "Ctrl-@"},
+ {KEY_CTRL_CARET, "Ctrl-^"},
{KEY_CTRL_BACKTICK, "Ctrl-`"},
- {KEY_CTRL_2, "Ctrl-2"}, {KEY_CTRL_3, "Ctrl-3"}, {KEY_CTRL_4, "Ctrl-4"},
- {KEY_CTRL_5, "Ctrl-5"}, {KEY_CTRL_6, "Ctrl-6"}, {KEY_CTRL_7, "Ctrl-7"},
- {KEY_CTRL_5, "Ctrl-8"}, {KEY_CTRL_6, "Ctrl-9"},
- {':', "Colon"}, {',', "Comma"},
+ {KEY_CTRL_2, "Ctrl-2"},
+ {KEY_CTRL_3, "Ctrl-3"},
+ {KEY_CTRL_4, "Ctrl-4"},
+ {KEY_CTRL_5, "Ctrl-5"},
+ {KEY_CTRL_6, "Ctrl-6"},
+ {KEY_CTRL_7, "Ctrl-7"},
+ {KEY_CTRL_5, "Ctrl-8"},
+ {KEY_CTRL_6, "Ctrl-9"},
+ {':', "Colon"},
+ {',', "Comma"},
};
-static int nextchar(int fd)
-{
+static int nextchar(int fd) {
char c;
return read(fd, &c, 1) == 1 ? c : -1;
}
-static int nextnum(int fd, int c, int *n)
-{
+static int nextnum(int fd, int c, int *n) {
for (*n = 0; '0' <= c && c <= '9'; c = nextchar(fd))
- *n = 10*(*n) + (c - '0');
+ *n = 10 * (*n) + (c - '0');
return c;
}
@@ -76,23 +134,20 @@ static int nextnum(int fd, int c, int *n)
// If mouse_x or mouse_y are non-null and a mouse event occurs, they will be
// set to the position of the mouse (0-indexed).
//
-int bgetkey(FILE *in, int *mouse_x, int *mouse_y)
-{
+int bgetkey(FILE *in, int *mouse_x, int *mouse_y) {
if (mouse_x) *mouse_x = -1;
if (mouse_y) *mouse_y = -1;
int fd = fileno(in);
int numcode = 0, modifiers = 0;
int c = nextchar(fd);
- if (c == '\x1b')
- goto escape;
+ if (c == '\x1b') goto escape;
return c;
- escape:
+escape:
c = nextchar(fd);
// Actual escape key:
- if (c < 0)
- return KEY_ESC;
+ if (c < 0) return KEY_ESC;
switch (c) {
case '\x1b': return KEY_ESC;
@@ -102,9 +157,8 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y)
default: return MOD_ALT | c;
}
- CSI_start:
- if (c == -1)
- return MOD_ALT | '[';
+CSI_start:
+ if (c == -1) return MOD_ALT | '[';
switch (c) {
case 'A': return modifiers | KEY_ARROW_UP;
@@ -162,7 +216,7 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y)
if (buttons & 8) modifiers |= MOD_META;
if (buttons & 16) modifiers |= MOD_CTRL;
int key = -1;
- switch (buttons & ~(4|8|16)) {
+ switch (buttons & ~(4 | 8 | 16)) {
case 0: key = c == 'm' ? MOUSE_LEFT_RELEASE : MOUSE_LEFT_PRESS; break;
case 1: key = c == 'm' ? MOUSE_MIDDLE_RELEASE : MOUSE_MIDDLE_PRESS; break;
case 2: key = c == 'm' ? MOUSE_RIGHT_RELEASE : MOUSE_RIGHT_PRESS; break;
@@ -179,8 +233,8 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y)
struct timespec clicktime;
clock_gettime(CLOCK_MONOTONIC, &clicktime);
if (key == lastclick) {
- double dt_ms = 1e3*(double)(clicktime.tv_sec - lastclicktime.tv_sec)
- + 1e-6*(double)(clicktime.tv_nsec - lastclicktime.tv_nsec);
+ double dt_ms = 1e3 * (double)(clicktime.tv_sec - lastclicktime.tv_sec)
+ + 1e-6 * (double)(clicktime.tv_nsec - lastclicktime.tv_nsec);
if (dt_ms < DOUBLECLICK_THRESHOLD) {
switch (key) {
case MOUSE_LEFT_RELEASE: key = MOUSE_LEFT_DOUBLE; break;
@@ -208,10 +262,10 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y)
}
return -1;
- DCS:
+DCS:
return -1;
- SS3:
+SS3:
switch (nextchar(fd)) {
case 'P': return KEY_F1;
case 'Q': return KEY_F2;
@@ -225,40 +279,37 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y)
//
// Populate `buf` with the name of a key.
//
-char *bkeyname(int key, char *buf)
-{
+char *bkeyname(int key, char *buf) {
if (key & MOD_META) buf = stpcpy(buf, "Super-");
if (key & MOD_CTRL) buf = stpcpy(buf, "Ctrl-");
if (key & MOD_ALT) buf = stpcpy(buf, "Alt-");
if (key & MOD_SHIFT) buf = stpcpy(buf, "Shift-");
key &= ~(MOD_META | MOD_CTRL | MOD_ALT | MOD_SHIFT);
- for (size_t i = 0; i < sizeof(key_names)/sizeof(key_names[0]); i++) {
+ for (size_t i = 0; i < sizeof(key_names) / sizeof(key_names[0]); i++) {
if (key_names[i].key == key) {
return stpcpy(buf, key_names[i].name);
}
}
- if (' ' < key && key <= '~')
- return buf + sprintf(buf, "%c", key);
- else
- return buf + sprintf(buf, "\\x%02X", (unsigned int)key);
+ if (' ' < key && key <= '~') return buf + sprintf(buf, "%c", key);
+ else return buf + sprintf(buf, "\\x%02X", (unsigned int)key);
}
//
// Return the key with the given name, if one exists, otherwise -1.
-// (i.e. bkeywithname("Space") == ' ', bkeywithname("x") == 'x', bkeywithname("F1") == KEY_F1, bkeywithname("???") == -1)
+// (i.e. bkeywithname("Space") == ' ', bkeywithname("x") == 'x', bkeywithname("F1") == KEY_F1, bkeywithname("???") ==
+// -1)
//
-int bkeywithname(const char *name)
-{
+int bkeywithname(const char *name) {
int modifiers = 0;
- static const struct { const char *prefix; int modifier; } modnames[] = {
- {"Super-", MOD_META}, {"Ctrl-", MOD_CTRL}, {"Alt-", MOD_ALT}, {"Shift-", MOD_SHIFT}
- };
- check_names:
- for (size_t i = 0; i < sizeof(key_names)/sizeof(key_names[0]); i++) {
- if (strcmp(key_names[i].name, name) == 0)
- return modifiers | key_names[i].key;
+ static const struct {
+ const char *prefix;
+ int modifier;
+ } modnames[] = {{"Super-", MOD_META}, {"Ctrl-", MOD_CTRL}, {"Alt-", MOD_ALT}, {"Shift-", MOD_SHIFT}};
+check_names:
+ for (size_t i = 0; i < sizeof(key_names) / sizeof(key_names[0]); i++) {
+ if (strcmp(key_names[i].name, name) == 0) return modifiers | key_names[i].key;
}
- for (size_t i = 0; i < sizeof(modnames)/sizeof(modnames[0]); i++) {
+ for (size_t i = 0; i < sizeof(modnames) / sizeof(modnames[0]); i++) {
if (strncmp(name, modnames[i].prefix, strlen(modnames[i].prefix)) == 0) {
modifiers |= modnames[i].modifier;
name += strlen(modnames[i].prefix);
diff --git a/terminal.h b/terminal.h
index 199fe30..01fd6cc 100644
--- a/terminal.h
+++ b/terminal.h
@@ -19,64 +19,118 @@
typedef enum {
// ASCII chars:
- KEY_CTRL_AT = 0x00, KEY_CTRL_A, KEY_CTRL_B, KEY_CTRL_C, KEY_CTRL_D,
- KEY_CTRL_E, KEY_CTRL_F, KEY_CTRL_G, KEY_CTRL_H, KEY_CTRL_I, KEY_CTRL_J,
- KEY_CTRL_K, KEY_CTRL_L, KEY_CTRL_M, KEY_CTRL_N, KEY_CTRL_O, KEY_CTRL_P,
- KEY_CTRL_Q, KEY_CTRL_R, KEY_CTRL_S, KEY_CTRL_T, KEY_CTRL_U, KEY_CTRL_V,
- KEY_CTRL_W, KEY_CTRL_X, KEY_CTRL_Y, KEY_CTRL_Z,
- KEY_CTRL_LSQ_BRACKET, KEY_CTRL_BACKSLASH, KEY_CTRL_RSQ_BRACKET,
- KEY_CTRL_CARET, KEY_CTRL_UNDERSCORE, KEY_SPACE,
+ KEY_CTRL_AT = 0x00,
+ KEY_CTRL_A,
+ KEY_CTRL_B,
+ KEY_CTRL_C,
+ KEY_CTRL_D,
+ KEY_CTRL_E,
+ KEY_CTRL_F,
+ KEY_CTRL_G,
+ KEY_CTRL_H,
+ KEY_CTRL_I,
+ KEY_CTRL_J,
+ KEY_CTRL_K,
+ KEY_CTRL_L,
+ KEY_CTRL_M,
+ KEY_CTRL_N,
+ KEY_CTRL_O,
+ KEY_CTRL_P,
+ KEY_CTRL_Q,
+ KEY_CTRL_R,
+ KEY_CTRL_S,
+ KEY_CTRL_T,
+ KEY_CTRL_U,
+ KEY_CTRL_V,
+ KEY_CTRL_W,
+ KEY_CTRL_X,
+ KEY_CTRL_Y,
+ KEY_CTRL_Z,
+ KEY_CTRL_LSQ_BRACKET,
+ KEY_CTRL_BACKSLASH,
+ KEY_CTRL_RSQ_BRACKET,
+ KEY_CTRL_CARET,
+ KEY_CTRL_UNDERSCORE,
+ KEY_SPACE,
// Printable chars would be here
KEY_BACKSPACE2 = 0x7F,
// Non-ascii multi-byte keys:
- KEY_F0, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8,
- KEY_F9, KEY_F10, KEY_F11, KEY_F12,
- KEY_INSERT, KEY_DELETE, KEY_HOME, KEY_END, KEY_PGUP, KEY_PGDN,
- KEY_ARROW_UP, KEY_ARROW_DOWN, KEY_ARROW_LEFT, KEY_ARROW_RIGHT,
- MOUSE_LEFT_PRESS, MOUSE_RIGHT_PRESS, MOUSE_MIDDLE_PRESS,
- MOUSE_LEFT_DRAG, MOUSE_RIGHT_DRAG, MOUSE_MIDDLE_DRAG,
- MOUSE_LEFT_RELEASE, MOUSE_RIGHT_RELEASE, MOUSE_MIDDLE_RELEASE,
- MOUSE_LEFT_DOUBLE, MOUSE_RIGHT_DOUBLE, MOUSE_MIDDLE_DOUBLE,
- MOUSE_WHEEL_RELEASE, MOUSE_WHEEL_PRESS,
+ KEY_F0,
+ KEY_F1,
+ KEY_F2,
+ KEY_F3,
+ KEY_F4,
+ KEY_F5,
+ KEY_F6,
+ KEY_F7,
+ KEY_F8,
+ KEY_F9,
+ KEY_F10,
+ KEY_F11,
+ KEY_F12,
+ KEY_INSERT,
+ KEY_DELETE,
+ KEY_HOME,
+ KEY_END,
+ KEY_PGUP,
+ KEY_PGDN,
+ KEY_ARROW_UP,
+ KEY_ARROW_DOWN,
+ KEY_ARROW_LEFT,
+ KEY_ARROW_RIGHT,
+ MOUSE_LEFT_PRESS,
+ MOUSE_RIGHT_PRESS,
+ MOUSE_MIDDLE_PRESS,
+ MOUSE_LEFT_DRAG,
+ MOUSE_RIGHT_DRAG,
+ MOUSE_MIDDLE_DRAG,
+ MOUSE_LEFT_RELEASE,
+ MOUSE_RIGHT_RELEASE,
+ MOUSE_MIDDLE_RELEASE,
+ MOUSE_LEFT_DOUBLE,
+ MOUSE_RIGHT_DOUBLE,
+ MOUSE_MIDDLE_DOUBLE,
+ MOUSE_WHEEL_RELEASE,
+ MOUSE_WHEEL_PRESS,
} bkey_t;
-#define MOD_BITSHIFT 9
-#define MOD_META (1 << (MOD_BITSHIFT + 0))
-#define MOD_CTRL (1 << (MOD_BITSHIFT + 1))
-#define MOD_ALT (1 << (MOD_BITSHIFT + 2))
-#define MOD_SHIFT (1 << (MOD_BITSHIFT + 3))
+#define MOD_BITSHIFT 9
+#define MOD_META (1 << (MOD_BITSHIFT + 0))
+#define MOD_CTRL (1 << (MOD_BITSHIFT + 1))
+#define MOD_ALT (1 << (MOD_BITSHIFT + 2))
+#define MOD_SHIFT (1 << (MOD_BITSHIFT + 3))
// Overlapping key codes:
-#define KEY_CTRL_BACKTICK 0x00 /* clash with ^@ */
-#define KEY_CTRL_2 0x00 /* clash with ^@ */
-#define KEY_BACKSPACE 0x08 /* clash with ^H */
-#define KEY_TAB 0x09 /* clash with ^I */
-#define KEY_ENTER 0x0D /* clash with ^M */
-#define KEY_ESC 0x1B /* clash with ^[ */
-#define KEY_CTRL_3 0x1B /* clash with ^[ */
-#define KEY_CTRL_4 0x1C /* clash with ^\ */
-#define KEY_CTRL_5 0x1D /* clash with ^] */
-#define KEY_CTRL_TILDE 0x1E /* clash with ^^ */
-#define KEY_CTRL_6 0x1E /* clash with ^^ */
-#define KEY_CTRL_7 0x1F /* clash with ^_ */
-#define KEY_CTRL_SLASH 0x1F /* clash with ^_ */
-#define KEY_SPACE 0x20
-#define KEY_BACKSPACE2 0x7F
-#define KEY_CTRL_8 0x7F /* clash with 'BACKSPACE2' */
+#define KEY_CTRL_BACKTICK 0x00 /* clash with ^@ */
+#define KEY_CTRL_2 0x00 /* clash with ^@ */
+#define KEY_BACKSPACE 0x08 /* clash with ^H */
+#define KEY_TAB 0x09 /* clash with ^I */
+#define KEY_ENTER 0x0D /* clash with ^M */
+#define KEY_ESC 0x1B /* clash with ^[ */
+#define KEY_CTRL_3 0x1B /* clash with ^[ */
+#define KEY_CTRL_4 0x1C /* clash with ^\ */
+#define KEY_CTRL_5 0x1D /* clash with ^] */
+#define KEY_CTRL_TILDE 0x1E /* clash with ^^ */
+#define KEY_CTRL_6 0x1E /* clash with ^^ */
+#define KEY_CTRL_7 0x1F /* clash with ^_ */
+#define KEY_CTRL_SLASH 0x1F /* clash with ^_ */
+#define KEY_SPACE 0x20
+#define KEY_BACKSPACE2 0x7F
+#define KEY_CTRL_8 0x7F /* clash with 'BACKSPACE2' */
// Terminal escape sequences:
-#define T_WRAP "7"
+#define T_WRAP "7"
#define T_SHOW_CURSOR "25"
-#define T_MOUSE_XY "1000"
-#define T_MOUSE_CELL "1002"
-#define T_MOUSE_SGR "1006"
-#define T_ALT_SCREEN "1049"
-#define T_ON(opt) "\033[?" opt "h"
+#define T_MOUSE_XY "1000"
+#define T_MOUSE_CELL "1002"
+#define T_MOUSE_SGR "1006"
+#define T_ALT_SCREEN "1049"
+#define T_ON(opt) "\033[?" opt "h"
#define T_OFF(opt) "\033[?" opt "l"
-#define move_cursor(f, x, y) fprintf((f), "\033[%d;%dH", (int)(y)+1, (int)(x)+1)
-#define move_cursor_col(f, x) fprintf((f), "\033[%d`", (int)(x)+1)
+#define move_cursor(f, x, y) fprintf((f), "\033[%d;%dH", (int)(y) + 1, (int)(x) + 1)
+#define move_cursor_col(f, x) fprintf((f), "\033[%d`", (int)(x) + 1)
int bgetkey(FILE *in, int *mouse_x, int *mouse_y);
char *bkeyname(int key, char *buf);
diff --git a/types.h b/types.h
index d80e83d..2839c7b 100644
--- a/types.h
+++ b/types.h
@@ -9,14 +9,14 @@
#define FILE_TYPES__H
#include <limits.h>
-#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
#include "terminal.h"
#define MAX_COLS 12
-#define MAX_SORT (2*MAX_COLS)
+#define MAX_SORT (2 * MAX_COLS)
#define HASH_SIZE 1024
#define HASH_MASK (HASH_SIZE - 1)
@@ -70,8 +70,8 @@ typedef struct bb_s {
int scroll, cursor;
char *globpats;
- char sort[MAX_SORT+1];
- char columns[MAX_COLS+1];
+ char sort[MAX_SORT + 1];
+ char columns[MAX_COLS + 1];
unsigned int interleave_dirs : 1;
unsigned int should_quit : 1;
unsigned int dirty : 1;
diff --git a/utils.c b/utils.c
index e94658c..fd258d2 100644
--- a/utils.c
+++ b/utils.c
@@ -15,8 +15,7 @@
// If the given argument is nonnegative, print the error message and exit with
// failure. Otherwise, return the given argument.
//
-int check_nonnegative(int negative_err, const char *err_msg, ...)
-{
+int check_nonnegative(int negative_err, const char *err_msg, ...) {
if (negative_err < 0) {
va_list args;
va_start(args, err_msg);
@@ -30,8 +29,7 @@ int check_nonnegative(int negative_err, const char *err_msg, ...)
// If the given argument is NULL, print the error message and exit with
// failure. Otherwise return the given argument.
//
-void *check_nonnull(void *p, const char *err_msg, ...)
-{
+void *check_nonnull(void *p, const char *err_msg, ...) {
if (p == NULL) {
va_list args;
va_start(args, err_msg);
@@ -46,11 +44,10 @@ void *check_nonnull(void *p, const char *err_msg, ...)
// the pointer to NULL. (This is a safer alternative to free() that
// automatically NULLs out the pointer so it can't be used after freeing)
//
-void delete(void *p)
-{
- if (*(void**)p != NULL) {
- free(*(void**)p);
- *(void**)p = NULL;
+void delete(void *p) {
+ if (*(void **)p != NULL) {
+ free(*(void **)p);
+ *(void **)p = NULL;
}
}
diff --git a/utils.h b/utils.h
index 719733d..33b4bc1 100644
--- a/utils.h
+++ b/utils.h
@@ -12,11 +12,11 @@
#include <string.h>
#ifndef streq
-#define streq(a,b) (strcmp(a,b)==0)
+#define streq(a, b) (strcmp(a, b) == 0)
#endif
-#define MAX(a,b) ((a) < (b) ? (b) : (a))
-#define MIN(a,b) ((a) > (b) ? (b) : (a))
+#define MAX(a, b) ((a) < (b) ? (b) : (a))
+#define MIN(a, b) ((a) > (b) ? (b) : (a))
// Platform-dependent time strucutre accessors:
#ifdef __APPLE__
@@ -37,23 +37,23 @@
#define E_ISDIR(e) (S_ISDIR(S_ISLNK((e)->info.st_mode) ? (e)->linkedmode : (e)->info.st_mode))
// Linked list macros
-#define LL_PREPEND(head, node, name) do { \
- ((node)->name).atme = &(head); \
- ((node)->name).next = head; \
- if (head) ((head)->name).atme = &(((node)->name).next); \
- head = node; \
-} while (0)
+#define LL_PREPEND(head, node, name) \
+ do { \
+ ((node)->name).atme = &(head); \
+ ((node)->name).next = head; \
+ if (head) ((head)->name).atme = &(((node)->name).next); \
+ head = node; \
+ } while (0)
-#define LL_REMOVE(node, name) do { \
- if (((node)->name).next) \
- ((__typeof__(node))(node)->name.next)->name.atme = ((node)->name).atme; \
- if (((node)->name).atme) \
- *(((node)->name).atme) = ((node)->name).next; \
- ((node)->name).atme = NULL; \
- ((node)->name).next = NULL; \
-} while (0)
+#define LL_REMOVE(node, name) \
+ do { \
+ if (((node)->name).next) ((__typeof__(node))(node)->name.next)->name.atme = ((node)->name).atme; \
+ if (((node)->name).atme) *(((node)->name).atme) = ((node)->name).next; \
+ ((node)->name).atme = NULL; \
+ ((node)->name).next = NULL; \
+ } while (0)
-#define LEN(a) (sizeof(a)/sizeof(a[0]))
+#define LEN(a) (sizeof(a) / sizeof(a[0]))
#define FOREACH(type, var, array) for (type var = array; (var) < &(array)[LEN(array)]; var++)
#define S1(x) #x
@@ -66,14 +66,14 @@
// Error-checking memory allocation helper macros:
#define new(t) check_nonnull(calloc(1, sizeof(t)), __LOCATION__ ": new(" #t ") failed")
#define new_bytes(n) check_nonnull(calloc(1, n), __LOCATION__ ": new_bytes(" #n ") failed")
-#define grow(obj, new_count) check_nonnull(reallocarray(obj, (new_count), sizeof(obj[0])), __LOCATION__ ": grow(" #obj ", " #new_count ") failed")
+#define grow(obj, new_count) \
+ check_nonnull(reallocarray(obj, (new_count), sizeof(obj[0])), \
+ __LOCATION__ ": grow(" #obj ", " #new_count ") failed")
#define check_strdup(s) check_nonnull(strdup(s), __LOCATION__ ": check_strdup(" #s ") failed")
int check_nonnegative(int negative_err, const char *err_msg, ...);
-__attribute__((returns_nonnull))
-void *check_nonnull(void *p, const char *err_msg, ...);
-__attribute__((nonnull))
-void delete(void *p);
+__attribute__((returns_nonnull)) void *check_nonnull(void *p, const char *err_msg, ...);
+__attribute__((nonnull)) void delete(void *p);
#endif
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0