nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 413a83c2e2bd00a27c2c550a485779d67ebecbba
parent ab08eebfc1a3b9513fd302c2275b3a0f8d9abd43
Author: Benno Schulenberg <bensberg@telfort.nl>
Date:   Wed,  2 Sep 2020 10:09:20 +0200

tweaks: move two more functions, to before the one that calls them

Diffstat:
Msrc/browser.c | 184++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/prototypes.h | 2--
2 files changed, 92 insertions(+), 94 deletions(-)

diff --git a/src/browser.c b/src/browser.c @@ -39,6 +39,98 @@ static size_t longest = 0; static size_t selected = 0; /* The currently selected filename in the list; zero-based. */ +/* Set filelist to the list of files contained in the directory path, + * set filelist_len to the number of files in that list, set longest to + * the width in columns of the longest filename in that list (between 15 + * and COLS), and set width to the number of files that we can display + * per screen row. And sort the list too. */ +void read_the_list(const char *path, DIR *dir) +{ + const struct dirent *nextdir; + size_t i = 0, path_len = strlen(path); + + longest = 0; + + /* Find the length of the longest filename in the current folder. */ + while ((nextdir = readdir(dir)) != NULL) { + size_t name_len = breadth(nextdir->d_name); + + if (name_len > longest) + longest = name_len; + + i++; + } + + /* Put 10 characters' worth of blank space between columns of filenames + * in the list whenever possible, as Pico does. */ + longest += 10; + + /* If needed, make room for ".. (parent dir)". */ + if (longest < 15) + longest = 15; + /* Make sure we're not wider than the window. */ + if (longest > COLS) + longest = COLS; + + rewinddir(dir); + + free_chararray(filelist, filelist_len); + + filelist_len = i; + + filelist = nmalloc(filelist_len * sizeof(char *)); + + i = 0; + + while ((nextdir = readdir(dir)) != NULL && i < filelist_len) { + /* Don't show the "." entry. */ + if (strcmp(nextdir->d_name, ".") == 0) + continue; + + filelist[i] = nmalloc(path_len + strlen(nextdir->d_name) + 1); + sprintf(filelist[i], "%s%s", path, nextdir->d_name); + + i++; + } + + /* Maybe the number of files in the directory changed between the + * first time we scanned and the second. i is the actual length of + * filelist, so record it. */ + filelist_len = i; + + /* Sort the list of names. */ + qsort(filelist, filelist_len, sizeof(char *), diralphasort); + + /* Calculate how many files fit on a line -- feigning room for two + * spaces beyond the right edge, and adding two spaces of padding + * between columns. */ + width = (COLS + 2) / (longest + 2); +} + +/* Look for needle. If we find it, set selected to its location. + * Note that needle must be an exact match for a file in the list. */ +void browser_select_dirname(const char *needle) +{ + size_t looking_at = 0; + + for (; looking_at < filelist_len; looking_at++) { + if (strcmp(filelist[looking_at], needle) == 0) { + selected = looking_at; + break; + } + } + + /* If the sought name isn't found, move the highlight so that the + * changed selection will be noticed. */ + if (looking_at == filelist_len) { + --selected; + + /* Make sure we stay within the available range. */ + if (selected >= filelist_len) + selected = filelist_len - 1; + } +} + /* Look for the given needle in the list of files. If forwards is TRUE, * search forward in the list; otherwise, search backward. */ void findfile(const char *needle, bool forwards) @@ -502,74 +594,6 @@ char *browse_in(const char *inpath) return browse(path); } -/* Set filelist to the list of files contained in the directory path, - * set filelist_len to the number of files in that list, set longest to - * the width in columns of the longest filename in that list (between 15 - * and COLS), and set width to the number of files that we can display - * per screen row. And sort the list too. */ -void read_the_list(const char *path, DIR *dir) -{ - const struct dirent *nextdir; - size_t i = 0, path_len = strlen(path); - - longest = 0; - - /* Find the length of the longest filename in the current folder. */ - while ((nextdir = readdir(dir)) != NULL) { - size_t name_len = breadth(nextdir->d_name); - - if (name_len > longest) - longest = name_len; - - i++; - } - - /* Put 10 characters' worth of blank space between columns of filenames - * in the list whenever possible, as Pico does. */ - longest += 10; - - /* If needed, make room for ".. (parent dir)". */ - if (longest < 15) - longest = 15; - /* Make sure we're not wider than the window. */ - if (longest > COLS) - longest = COLS; - - rewinddir(dir); - - free_chararray(filelist, filelist_len); - - filelist_len = i; - - filelist = nmalloc(filelist_len * sizeof(char *)); - - i = 0; - - while ((nextdir = readdir(dir)) != NULL && i < filelist_len) { - /* Don't show the "." entry. */ - if (strcmp(nextdir->d_name, ".") == 0) - continue; - - filelist[i] = nmalloc(path_len + strlen(nextdir->d_name) + 1); - sprintf(filelist[i], "%s%s", path, nextdir->d_name); - - i++; - } - - /* Maybe the number of files in the directory changed between the - * first time we scanned and the second. i is the actual length of - * filelist, so record it. */ - filelist_len = i; - - /* Sort the list of names. */ - qsort(filelist, filelist_len, sizeof(char *), diralphasort); - - /* Calculate how many files fit on a line -- feigning room for two - * spaces beyond the right edge, and adding two spaces of padding - * between columns. */ - width = (COLS + 2) / (longest + 2); -} - /* Display at most a screenful of filenames from the gleaned filelist. */ void browser_refresh(void) { @@ -699,30 +723,6 @@ void browser_refresh(void) wnoutrefresh(edit); } -/* Look for needle. If we find it, set selected to its location. - * Note that needle must be an exact match for a file in the list. */ -void browser_select_dirname(const char *needle) -{ - size_t looking_at = 0; - - for (; looking_at < filelist_len; looking_at++) { - if (strcmp(filelist[looking_at], needle) == 0) { - selected = looking_at; - break; - } - } - - /* If the sought name isn't found, move the highlight so that the - * changed selection will be noticed. */ - if (looking_at == filelist_len) { - --selected; - - /* Make sure we stay within the available range. */ - if (selected >= filelist_len) - selected = filelist_len - 1; - } -} - /* Strip one element from the end of path, and return the stripped path. * The returned string is dynamically allocated, and should be freed. */ char *strip_last_component(const char *path) diff --git a/src/prototypes.h b/src/prototypes.h @@ -189,9 +189,7 @@ typedef void (*functionptrtype)(void); /* Most functions in browser.c. */ #ifdef ENABLE_BROWSER char *browse_in(const char *inpath); -void read_the_list(const char *path, DIR *dir); void browser_refresh(void); -void browser_select_dirname(const char *needle); char *strip_last_component(const char *path); #endif