X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fgdc.c;h=c466f2fde2674d95849d355f4bd980da2913f581;hp=6bf3830145ed789efe8ab887747513827dda18f1;hb=46722468f47c2b77b3987729b4bcf2321cccfd01;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/test/gdc.c b/test/gdc.c index 6bf38301..c466f2fd 100644 --- a/test/gdc.c +++ b/test/gdc.c @@ -6,210 +6,311 @@ * modified 10-18-89 for curses (jrl) * 10-18-89 added signal handling * - * $Id: gdc.c,v 1.8 1997/01/19 00:59:28 tom Exp $ + * $Id: gdc.c,v 1.23 2002/08/10 19:20:14 tom Exp $ */ -#include - #include -#include -#include + +#include #define YBASE 10 #define XBASE 10 #define XLENGTH 54 #define YDEPTH 5 -/* it won't be */ -static time_t now; /* yeah! */ -static struct tm *tm; - -static short disp[11] = { - 075557, 011111, 071747, 071717, 055711, - 074717, 074757, 071111, 075757, 075717, 002020 +static short disp[11] = +{ + 075557, 011111, 071747, 071717, 055711, + 074717, 074757, 071111, 075757, 075717, 002020 }; -static long old[6], next[6], new[6], mask; -static char scrol; +static long older[6], next[6], newer[6], mask; static int sigtermed = 0; +static bool redirected = FALSE; +static bool hascolor = FALSE; + +static RETSIGTYPE +sighndl(int signo) +{ + signal(signo, sighndl); + sigtermed = signo; + if (redirected) { + endwin(); + ExitProgram(EXIT_FAILURE); + } +} + +static void +drawbox(void) +{ + chtype bottom[XLENGTH + 1]; + int n; + + if (hascolor) + attrset(COLOR_PAIR(3)); + + mvaddch(YBASE - 1, XBASE - 1, ACS_ULCORNER); + hline(ACS_HLINE, XLENGTH); + mvaddch(YBASE - 1, XBASE + XLENGTH, ACS_URCORNER); + + mvaddch(YBASE + YDEPTH, XBASE - 1, ACS_LLCORNER); + mvinchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH); + for (n = 0; n < XLENGTH; n++) + bottom[n] = ACS_HLINE | (bottom[n] & (A_ATTRIBUTES | A_COLOR)); + mvaddchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH); + mvaddch(YBASE + YDEPTH, XBASE + XLENGTH, ACS_LRCORNER); + + move(YBASE, XBASE - 1); + vline(ACS_VLINE, YDEPTH); -static int hascolor = 0; + move(YBASE, XBASE + XLENGTH); + vline(ACS_VLINE, YDEPTH); -static void set(int, int); -static void standt(int); -static void movto(int, int); + if (hascolor) + attrset(COLOR_PAIR(2)); +} -static -RETSIGTYPE sighndl(int signo) +static void +standt(int on) +{ + if (on) { + if (hascolor) { + attron(COLOR_PAIR(1)); + } else { + attron(A_STANDOUT); + } + } else { + if (hascolor) { + attron(COLOR_PAIR(2)); + } else { + attroff(A_STANDOUT); + } + } +} + +static void +set(int t, int n) +{ + int i, m; + + m = 7 << n; + for (i = 0; i < 5; i++) { + next[i] |= ((disp[t] >> ((4 - i) * 3)) & 07) << n; + mask |= (next[i] ^ older[i]) & m; + } + if (mask & m) + mask |= m; +} + +static void +usage(void) { - signal(signo, sighndl); - sigtermed=signo; + static const char *msg[] = + { + "Usage: gdc [options] [count]" + ,"" + ,"Options:" + ," -n redirect input to /dev/null" + ," -s scroll each number into place, rather than flipping" + ,"" + ,"If you specify a count, gdc runs for that number of seconds" + }; + unsigned j; + for (j = 0; j < SIZEOF(msg); j++) + fprintf(stderr, "%s\n", msg[j]); + ExitProgram(EXIT_FAILURE); } int main(int argc, char *argv[]) { -long t, a; -int i, j, s, k; -int n = 0; + time_t now; + struct tm *tm; + long t, a; + int i, j, s, k; + int count = 0; + FILE *ofp = stdout; + FILE *ifp = stdin; + bool scrol = FALSE; - signal(SIGINT,sighndl); - signal(SIGTERM,sighndl); - signal(SIGKILL,sighndl); + setlocale(LC_ALL, ""); - initscr(); - cbreak(); - noecho(); - nodelay(stdscr, 1); - - hascolor = has_colors(); - - if(hascolor) { - int bg = COLOR_BLACK; - start_color(); -#ifdef NCURSES_VERSION - if (use_default_colors() == OK) - bg = -1; -#endif - init_pair(1, COLOR_BLACK, COLOR_RED); - init_pair(2, COLOR_RED, bg); - init_pair(3, COLOR_WHITE, bg); - attrset(COLOR_PAIR(2)); + signal(SIGINT, sighndl); + signal(SIGTERM, sighndl); + + while ((k = getopt(argc, argv, "sn")) != EOF) { + switch (k) { + case 's': + scrol = TRUE; + break; + case 'n': + ifp = fopen("/dev/null", "r"); + redirected = TRUE; + break; + default: + usage(); } + } + if (optind < argc) { + count = atoi(argv[optind++]); + } + if (optind < argc) + usage(); - clear(); - refresh(); - while(--argc > 0) { - if(**++argv == '-') - scrol = 1; - else - n = atoi(*argv); + if (redirected) { + char *name = getenv("TERM"); + if (name == 0 + || newterm(name, ofp, ifp) == 0) { + fprintf(stderr, "cannot open terminal\n"); + ExitProgram(EXIT_FAILURE); } - if(hascolor) { - attrset(COLOR_PAIR(3)); + } else { + initscr(); + } + cbreak(); + noecho(); + nodelay(stdscr, 1); + curs_set(0); - mvaddch(YBASE - 1, XBASE - 1, ACS_ULCORNER); - hline(ACS_HLINE, XLENGTH); - mvaddch(YBASE - 1, XBASE + XLENGTH, ACS_URCORNER); + hascolor = has_colors(); - mvaddch(YBASE + YDEPTH, XBASE - 1, ACS_LLCORNER); - hline(ACS_HLINE, XLENGTH); - mvaddch(YBASE + YDEPTH, XBASE + XLENGTH, ACS_LRCORNER); + if (hascolor) { + int bg = COLOR_BLACK; + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (use_default_colors() == OK) + bg = -1; +#endif + init_pair(1, COLOR_BLACK, COLOR_RED); + init_pair(2, COLOR_RED, bg); + init_pair(3, COLOR_WHITE, bg); + attrset(COLOR_PAIR(2)); + } - move(YBASE, XBASE - 1); - vline(ACS_VLINE, YDEPTH); + restart: + for (j = 0; j < 5; j++) + older[j] = newer[j] = next[j] = 0; - move(YBASE, XBASE + XLENGTH); - vline(ACS_VLINE, YDEPTH); + clear(); + drawbox(); - attrset(COLOR_PAIR(2)); - } - do { - char buf[30]; - - mask = 0; - time(&now); - tm = localtime(&now); - set(tm->tm_sec%10, 0); - set(tm->tm_sec/10, 4); - set(tm->tm_min%10, 10); - set(tm->tm_min/10, 14); - set(tm->tm_hour%10, 20); - set(tm->tm_hour/10, 24); - set(10, 7); - set(10, 17); - for(k=0; k<6; k++) { - if(scrol) { - for(i=0; i<5; i++) - new[i] = (new[i]&~mask) | (new[i+1]&mask); - new[5] = (new[5]&~mask) | (next[k]&mask); - } else - new[k] = (new[k]&~mask) | (next[k]&mask); - next[k] = 0; - for(s=1; s>=0; s--) { - standt(s); - for(i=0; i<6; i++) { - if((a = (new[i]^old[i])&(s ? new : old)[i]) != 0) { - for(j=0,t=1<<26; t; t>>=1,j++) { - if(a&t) { - if(!(a&(t<<1))) { - movto(YBASE + i, XBASE + 2*j); - } - addstr(" "); - } - } - } - if(!s) { - old[i] = new[i]; - } - } - if(!s) { - refresh(); + do { + char buf[30]; + + time(&now); + tm = localtime(&now); + + mask = 0; + set(tm->tm_sec % 10, 0); + set(tm->tm_sec / 10, 4); + set(tm->tm_min % 10, 10); + set(tm->tm_min / 10, 14); + set(tm->tm_hour % 10, 20); + set(tm->tm_hour / 10, 24); + set(10, 7); + set(10, 17); + + for (k = 0; k < 6; k++) { + if (scrol) { + for (i = 0; i < 5; i++) + newer[i] = (newer[i] & ~mask) | (newer[i + 1] & mask); + newer[5] = (newer[5] & ~mask) | (next[k] & mask); + } else + newer[k] = (newer[k] & ~mask) | (next[k] & mask); + next[k] = 0; + for (s = 1; s >= 0; s--) { + standt(s); + for (i = 0; i < 6; i++) { + if ((a = (newer[i] ^ older[i]) & (s ? newer : older)[i]) + != 0) { + for (j = 0, t = 1 << 26; t; t >>= 1, j++) { + if (a & t) { + if (!(a & (t << 1))) { + move(YBASE + i, XBASE + 2 * j); } + addstr(" "); + } } + } + if (!s) { + older[i] = newer[i]; + } } - - /* this depends on the detailed format of ctime(3) */ - (void) strcpy(buf, ctime(&now)); - (void) strcpy(buf + 10, buf + 19); - mvaddstr(16, 30, buf); - - movto(6, 0); - refresh(); - sleep(1); - while(wgetch(stdscr) != ERR) - continue; - if (sigtermed) { - standend(); - clear(); - refresh(); - endwin(); - fprintf(stderr, "gdc terminated by signal %d\n", sigtermed); - return EXIT_FAILURE; + if (!s) { + if (scrol) + drawbox(); + refresh(); + /* + * If we're scrolling, space out the refreshes to fake + * movement. That's 7 frames, or 6 intervals, which would + * be 166 msec if we spread it out over a second. It looks + * better (but will well on a slow terminal, e.g., less + * than 9600bd) to squeeze that into a half-second, and use + * half of 170 msec to ensure that the program doesn't eat + * a lot of time when asking what time it is, at the top of + * this loop -TD + */ + if (scrol) + napms(85); } - } while(--n); - standend(); - clear(); - refresh(); - endwin(); - return EXIT_SUCCESS; -} + } + } -static void -set(int t, int n) -{ -int i, m; + /* this depends on the detailed format of ctime(3) */ + (void) strcpy(buf, ctime(&now)); + (void) strcpy(buf + 10, buf + 19); + mvaddstr(16, 30, buf); - m = 7<>(4-i)*3)&07)<