diff --git a/src/browser.c b/src/browser.c index e9ac8ad3f4535ec741320d51a50b2de1ac798d98..5907f08c42afe5755ec8b2da2271adbfd56a9436 100644 --- a/src/browser.c +++ b/src/browser.c @@ -407,10 +407,7 @@ int browse_key(int ch) { /* refresh */ case 'r': hideinfo; - stcalc.sterr = ST_BROWSE; - stcalc.orig = stbrowse.cur->parent; - strcpy(stcalc.cur, getpath(stbrowse.cur, tmp)); - pstate = ST_CALC; + calc_init(getpath(stbrowse.cur, tmp), stbrowse.cur->parent); break; /* and other stuff */ diff --git a/src/calc.c b/src/calc.c index 5aa4063a47e0e6fe5090be39c74075e7a86d8750..a8d929a35f3c649ba86f8e2f57cce7fb9f2caac1 100644 --- a/src/calc.c +++ b/src/calc.c @@ -39,8 +39,18 @@ #include <sys/time.h> #include <dirent.h> -struct state_calc stcalc; +struct { + char err; /* 1/0, error or not */ + char cur[PATH_MAX]; /* current dir/item */ + char lasterr[PATH_MAX]; /* last unreadable dir/item */ + char errmsg[128]; /* error message, when err=1 */ + struct dir *parent; /* parent directory for the calculation */ + struct dir *orig; /* original directory, when recalculating */ + dev_t curdev; /* current device we're calculating on */ + suseconds_t lastupdate; /* time of the last screen update */ + int anpos; /* position of the animation string */ +} stcalc; /* My own implementation of realpath() @@ -288,7 +298,7 @@ void calc_draw_progress() { char ani[15]; int i; - nccreate(10, 60, stcalc.sterr == ST_QUIT ? "Calculating..." : "Recalculating..."); + nccreate(10, 60, stcalc.orig ? "Calculating..." : "Recalculating..."); ncprint(2, 2, "Total items: %-8d size: %s", stcalc.parent->items, formatsize(stcalc.parent->size, sflags & SF_SI)); @@ -368,12 +378,6 @@ void calc_process() { struct stat fs; struct dir *t; - /* init/reset global vars */ - stcalc.err = 0; - stcalc.lastupdate = 999; - stcalc.lasterr[0] = 0; - stcalc.anpos = 0; - /* check root directory */ if(rpath(stcalc.cur, tmp) == NULL || lstat(tmp, &fs) != 0 || !S_ISDIR(fs.st_mode)) { stcalc.err = 1; @@ -421,7 +425,18 @@ void calc_process() { fail: while(stcalc.err && !input_handle(0)) ; - pstate = stcalc.sterr; + pstate = stcalc.orig ? ST_BROWSE : ST_QUIT; return; } + +void calc_init(char *dir, struct dir *orig) { + stcalc.err = 0; + stcalc.lastupdate = 999; + stcalc.lasterr[0] = 0; + stcalc.anpos = 0; + stcalc.orig = orig; + strcpy(stcalc.cur, dir); + pstate = ST_CALC; +} + diff --git a/src/calc.h b/src/calc.h index fa8f0f0c79ad7f7593d5484a5103e1b32708ecff..fc28dafe8655a6bd4d3e4c8c9e0feb9fb69726fb 100644 --- a/src/calc.h +++ b/src/calc.h @@ -28,24 +28,10 @@ #include "ncdu.h" -struct state_calc { - char err; /* 1/0, error or not */ - char cur[PATH_MAX]; /* current dir/item */ - char lasterr[PATH_MAX]; /* last unreadable dir/item */ - char errmsg[128]; /* error message, when err=1 */ - struct dir *parent; /* parent directory for the calculation */ - struct dir *orig; /* original directory, when recalculating */ - dev_t curdev; /* current device we're calculating on */ - suseconds_t lastupdate; /* time of the last screen update */ - int anpos; /* position of the animation string */ - int sterr; /* state to go to on error (ST_BROWSE/ST_QUIT) */ -}; -extern struct state_calc stcalc; - - void calc_process(void); int calc_key(int); int calc_draw(void); +void calc_init(char *, struct dir *); #endif diff --git a/src/main.c b/src/main.c index f40dffe8e85ce7787445d3991811a9e7f1a065d7..dd6eb99bfcc144ec003e87ebb0fd5d6b4bf12b4d 100644 --- a/src/main.c +++ b/src/main.c @@ -137,11 +137,10 @@ void argv_parse(int argc, char **argv, char *dir) { /* main program */ int main(int argc, char **argv) { - argv_parse(argc, argv, stcalc.cur); + char dir[PATH_MAX]; + argv_parse(argc, argv, dir); - pstate = ST_CALC; - stcalc.sterr = ST_QUIT; - stcalc.orig = NULL; + calc_init(dir, NULL); stbrowse.flags = BF_SIZE | BF_DESC; stbrowse.graph = 0;