From c4be23a4c54f8cc75abaeac79db116aeefdff55f Mon Sep 17 00:00:00 2001
From: Yorhel <git@yorhel.nl>
Date: Sat, 11 Apr 2009 09:58:33 +0200
Subject: [PATCH] Each state can have it's own global variable
---
src/calc.c | 60 +++++++++++++++++++++++++++---------------------------
src/main.c | 21 ++++++++-----------
src/ncdu.h | 26 +++++++++++------------
3 files changed, 51 insertions(+), 56 deletions(-)
diff --git a/src/calc.c b/src/calc.c
index fb69e47..3342f98 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 329226b..12b059f 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 61e82ff..3b96629 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;
/*
--
GitLab