- After entering "..", select the directory we were in before
instead of the first filename in the list, as Pico does. (DLR)
- Simplify screen update handling and exiting. (DLR)
+ - Move the opening of path here from do_browse_from(), so that
+ we no longer need a DIR* parameter. (DLR)
do_browse_from()
- During the operating directory check, if path isn't NULL,
don't bother freeing it before mallocstrcpy()ing operating_dir
rightmost column of the screen from being used. (DLR)
- Calculate width here instead of in browser_refresh(), as it's
more consistent. (DLR)
+ - If filelist is initialized, free it here instead of in several
+ places in do_browser(). (DLR)
browser_refresh()
- Simplify. (DLR)
- Fix problems where translated versions of "(dir)" could be
/* Our main file browser function. path is the tilde-expanded path to
* start browsing from. */
-char *do_browser(char *path, DIR *dir)
+char *do_browser(char *path)
{
char *retval = NULL;
int kbinput;
char *prev_dir = NULL;
/* The directory we were in, if any, before backing up via
* browsing to "..". */
- char *ans = mallocstrcpy(NULL, "");
+ char *ans = NULL;
/* The last answer the user typed on the statusbar. */
size_t old_selected;
/* The selected file we had before the current selected file. */
+ DIR *dir;
+
+ /* If we have no path, or we can't open it, get out. */
+ if (path == NULL || (dir = opendir(path)) == NULL) {
+ beep();
+ goto cleanup_browser;
+ }
curs_set(0);
blank_statusbar();
UNSET(CONST_UPDATE);
+ ans = mallocstrcpy(NULL, "");
+
change_browser_directory:
/* We go here after we select a new directory. */
/* Start over again with the new path value. */
free(path);
path = new_path;
- free_chararray(filelist, filelist_len);
goto change_browser_directory;
case NANO_PREVLINE_KEY:
if (selected >= width)
path = mallocstrcpy(path, filelist[selected]);
/* Start over again with the new path value. */
- free_chararray(filelist, filelist_len);
goto change_browser_directory;
/* Abort the file browser. */
case NANO_EXIT_KEY:
if (old_const_update)
SET(CONST_UPDATE);
- /* Clean up. */
- free(path);
- free(ans);
- free_chararray(filelist, filelist_len);
+ cleanup_browser:
+ if (path != NULL)
+ free(path);
+ if (ans != NULL)
+ free(ans);
+ if (filelist != NULL) {
+ free_chararray(filelist, filelist_len);
+ filelist = NULL;
+ filelist_len = 0;
+ }
return retval;
}
struct stat st;
char *path;
/* This holds the tilde-expanded version of inpath. */
- DIR *dir = NULL;
assert(inpath != NULL);
path = mallocstrcpy(path, operating_dir);
#endif
- if (path != NULL)
- dir = opendir(path);
-
- if (dir == NULL) {
- beep();
- free(path);
- return NULL;
- }
-
- return do_browser(path, dir);
+ return do_browser(path);
}
/* Set filelist to the list of files contained in the directory path,
i++;
}
- filelist_len = i;
-
rewinddir(dir);
/* Put 10 columns' worth of blank space between columns of filenames
* in the list whenever possible, as Pico does. */
longest += 10;
+ if (filelist != NULL)
+ free_chararray(filelist, filelist_len);
+
+ filelist_len = i;
+
filelist = (char **)nmalloc(filelist_len * sizeof(char *));
i = 0;
/* Public functions in browser.c. */
#ifndef DISABLE_BROWSER
-char *do_browser(char *path, DIR *dir);
+char *do_browser(char *path);
char *do_browse_from(const char *inpath);
void browser_init(const char *path, DIR *dir);
void parse_browser_input(int *kbinput, bool *meta_key, bool *func_key);