ncurses 5.5
[ncurses.git] / test / worm.c
index 5f0ab5dc4a5abbcadf329330c65e80b6f772eaf3..3840a3630378dd45783f427fe7a930e6eaeec09f 100644 (file)
@@ -34,21 +34,15 @@ 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.26 1999/10/23 01:31:40 tom Exp $
+  $Id: worm.c,v 1.39 2005/08/20 20:26:29 tom Exp $
 */
 
 #include <test.priv.h>
 
-#include <signal.h>
-
-#define typeAlloc(type,n) (type *) malloc(n * sizeof(type))
-#define typeRealloc(type,n,p) (type *) realloc(p, n * sizeof(type))
-
 static chtype flavor[] =
 {
     'O', '*', '#', '$', '%', '0', '@',
 };
-#define MAXWORMS       (sizeof(flavor)/sizeof(chtype))
 static const short xinc[] =
 {
     1, 1, 1, 0, -1, -1, -1, 0
@@ -66,7 +60,7 @@ static int length = 16, number = 3;
 static chtype trail = ' ';
 
 #ifdef TRACE
-int generation, trace_start, trace_end, singlestep;
+static int generation, trace_start, trace_end, singlestep;
 #endif /* TRACE */
 /* *INDENT-OFF* */
 static const struct options {
@@ -169,7 +163,7 @@ static RETSIGTYPE
 onsig(int sig GCC_UNUSED)
 {
     cleanup();
-    exit(EXIT_FAILURE);
+    ExitProgram(EXIT_FAILURE);
 }
 
 static float
@@ -185,13 +179,14 @@ main(int argc, char *argv[])
     short **ref;
     int x, y;
     int n;
-    int ch;
     struct worm *w;
     const struct options *op;
     int h;
     short *ip;
     int last, bottom;
 
+    setlocale(LC_ALL, "");
+
     for (x = 1; x < argc; x++) {
        char *p;
        p = argv[x];
@@ -206,7 +201,7 @@ main(int argc, char *argv[])
                goto usage;
            if ((length = atoi(argv[x])) < 2 || length > 1024) {
                fprintf(stderr, "%s: Invalid length\n", *argv);
-               return EXIT_FAILURE;
+               ExitProgram(EXIT_FAILURE);
            }
            break;
        case 'n':
@@ -214,7 +209,7 @@ main(int argc, char *argv[])
                goto usage;
            if ((number = atoi(argv[x])) < 1 || number > 40) {
                fprintf(stderr, "%s: Invalid number of worms\n", *argv);
-               return EXIT_FAILURE;
+               ExitProgram(EXIT_FAILURE);
            }
            break;
        case 't':
@@ -235,8 +230,8 @@ main(int argc, char *argv[])
        default:
          usage:
            fprintf(stderr,
-               "usage: %s [-field] [-length #] [-number #] [-trail]\n", *argv);
-           return EXIT_FAILURE;
+                   "usage: %s [-field] [-length #] [-number #] [-trail]\n", *argv);
+           ExitProgram(EXIT_FAILURE);
        }
     }
 
@@ -255,7 +250,7 @@ main(int argc, char *argv[])
     if (has_colors()) {
        int bg = COLOR_BLACK;
        start_color();
-#ifdef NCURSES_VERSION
+#if HAVE_USE_DEFAULT_COLORS
        if (use_default_colors() == OK)
            bg = -1;
 #endif
@@ -274,9 +269,9 @@ main(int argc, char *argv[])
     }
 #endif /* A_COLOR */
 
-    ref = typeAlloc(short *, LINES);
+    ref = typeMalloc(short *, LINES);
     for (y = 0; y < LINES; y++) {
-       ref[y] = typeAlloc(short, COLS);
+       ref[y] = typeMalloc(short, COLS);
        for (x = 0; x < COLS; x++) {
            ref[y][x] = 0;
        }
@@ -289,16 +284,16 @@ main(int argc, char *argv[])
 
     for (n = number, w = &worm[0]; --n >= 0; w++) {
        w->orientation = w->head = 0;
-       if (!(ip = typeAlloc(short, (length + 1)))) {
+       if (!(ip = typeMalloc(short, (length + 1)))) {
            fprintf(stderr, "%s: out of memory\n", *argv);
-           return EXIT_FAILURE;
+           ExitProgram(EXIT_FAILURE);
        }
        w->xpos = ip;
        for (x = length; --x >= 0;)
            *ip++ = -1;
-       if (!(ip = typeAlloc(short, (length + 1)))) {
+       if (!(ip = typeMalloc(short, (length + 1)))) {
            fprintf(stderr, "%s: out of memory\n", *argv);
-           return EXIT_FAILURE;
+           ExitProgram(EXIT_FAILURE);
        }
        w->ypos = ip;
        for (y = length; --y >= 0;)
@@ -338,6 +333,8 @@ main(int argc, char *argv[])
            generation++;
        }
 #else
+       int ch;
+
        if ((ch = getch()) > 0) {
 #ifdef KEY_RESIZE
            if (ch == KEY_RESIZE) {
@@ -350,11 +347,11 @@ main(int argc, char *argv[])
                    last = COLS - 1;
                }
                if (bottom != LINES - 1) {
-                   ref = typeRealloc(short *, LINES, ref);
-                   for (y = COLS; y <= bottom; y++)
+                   for (y = LINES; y <= bottom; y++)
                        free(ref[y]);
+                   ref = typeRealloc(short *, LINES, ref);
                    for (y = bottom + 1; y < LINES; y++) {
-                       ref[y] = typeAlloc(short, COLS);
+                       ref[y] = typeMalloc(short, COLS);
                        for (x = 0; x < COLS; x++)
                            ref[y][x] = 0;
                    }
@@ -364,11 +361,11 @@ main(int argc, char *argv[])
 #endif
            /*
             * Make it simple to put this into single-step mode, or resume
-            * normal operation -TD
+            * normal operation -T.Dickey
             */
            if (ch == 'q') {
                cleanup();
-               return (EXIT_SUCCESS);
+               ExitProgram(EXIT_SUCCESS);
            } else if (ch == 's') {
                nodelay(stdscr, FALSE);
            } else if (ch == ' ') {
@@ -380,7 +377,7 @@ main(int argc, char *argv[])
        for (n = 0, w = &worm[0]; n < number; n++, w++) {
            if ((x = w->xpos[h = w->head]) < 0) {
                move(y = w->ypos[h] = bottom, x = w->xpos[h] = 0);
-               addch(flavor[n % MAXWORMS]);
+               addch(flavor[n % SIZEOF(flavor)]);
                ref[y][x]++;
            } else {
                y = w->ypos[h];
@@ -403,14 +400,14 @@ main(int argc, char *argv[])
                }
            }
            op = &(x == 0 ? (y == 0 ? upleft : (y == bottom ? lowleft :
-                       left)) :
-               (x == last ? (y == 0 ? upright : (y == bottom ? lowright :
-                           right)) :
+                                               left)) :
+                  (x == last ? (y == 0 ? upright : (y == bottom ? lowright :
+                                                    right)) :
                    (y == 0 ? upper : (y == bottom ? lower : normal))))[w->orientation];
            switch (op->nopts) {
            case 0:
                cleanup();
-               return EXIT_SUCCESS;
+               ExitProgram(EXIT_SUCCESS);
            case 1:
                w->orientation = op->opts[0];
                break;
@@ -421,7 +418,7 @@ main(int argc, char *argv[])
 
            if (y < 0)
                y = 0;
-           addch(flavor[n % MAXWORMS]);
+           addch(flavor[n % SIZEOF(flavor)]);
            ref[w->ypos[h] = y][w->xpos[h] = x]++;
        }
        napms(10);