@@ -1,26 +1,28 @@
/* See LICENSE file for copyright and license details. */
/* See LICENSE file for copyright and license details. */
#include <readline/readline.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/wait.h>
#include <sys/statvfs.h>
#include <sys/statvfs.h>
#include <sys/resource.h>
#include <sys/resource.h>
#include <ctype.h>
#include <curses.h>
#include <curses.h>
#include <dirent.h>
#include <dirent.h>
#include <errno.h>
#include <errno.h>
#include <fcntl.h>
#include <fcntl.h>
#include <grp.h>
#include <limits.h>
#include <limits.h>
#include <locale.h>
#include <locale.h>
#include <pwd.h>
#include <regex.h>
#include <regex.h>
#include <signal.h>
#include <signal.h>
#include <stdarg.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <time.h>
#include <pwd.h>
#include <unistd.h>
#include <grp.h>
#define __USE_XOPEN_EXTENDED
#define __USE_XOPEN_EXTENDED
#include <ftw.h>
#include <ftw.h>
@@ -118,6 +120,13 @@ typedef struct entry {
typedef unsigned long ulong;
typedef unsigned long ulong;
/* Externs */
#ifdef __APPLE__
extern int add_history(const char *);
#else
extern void add_history(const char *string);
#endif
/* Global context */
/* Global context */
static struct entry *dents;
static struct entry *dents;
static int ndents, cur;
static int ndents, cur;
@@ -375,6 +384,28 @@ xstricmp(const char *s1, const char *s2)
return (int) (TOUPPER(*s1) - TOUPPER(*s2));
return (int) (TOUPPER(*s1) - TOUPPER(*s2));
}
}
static char *
strstrip(char *s)
{
size_t size;
char *end;
size = strlen(s);
if (!size)
return s;
end = s + size - 1;
while (end >= s && isspace(*end))
end--;
*(end + 1) = '\0';
while (*s && isspace(*s))
s++;
return s;
}
static char *
static char *
openwith(char *file)
openwith(char *file)
{
{
@@ -1420,14 +1451,39 @@ nochange:
cur = ndents - 1;
cur = ndents - 1;
break;
break;
case SEL_CD:
case SEL_CD:
{
/* Read target dir */
/* Read target dir */
printprompt("chdir: ") ;
char cwd[PATH_MAX] ;
tmp = readln( );
tmp = getcwd(cwd, PATH_MAX );
if (tmp == NULL) {
if (tmp == NULL) {
clearprompt();
printwarn();
goto nochange;
}
if (chdir(path) == -1) {
printwarn();
goto nochange;
goto nochange;
}
}
exitcurses();
char *tmp = readline("chdir: ");
initcurses();
tmp = tmp[0] ? tmp : NULL;
if (chdir(cwd) == -1)
printwarn();
if (tmp == NULL) {
/* Save current */
if (ndents > 0)
mkpath(path, dents[cur].name, oldpath, sizeof(oldpath));
goto begin;
} else
add_history(tmp);
char *input = tmp;
tmp = strstrip(tmp);
if (tmp[0] == '~') {
if (tmp[0] == '~') {
char *home = getenv("HOME");
char *home = getenv("HOME");
if (home)
if (home)
@@ -1441,8 +1497,13 @@ nochange:
mkpath(path, tmp, newpath, sizeof(newpath));
mkpath(path, tmp, newpath, sizeof(newpath));
if (canopendir(newpath) == 0) {
if (canopendir(newpath) == 0) {
/* Save current */
if (ndents > 0)
mkpath(path, dents[cur].name, oldpath, sizeof(oldpath));
printwarn();
printwarn();
goto nochange;
free(input);
goto begin;
}
}
/* Save last working directory */
/* Save last working directory */
@@ -1452,7 +1513,10 @@ nochange:
/* Reset filter */
/* Reset filter */
xstrlcpy(fltr, ifilter, sizeof(fltr));
xstrlcpy(fltr, ifilter, sizeof(fltr));
DPRINTF_S(path);
DPRINTF_S(path);
oldpath[0] = '\0';
free(input);
goto begin;
goto begin;
}
case SEL_CDHOME:
case SEL_CDHOME:
tmp = getenv("HOME");
tmp = getenv("HOME");
if (tmp == NULL) {
if (tmp == NULL) {