commit - 98594ac53698447be7de7928850497e366623e6b
commit + f05efd9edcf8eb9279058ba7891c59f879d793d4
blob - aa4995ad36a867804528765733f24845ee217ea4
blob + 4589fef60611e8b48fa9a180199ff449e66fa29e
--- rover.c
+++ rover.c
typedef enum {DEFAULT, RED, GREEN, YELLOW, BLUE, CYAN, MAGENTA, WHITE} color_t;
-struct skit_t {
+#define HEIGHT (LINES-4)
+
+struct rover_t {
int nfiles;
int scroll;
int fsel;
char **fnames;
WINDOW *window;
char cwd[FILENAME_MAX];
-} skit;
+} rover;
static int
spcmp(const void *a, const void *b)
names = (char **) malloc(n * sizeof(char *));
i = 0;
while ((ep = readdir(dp))) {
- if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0)
+ if (!strcmp(ep->d_name, ".") || !strcmp(ep->d_name, ".."))
continue;
/* FIXME: ANSI C doesn't have lstat(). How do we handle symlinks? */
(void) stat(ep->d_name, &statbuf);
}
static void
-sk_clean()
+clean_term()
{
endwin();
}
static void
-sk_init()
+init_term()
{
setlocale(LC_ALL, "");
initscr();
init_pair(MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
init_pair(WHITE, COLOR_WHITE, COLOR_BLACK);
}
- atexit(sk_clean);
+ atexit(clean_term);
}
static void
{
int i, j;
- for (i = 0, j = skit.scroll; i < LINES - 4 && j < skit.nfiles; i++, j++) {
- if (j == skit.fsel)
- wattr_on(skit.window, A_REVERSE, NULL);
- (void) mvwhline(skit.window, i + 1, 1,
+ for (i = 0, j = rover.scroll; i < HEIGHT && j < rover.nfiles; i++, j++) {
+ if (j == rover.fsel)
+ wattr_on(rover.window, A_REVERSE, NULL);
+ (void) mvwhline(rover.window, i + 1, 1,
' ', COLS - 2);
- (void) mvwaddnstr(skit.window, i + 1, 1,
- skit.fnames[j], COLS - 2);
- if (j == skit.fsel)
- wattr_off(skit.window, A_REVERSE, NULL);
+ (void) mvwaddnstr(rover.window, i + 1, 1,
+ rover.fnames[j], COLS - 2);
+ if (j == rover.fsel)
+ wattr_off(rover.window, A_REVERSE, NULL);
}
- wrefresh(skit.window);
+ wrefresh(rover.window);
/* C89 doesn't have snprintf(), but a buffer overrun will only occur here
* if the number of files reach 10 ^ (STATUSSZ / 2), which is unlikely. */
- sprintf(STATUS, "% 10d/%d", skit.fsel + 1, skit.nfiles);
+ sprintf(STATUS, "% 10d/%d", rover.fsel + 1, rover.nfiles);
mvaddstr(LINES - 1, COLS - strlen(STATUS), STATUS);
refresh();
}
-/* NOTE: The caller needs to write the new path to skit.cwd
+/* NOTE: The caller needs to write the new path to rover.cwd
* *before* calling this function. */
static void
cd()
{
int i;
- skit.fsel = 0;
- skit.scroll = 0;
- (void) chdir(skit.cwd);
+ rover.fsel = 0;
+ rover.scroll = 0;
+ (void) chdir(rover.cwd);
(void) mvhline(0, 0, ' ', COLS);
- (void) mvaddnstr(0, 0, skit.cwd, COLS);
- for (i = 0; i < skit.nfiles; i++)
- free(skit.fnames[i]);
- if (skit.nfiles)
- free(skit.fnames);
- skit.nfiles = ls(skit.cwd, &skit.fnames);
- (void) wclear(skit.window);
- wborder(skit.window, 0, 0, 0, 0, 0, 0, 0, 0);
+ (void) mvaddnstr(0, 0, rover.cwd, COLS);
+ for (i = 0; i < rover.nfiles; i++)
+ free(rover.fnames[i]);
+ if (rover.nfiles)
+ free(rover.fnames);
+ rover.nfiles = ls(rover.cwd, &rover.fnames);
+ (void) wclear(rover.window);
+ wborder(rover.window, 0, 0, 0, 0, 0, 0, 0, 0);
update_browser();
refresh();
}
pid = fork();
if (pid > 0) {
/* fork() succeeded. */
- sk_clean();
+ clean_term();
(void) waitpid(pid, &status, 0);
- sk_init();
+ init_term();
doupdate();
}
else if (pid == 0) {
char *program;
char *key;
- sk_init();
+ init_term();
/* Avoid invalid free() calls in cd() by zeroing the tally. */
- skit.nfiles = 0;
- (void) getcwd(skit.cwd, FILENAME_MAX);
- strcat(skit.cwd, "/");
- skit.window = subwin(stdscr, LINES - 2, COLS, 1, 0);
+ rover.nfiles = 0;
+ (void) getcwd(rover.cwd, FILENAME_MAX);
+ strcat(rover.cwd, "/");
+ rover.window = subwin(stdscr, LINES - 2, COLS, 1, 0);
cd();
while (1) {
key = keyname(getch());
if (!strcmp(key, RVK_QUIT))
break;
else if (!strcmp(key, RVK_DOWN)) {
- if (skit.fsel == skit.nfiles - 1)
- skit.scroll = skit.fsel = 0;
+ if (rover.fsel == rover.nfiles - 1)
+ rover.scroll = rover.fsel = 0;
else {
- skit.fsel++;
- if ((skit.fsel - skit.scroll) == (LINES - 4))
- skit.scroll++;
+ rover.fsel++;
+ if ((rover.fsel - rover.scroll) == HEIGHT)
+ rover.scroll++;
}
update_browser();
}
else if (!strcmp(key, RVK_UP)) {
- if (skit.fsel == 0) {
- skit.fsel = skit.nfiles - 1;
- skit.scroll = skit.nfiles - LINES + 4;
- if (skit.scroll < 0)
- skit.scroll = 0;
+ if (rover.fsel == 0) {
+ rover.fsel = rover.nfiles - 1;
+ rover.scroll = rover.nfiles - HEIGHT;
+ if (rover.scroll < 0)
+ rover.scroll = 0;
}
else {
- skit.fsel--;
- if (skit.fsel < skit.scroll)
- skit.scroll--;
+ rover.fsel--;
+ if (rover.fsel < rover.scroll)
+ rover.scroll--;
}
update_browser();
}
else if (!strcmp(key, RVK_JUMP_DOWN)) {
- skit.fsel += RV_JUMP;
- if (skit.fsel >= skit.nfiles)
- skit.fsel = skit.nfiles - 1;
- if (skit.nfiles > LINES - 4) {
- skit.scroll += RV_JUMP;
- if (skit.scroll > skit.nfiles - LINES + 4)
- skit.scroll = skit.nfiles - LINES + 4;
+ rover.fsel += RV_JUMP;
+ if (rover.fsel >= rover.nfiles)
+ rover.fsel = rover.nfiles - 1;
+ if (rover.nfiles > HEIGHT) {
+ rover.scroll += RV_JUMP;
+ if (rover.scroll > rover.nfiles - HEIGHT)
+ rover.scroll = rover.nfiles - HEIGHT;
}
update_browser();
}
else if (!strcmp(key, RVK_JUMP_UP)) {
- skit.fsel -= RV_JUMP;
- if (skit.fsel < 0)
- skit.fsel = 0;
- skit.scroll -= RV_JUMP;
- if (skit.scroll < 0)
- skit.scroll = 0;
+ rover.fsel -= RV_JUMP;
+ if (rover.fsel < 0)
+ rover.fsel = 0;
+ rover.scroll -= RV_JUMP;
+ if (rover.scroll < 0)
+ rover.scroll = 0;
update_browser();
}
else if (!strcmp(key, RVK_CD_DOWN)) {
- if (strchr(skit.fnames[skit.fsel], '/') == NULL)
+ if (strchr(rover.fnames[rover.fsel], '/') == NULL)
continue;
- strcat(skit.cwd, skit.fnames[skit.fsel]);
+ strcat(rover.cwd, rover.fnames[rover.fsel]);
cd();
}
else if (!strcmp(key, RVK_CD_UP)) {
- if (strlen(skit.cwd) == 1)
+ if (strlen(rover.cwd) == 1)
continue;
- skit.cwd[strlen(skit.cwd) - 1] = '\0';
- *(strrchr(skit.cwd, '/') + 1) = '\0';
+ rover.cwd[strlen(rover.cwd) - 1] = '\0';
+ *(strrchr(rover.cwd, '/') + 1) = '\0';
cd();
}
else if (!strcmp(key, RVK_HOME)) {
- strcpy(skit.cwd, getenv("HOME"));
- if (skit.cwd[strlen(skit.cwd) - 1] != '/')
- strcat(skit.cwd, "/");
+ strcpy(rover.cwd, getenv("HOME"));
+ if (rover.cwd[strlen(rover.cwd) - 1] != '/')
+ strcat(rover.cwd, "/");
cd();
}
else if (!strcmp(key, RVK_SHELL)) {
}
}
else if (!strcmp(key, RVK_EDIT)) {
- if (strchr(skit.fnames[skit.fsel], '/') != NULL)
+ if (strchr(rover.fnames[rover.fsel], '/') != NULL)
continue;
program = getenv("EDITOR");
if (program) {
args[0] = program;
- args[1] = skit.fnames[skit.fsel];
+ args[1] = rover.fnames[rover.fsel];
args[2] = NULL;
spawn();
}
else if (!strcmp(key, RVK_SEARCH)) {
int ch, length, sel, oldsel, oldscroll;
color_t color;
- oldsel = skit.fsel;
- oldscroll = skit.scroll;
+ oldsel = rover.fsel;
+ oldscroll = rover.scroll;
*SEARCH = '\0';
length = 0;
while ((ch = getch()) != '\r') {
if (length)
SEARCH[--length] = '\0';
if (!length) {
- skit.fsel = oldsel;
- skit.scroll = oldscroll;
+ rover.fsel = oldsel;
+ rover.scroll = oldscroll;
}
break;
default:
SEARCH[length++] = ch;
}
if (length) {
- for (sel = 0; sel < skit.nfiles; sel++)
- if (!strncmp(skit.fnames[sel], SEARCH, length))
+ for (sel = 0; sel < rover.nfiles; sel++)
+ if (!strncmp(rover.fnames[sel], SEARCH, length))
break;
- if (sel < skit.nfiles) {
+ if (sel < rover.nfiles) {
color = GREEN;
- skit.fsel = sel;
- if (skit.nfiles > LINES - 4) {
- if (sel > skit.nfiles - LINES + 4)
- skit.scroll = skit.nfiles - LINES + 4;
+ rover.fsel = sel;
+ if (rover.nfiles > HEIGHT) {
+ if (sel > rover.nfiles - HEIGHT)
+ rover.scroll = rover.nfiles - HEIGHT;
else
- skit.scroll = sel;
+ rover.scroll = sel;
}
}
else
update_browser();
}
}
- while (skit.nfiles--) free(skit.fnames[skit.nfiles]);
- free(skit.fnames);
- delwin(skit.window);
+ while (rover.nfiles--) free(rover.fnames[rover.nfiles]);
+ free(rover.fnames);
+ delwin(rover.window);
return 0;
}