]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - test/worm.c
ncurses 6.0 - patch 20170930
[ncurses.git] / test / worm.c
index c3fc0da822ef2619246c5ed831c0d9eb9bee48af..70c92a2167b390be707585142587320a8fbd8514 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2016,2017 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
 
                July 1995 (esr): worms is now in living color! :-)
 
-Options:
-       -f                      fill screen with copies of 'WORM' at start.
-       -l <n>                  set worm length
-       -n <n>                  set number of worms
-       -t                      make worms leave droppings
-       -T <start> <end>        set trace interval
-       -S                      set single-stepping during trace interval
-       -N                      suppress cursor-movement optimization
-
   This program makes a good torture-test for the ncurses cursor-optimization
   code.  You can use -T to set the worm move interval over which movement
   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.65 2013/06/22 20:01:41 tom Exp $
+  $Id: worm.c,v 1.75 2017/09/08 20:00:50 tom Exp $
 */
 
 #include <test.priv.h>
 
+#ifndef NCURSES_VERSION
+#undef TRACE
+#endif
+
 #ifdef USE_PTHREADS
 #include <pthread.h>
 #endif
@@ -201,20 +196,21 @@ static const struct options {
 };
 /* *INDENT-ON* */
 
+#ifdef KEY_RESIZE
 static void
 failed(const char *s)
 {
     perror(s);
-    endwin();
+    exit_curses();
     ExitProgram(EXIT_FAILURE);
 }
+#endif
 
 static void
 cleanup(void)
 {
     USING_WINDOW(stdscr, wrefresh);
-    curs_set(1);
-    endwin();
+    exit_curses();
 }
 
 static void
@@ -324,9 +320,9 @@ draw_worm(WINDOW *win, void *data)
 static bool
 quit_worm(int bitnum)
 {
-    pending |= (1 << bitnum);
+    pending = (pending | (unsigned) (1 << bitnum));
     napms(10);                 /* let the other thread(s) have a chance */
-    pending &= ~(1 << bitnum);
+    pending = (pending & (unsigned) ~(1 << bitnum));
     return quitting;
 }
 
@@ -335,7 +331,7 @@ start_worm(void *arg)
 {
     unsigned long compare = 0;
     Trace(("start_worm"));
-    while (!quit_worm(((struct worm *) arg) - worm)) {
+    while (!quit_worm((int) (((struct worm *) arg) - worm))) {
        while (compare < sequence) {
            ++compare;
 #if HAVE_USE_WINDOW
@@ -422,41 +418,70 @@ update_refs(WINDOW *win)
 }
 #endif
 
+static void
+usage(void)
+{
+    static const char *msg[] =
+    {
+       "Usage: worm [options]"
+       ,""
+       ,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+       ," -d       invoke use_default_colors"
+#endif
+       ," -f       fill screen with copies of \"WORM\" at start"
+       ," -l <n>   set length of worms"
+       ," -n <n>   set number of worms"
+       ," -t       leave trail of \".\""
+#ifdef TRACE
+       ," -T <start>,<end> set trace interval"
+       ," -N       suppress cursor-movement optimization"
+#endif
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+       fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(EXIT_FAILURE);
+}
+
 int
 main(int argc, char *argv[])
 {
+    int ch;
     int x, y;
     int n;
     struct worm *w;
     int *ip;
     bool done = FALSE;
     int max_refs;
+#if HAVE_USE_DEFAULT_COLORS
+    bool opt_d = FALSE;
+#endif
 
     setlocale(LC_ALL, "");
 
-    for (x = 1; x < argc; x++) {
-       char *p;
-       p = argv[x];
-       if (*p == '-')
-           p++;
-       switch (*p) {
+    while ((ch = getopt(argc, argv, "dfl:n:tT:N")) != -1) {
+       switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+       case 'd':
+           opt_d = TRUE;
+           break;
+#endif
        case 'f':
            field = "WORM";
            break;
        case 'l':
-           if (++x == argc)
-               goto usage;
-           if ((length = atoi(argv[x])) < 2 || length > MAX_LENGTH) {
+           if ((length = atoi(optarg)) < 2 || length > MAX_LENGTH) {
                fprintf(stderr, "%s: Invalid length\n", *argv);
-               ExitProgram(EXIT_FAILURE);
+               usage();
            }
            break;
        case 'n':
-           if (++x == argc)
-               goto usage;
-           if ((number = atoi(argv[x])) < 1 || number > MAX_WORMS) {
+           if ((number = atoi(optarg)) < 1 || number > MAX_WORMS) {
                fprintf(stderr, "%s: Invalid number of worms\n", *argv);
-               ExitProgram(EXIT_FAILURE);
+               usage();
            }
            break;
        case 't':
@@ -464,20 +489,20 @@ main(int argc, char *argv[])
            break;
 #ifdef TRACE
        case 'T':
-           trace_start = atoi(argv[++x]);
-           trace_end = atoi(argv[++x]);
+           if (sscanf(optarg, "%d,%d", &trace_start, &trace_end) != 2)
+               usage();
            break;
        case 'N':
            _nc_optimize_enable ^= OPTIMIZE_ALL;        /* declared by ncurses */
            break;
 #endif /* TRACE */
        default:
-         usage:
-           fprintf(stderr,
-                   "usage: %s [-field] [-length #] [-number #] [-trail]\n", *argv);
-           ExitProgram(EXIT_FAILURE);
+           usage();
+           /* NOTREACHED */
        }
     }
+    if (optind < argc)
+       usage();
 
     signal(SIGINT, onsig);
     initscr();
@@ -495,7 +520,7 @@ main(int argc, char *argv[])
        int bg = COLOR_BLACK;
        start_color();
 #if HAVE_USE_DEFAULT_COLORS
-       if (use_default_colors() == OK)
+       if (opt_d && (use_default_colors() == OK))
            bg = -1;
 #endif
 
@@ -562,8 +587,6 @@ main(int argc, char *argv[])
     nodelay(stdscr, TRUE);
 
     while (!done) {
-       int ch;
-
        ++sequence;
        if ((ch = get_input()) > 0) {
 #ifdef TRACE
@@ -608,7 +631,7 @@ main(int argc, char *argv[])
 
     Trace(("Cleanup"));
     cleanup();
-#ifdef NO_LEAKS
+#if NO_LEAKS
     for (y = 0; y < max_refs; y++) {
        free(refs[y]);
     }