diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-09-24 20:37:08 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-09-24 20:37:08 -0400 |
| commit | b3ad05094b4e778d92a351a743cdf15e7bd990b2 (patch) | |
| tree | f3b45d636746929e89777c53de51c950c2c1c6b4 | |
| parent | 559a1b012a45fd37faad444050e1de733bbf109f (diff) | |
Autoformatting with clang-format
| -rw-r--r-- | .clang-format | 274 | ||||
| -rw-r--r-- | .clangd | 3 | ||||
| -rw-r--r-- | bb.c | 446 | ||||
| -rw-r--r-- | draw.c | 151 | ||||
| -rw-r--r-- | draw.h | 14 | ||||
| -rw-r--r-- | terminal.c | 197 | ||||
| -rw-r--r-- | terminal.h | 144 | ||||
| -rw-r--r-- | types.h | 8 | ||||
| -rw-r--r-- | utils.c | 15 | ||||
| -rw-r--r-- | utils.h | 46 |
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 +... + @@ -0,0 +1,3 @@ +CompileFlags: + Add: [-xc] +Checks: '-bugprone-suspicious-missing-comma' @@ -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; } @@ -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; @@ -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; @@ -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); @@ -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); @@ -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; @@ -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; } } @@ -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 |
