diff --git a/src/calc.c b/src/calc.c index fb69e472a98a80e4a8ed1a82c59c518f66bd8d03..3342f981453d3140c926cc8c593837cd6e7c0b56 100644 --- a/src/calc.c +++ b/src/calc.c @@ -173,7 +173,7 @@ int calc_item(struct dir *par, char *path, char *name) { if(matchExclude(tmp)) d->flags |= FF_EXL; - if(sflags & SF_SMFS && pstate.calc.curdev != fs.st_dev) + if(sflags & SF_SMFS && stcalc.curdev != fs.st_dev) d->flags |= FF_OTHFS; /* determine type of this item */ @@ -213,7 +213,7 @@ int calc_dir(struct dir *dest, char *path) { /* open directory */ if((dir = opendir(path)) == NULL) { - strcpy(pstate.calc.lasterr, path); + strcpy(stcalc.lasterr, path); dest->flags |= FF_ERR; t = dest; while((t = t->parent) != NULL) @@ -274,29 +274,29 @@ void calc_draw_progress() { nccreate(10, 60, dat == NULL ? "Calculating..." : "Recalculating..."); ncprint(2, 2, "Total items: %-8d size: %s", - pstate.calc.parent->items, cropsize(pstate.calc.parent->size)); - ncprint(3, 2, "Current dir: %s", cropdir(pstate.calc.cur, 43)); + stcalc.parent->items, cropsize(stcalc.parent->size)); + ncprint(3, 2, "Current dir: %s", cropdir(stcalc.cur, 43)); ncaddstr(8, 43, "Press q to quit"); /* show warning if we couldn't open a dir */ - if(pstate.calc.lasterr[0] != '\0') { + if(stcalc.lasterr[0] != '\0') { attron(A_BOLD); ncaddstr(5, 2, "Warning:"); attroff(A_BOLD); - ncprint(5, 11, "could not open %-32s", cropdir(pstate.calc.lasterr, 32)); + ncprint(5, 11, "could not open %-32s", cropdir(stcalc.lasterr, 32)); ncaddstr(6, 3, "some directory sizes may not be correct"); } /* animation - but only if the screen refreshes more than or once every second */ if(sdelay <= 1000) { - if(++pstate.calc.anpos == 28) - pstate.calc.anpos = 0; + if(++stcalc.anpos == 28) + stcalc.anpos = 0; strcpy(ani, " "); - if(pstate.calc.anpos < 14) - for(i=0; i<=pstate.calc.anpos; i++) + if(stcalc.anpos < 14) + for(i=0; i<=stcalc.anpos; i++) ani[i] = antext[i]; else - for(i=13; i>pstate.calc.anpos-14; i--) + for(i=13; i>stcalc.anpos-14; i--) ani[i] = antext[i]; } else strcpy(ani, antext); @@ -320,17 +320,17 @@ void calc_draw_error(char *cur, char *msg) { int calc_draw() { struct timeval tv; - if(pstate.calc.err) { - calc_draw_error(pstate.calc.cur, pstate.calc.errmsg); + if(stcalc.err) { + calc_draw_error(stcalc.cur, stcalc.errmsg); return 0; } /* should we really draw the screen again? */ gettimeofday(&tv, (void *)NULL); tv.tv_usec = (1000*(tv.tv_sec % 1000) + (tv.tv_usec / 1000)) / sdelay; - if(pstate.calc.lastupdate != tv.tv_usec) { + if(stcalc.lastupdate != tv.tv_usec) { calc_draw_progress(); - pstate.calc.lastupdate = tv.tv_usec; + stcalc.lastupdate = tv.tv_usec; return 0; } return 1; @@ -338,7 +338,7 @@ int calc_draw() { int calc_key(int ch) { - if(pstate.calc.err) + if(stcalc.err) return 1; if(ch == 'q') return 1; @@ -352,15 +352,15 @@ void calc_process() { struct dir *t; /* init/reset global vars */ - pstate.calc.err = 0; - pstate.calc.lastupdate = 999; - pstate.calc.lasterr[0] = 0; - pstate.calc.anpos = 0; + stcalc.err = 0; + stcalc.lastupdate = 999; + stcalc.lasterr[0] = 0; + stcalc.anpos = 0; /* check root directory */ - if(rpath(pstate.calc.cur, tmp) == NULL || lstat(tmp, &fs) != 0 || !S_ISDIR(fs.st_mode)) { - pstate.calc.err = 1; - strcpy(pstate.calc.errmsg, "Directory not found"); + if(rpath(stcalc.cur, tmp) == NULL || lstat(tmp, &fs) != 0 || !S_ISDIR(fs.st_mode)) { + stcalc.err = 1; + strcpy(stcalc.errmsg, "Directory not found"); goto fail; } @@ -371,21 +371,21 @@ void calc_process() { t->flags |= FF_DIR; t->name = (char *) malloc(strlen(tmp)+1); strcpy(t->name, tmp); - pstate.calc.parent = t; - pstate.calc.curdev = fs.st_dev; + stcalc.parent = t; + stcalc.curdev = fs.st_dev; /* start calculating */ - if(!calc_dir(pstate.calc.parent, tmp) && !pstate.calc.err) { - pstate.st = ST_BROWSE; + if(!calc_dir(stcalc.parent, tmp) && !stcalc.err) { + pstate = ST_BROWSE; return; } /* something went wrong... */ - freedir(pstate.calc.parent); + freedir(stcalc.parent); fail: - while(pstate.calc.err && !input_handle(0)) + while(stcalc.err && !input_handle(0)) ; - pstate.st = dat != NULL ? ST_BROWSE : ST_QUIT; + pstate = stcalc.sterr; return; } diff --git a/src/main.c b/src/main.c index 329226b4108ec11faf9926df9b67d335796686ff..12b059f013a735ad3a33782eb1986429482394f7 100644 --- a/src/main.c +++ b/src/main.c @@ -31,12 +31,13 @@ int winrows, wincols; char sdir[PATH_MAX]; int sflags, bflags, sdelay, bgraph; int subwinc, subwinr; -struct state pstate; +int pstate; +struct state_calc stcalc; void screen_draw() { int n = 1; - switch(pstate.st) { + switch(pstate) { case ST_CALC: n = calc_draw(); } if(!n) @@ -55,7 +56,7 @@ int input_handle(int wait) { screen_draw(); continue; } - switch(pstate.st) { + switch(pstate) { case ST_CALC: return calc_key(ch); } } @@ -131,9 +132,9 @@ void argv_parse(int argc, char **argv, char *dir) { int main(int argc, char **argv) { dat = NULL; - memset((void *)&pstate, 0, sizeof(struct state)); - argv_parse(argc, argv, pstate.calc.cur); - pstate.st = ST_CALC; + argv_parse(argc, argv, stcalc.cur); + pstate = ST_CALC; + stcalc.sterr = ST_QUIT; initscr(); cbreak(); @@ -142,17 +143,13 @@ int main(int argc, char **argv) { keypad(stdscr, TRUE); ncresize(); - while(pstate.st != ST_QUIT) { - if(pstate.st == ST_CALC) + while(pstate != ST_QUIT) { + if(pstate == ST_CALC) calc_process(); /*else wait_for_input() */ } - /* - if((dat = showCalc(pstate.calc.root)) != NULL) - showBrowser();*/ - erase(); refresh(); endwin(); diff --git a/src/ncdu.h b/src/ncdu.h index 61e82ff9f1069caa7ad062359398d0feedfb6dd3..3b966291f2af165d7687bdc275e2d7904a147a25 100644 --- a/src/ncdu.h +++ b/src/ncdu.h @@ -136,19 +136,16 @@ struct dir { unsigned char flags; }; -struct state { - int st; /* SC_x */ - struct { - char err; - char cur[PATH_MAX]; - char lasterr[PATH_MAX]; - char errmsg[128]; - struct dir *parent; - dev_t curdev; - suseconds_t lastupdate; - int anpos; - } calc; - /* TODO: information structs for the other states */ +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 */ + 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) */ }; @@ -168,7 +165,8 @@ extern int sflags, bflags, sdelay, bgraph; /* used for creating windows */ extern int subwinr, subwinc; /* program state */ -extern struct state pstate; +extern int pstate; +extern struct state_calc stcalc; /*