X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fworm.c;h=98f099cb9cb6e94deb2af7b602705a4e9631dc69;hp=d78f9b9621ed9c184140ad17cff8a9f7bcfa10ae;hb=6af42291adceeb1bd8caab41e16762ec6d96529c;hpb=d44d7f381ba0173521cb788ba3adb12e261e5c96 diff --git a/test/worm.c b/test/worm.c index d78f9b96..98f099cb 100644 --- a/test/worm.c +++ b/test/worm.c @@ -61,7 +61,7 @@ Options: traces will be dumped. The program stops and waits for one character of input at the beginning and end of the interval. - $Id: worm.c,v 1.56 2008/02/23 23:08:57 tom Exp $ + $Id: worm.c,v 1.60 2010/11/13 20:21:21 tom Exp $ */ #include @@ -79,7 +79,7 @@ static chtype flavor[] = { 'O', '*', '#', '$', '%', '0', '@', }; -static const short xinc[] = +static const int xinc[] = { 1, 1, 1, 0, -1, -1, -1, 0 }, yinc[] = @@ -90,8 +90,8 @@ static const short xinc[] = typedef struct worm { int orientation; int head; - short *xpos; - short *ypos; + int *xpos; + int *ypos; chtype attrs; #ifdef USE_PTHREADS pthread_t thread; @@ -102,13 +102,14 @@ static unsigned long sequence = 0; static bool quitting = FALSE; static WORM worm[MAX_WORMS]; -static short **refs; +static int **refs; static int last_x, last_y; static const char *field; static int length = 16, number = 3; static chtype trail = ' '; +static unsigned pending; #ifdef TRACE static int generation, trace_start, trace_end; #endif /* TRACE */ @@ -215,11 +216,11 @@ onsig(int sig GCC_UNUSED) ExitProgram(EXIT_FAILURE); } -static float +static double ranf(void) { long r = (rand() & 077777); - return ((float) r / 32768.); + return ((double) r / 32768.); } static int @@ -227,6 +228,8 @@ draw_worm(WINDOW *win, void *data) { WORM *w = (WORM *) data; const struct options *op; + unsigned mask = (unsigned) (~(1 << (w - worm))); + chtype attrs = w->attrs | ((mask & pending) ? A_REVERSE : 0); int x; int y; @@ -236,7 +239,7 @@ draw_worm(WINDOW *win, void *data) if ((x = w->xpos[h = w->head]) < 0) { wmove(win, y = w->ypos[h] = last_y, x = w->xpos[h] = 0); - waddch(win, w->attrs); + waddch(win, attrs); refs[y][x]++; } else { y = w->ypos[h]; @@ -288,7 +291,7 @@ draw_worm(WINDOW *win, void *data) w->orientation = op->opts[0]; break; default: - w->orientation = op->opts[(int) (ranf() * (float) op->nopts)]; + w->orientation = op->opts[(int) (ranf() * (double) op->nopts)]; break; } @@ -299,7 +302,7 @@ draw_worm(WINDOW *win, void *data) if (y < 0) y = 0; - waddch(win, w->attrs); + waddch(win, attrs); w->ypos[h] = y; w->xpos[h] = x; @@ -311,9 +314,11 @@ draw_worm(WINDOW *win, void *data) #ifdef USE_PTHREADS static bool -quit_worm(void) +quit_worm(int bitnum) { + pending |= (1 << bitnum); napms(10); /* let the other thread(s) have a chance */ + pending &= ~(1 << bitnum); return quitting; } @@ -322,10 +327,14 @@ start_worm(void *arg) { unsigned long compare = 0; Trace(("start_worm")); - while (!quit_worm()) { + while (!quit_worm(((struct worm *) arg) - worm)) { while (compare < sequence) { ++compare; +#if HAVE_USE_WINDOW use_window(stdscr, draw_worm, arg); +#else + draw_worm(stdscr, arg); +#endif } } Trace(("...start_worm (done)")); @@ -351,7 +360,13 @@ draw_all_worms(void) } #else for (n = 0, w = &worm[0]; n < number; n++, w++) { - if (use_window(stdscr, draw_worm, w)) + if ( +#if HAVE_USE_WINDOW + USING_WINDOW2(stdscr, draw_worm, w) +#else + draw_worm(stdscr, w) +#endif + ) done = TRUE; } #endif @@ -375,7 +390,7 @@ update_refs(WINDOW *win) (void) win; if (last_x != COLS - 1) { for (y = 0; y <= last_y; y++) { - refs[y] = typeRealloc(short, COLS, refs[y]); + refs[y] = typeRealloc(int, (size_t) COLS, refs[y]); for (x = last_x + 1; x < COLS; x++) refs[y][x] = 0; } @@ -384,9 +399,9 @@ update_refs(WINDOW *win) if (last_y != LINES - 1) { for (y = LINES; y <= last_y; y++) free(refs[y]); - refs = typeRealloc(short *, LINES, refs); + refs = typeRealloc(int *, (size_t) LINES, refs); for (y = last_y + 1; y < LINES; y++) { - refs[y] = typeMalloc(short, COLS); + refs[y] = typeMalloc(int, (size_t) COLS); for (x = 0; x < COLS; x++) refs[y][x] = 0; } @@ -402,7 +417,7 @@ main(int argc, char *argv[]) int x, y; int n; struct worm *w; - short *ip; + int *ip; bool done = FALSE; setlocale(LC_ALL, ""); @@ -473,7 +488,7 @@ main(int argc, char *argv[]) #endif #define SET_COLOR(num, fg) \ - init_pair(num+1, fg, bg); \ + init_pair(num+1, (short) fg, (short) bg); \ flavor[num] |= COLOR_PAIR(num+1) | A_BOLD SET_COLOR(0, COLOR_GREEN); @@ -486,9 +501,9 @@ main(int argc, char *argv[]) } #endif /* A_COLOR */ - refs = typeMalloc(short *, LINES); + refs = typeMalloc(int *, (size_t) LINES); for (y = 0; y < LINES; y++) { - refs[y] = typeMalloc(short, COLS); + refs[y] = typeMalloc(int, (size_t) COLS); for (x = 0; x < COLS; x++) { refs[y][x] = 0; } @@ -500,18 +515,18 @@ main(int argc, char *argv[]) #endif /* BADCORNER */ for (n = number, w = &worm[0]; --n >= 0; w++) { - w->attrs = flavor[n % SIZEOF(flavor)]; + w->attrs = flavor[(unsigned) n % SIZEOF(flavor)]; w->orientation = 0; w->head = 0; - if (!(ip = typeMalloc(short, (length + 1)))) { + if (!(ip = typeMalloc(int, (size_t) (length + 1)))) { fprintf(stderr, "%s: out of memory\n", *argv); ExitProgram(EXIT_FAILURE); } w->xpos = ip; for (x = length; --x >= 0;) *ip++ = -1; - if (!(ip = typeMalloc(short, (length + 1)))) { + if (!(ip = typeMalloc(int, (size_t) (length + 1)))) { fprintf(stderr, "%s: out of memory\n", *argv); ExitProgram(EXIT_FAILURE); }