Skip to content
Snippets Groups Projects
Commit c4be23a4 authored by Yorhel's avatar Yorhel
Browse files

Each state can have it's own global variable

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