]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - test/blue.c
ncurses 5.6 - patch 20080112
[ncurses.git] / test / blue.c
index 4f7335132bbaa4bb4e94b85fe6c3b814dabdc811..0f15d01dce81958668ec971753a0760b697dbe94 100644 (file)
@@ -1,3 +1,30 @@
+/****************************************************************************
+ * Copyright (c) 1998-2005,2006 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            *
+ * "Software"), to deal in the Software without restriction, including      *
+ * without limitation the rights to use, copy, modify, merge, publish,      *
+ * distribute, distribute with modifications, sublicense, and/or sell       *
+ * copies of the Software, and to permit persons to whom the Software is    *
+ * furnished to do so, subject to the following conditions:                 *
+ *                                                                          *
+ * The above copyright notice and this permission notice shall be included  *
+ * in all copies or substantial portions of the Software.                   *
+ *                                                                          *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+ *                                                                          *
+ * Except as contained in this notice, the name(s) of the above copyright   *
+ * holders shall not be used in advertising or otherwise to promote the     *
+ * sale, use or other dealings in this Software without prior written       *
+ * authorization.                                                           *
+ ****************************************************************************/
 /*****************************************************************************
  *                                                                           *
  *                         B l u e   M o o n                                 *
  * results, use the ncurses(3) library.  On non-Intel machines, SVr4 curses is
  * just as good.
  *
- * $Id: blue.c,v 1.18 1999/01/17 00:11:56 tom Exp $
+ * $Id: blue.c,v 1.29 2006/05/20 15:38:18 tom Exp $
  */
 
 #include <test.priv.h>
 
-#include <string.h>
-#include <signal.h>
 #include <time.h>
 
-#include <term.h>
-
 #define NOCARD         (-1)
 
 #define ACE            0
@@ -55,7 +78,7 @@ static int deck[PACK_SIZE];
 static int grid[GRID_LENGTH];  /* card layout grid */
 static int freeptr[4];         /* free card space pointers */
 
-static int deal_number=0;
+static int deal_number = 0;
 
 static chtype ranks[SUIT_LENGTH][2] =
 {
@@ -94,7 +117,7 @@ static chtype letters[4] =
     OR_COLORS('c', BLACK_ON_WHITE),    /* clubs */
 };
 
-#if defined(__i386__)
+#if defined(__i386__) && defined(A_ALTCHARSET) && HAVE_TIGETSTR
 static chtype glyphs[] =
 {
     PC_COLORS('\003', RED_ON_WHITE),   /* hearts */
@@ -102,79 +125,82 @@ static chtype glyphs[] =
     PC_COLORS('\004', RED_ON_WHITE),   /* diamonds */
     PC_COLORS('\005', BLACK_ON_WHITE), /* clubs */
 };
+#define USE_CP437 1
+#else
+#define USE_CP437 0
 #endif /* __i386__ */
 
 static chtype *suits = letters;        /* this may change to glyphs below */
 
-static RETSIGTYPE die(int onsig)
+static RETSIGTYPE
+die(int onsig)
 {
     (void) signal(onsig, SIG_IGN);
     endwin();
-    exit(EXIT_SUCCESS);
+    ExitProgram(EXIT_SUCCESS);
 }
 
-static void init_vars(void)
+static void
+init_vars(void)
 {
     int i;
 
     deck_size = PACK_SIZE;
-    for (i=0; i < PACK_SIZE; i++)
-       deck[i]=i;
+    for (i = 0; i < PACK_SIZE; i++)
+       deck[i] = i;
     for (i = 0; i < 4; i++)
-       freeptr[i]=i * GRID_WIDTH;
+       freeptr[i] = i * GRID_WIDTH;
 }
 
-static void shuffle(int size)
+static void
+shuffle(int size)
 {
-    int i,j,numswaps,swapnum,temp;
+    int i, j, numswaps, swapnum, temp;
 
-    numswaps=size*10;          /* an arbitrary figure */
+    numswaps = size * 10;      /* an arbitrary figure */
 
-    for (swapnum=0;swapnum<numswaps;swapnum++)
-    {
-       i=rand() % size;
-       j=rand() % size;
-       temp=deck[i];
-       deck[i]=deck[j];
-       deck[j]=temp;
+    for (swapnum = 0; swapnum < numswaps; swapnum++) {
+       i = rand() % size;
+       j = rand() % size;
+       temp = deck[i];
+       deck[i] = deck[j];
+       deck[j] = temp;
     }
 }
 
-static void deal_cards(void)
+static void
+deal_cards(void)
 {
-    int ptr, card=0, value, csuit, crank, suit, aces[4];
-
-    for (suit=HEARTS;suit<=CLUBS;suit++)
-    {
-       ptr=freeptr[suit];
-       grid[ptr++]=NOCARD;     /* 1st card space is blank */
-       while ((ptr % GRID_WIDTH) != 0)
-       {
-           value=deck[card++];
-           crank=value % SUIT_LENGTH;
-           csuit=value / SUIT_LENGTH;
-           if (crank==ACE)
-               aces[csuit]=ptr;
-           grid[ptr++]=value;
+    int ptr, card = 0, value, csuit, crank, suit, aces[4];
+
+    for (suit = HEARTS; suit <= CLUBS; suit++) {
+       ptr = freeptr[suit];
+       grid[ptr++] = NOCARD;   /* 1st card space is blank */
+       while ((ptr % GRID_WIDTH) != 0) {
+           value = deck[card++];
+           crank = value % SUIT_LENGTH;
+           csuit = value / SUIT_LENGTH;
+           if (crank == ACE)
+               aces[csuit] = ptr;
+           grid[ptr++] = value;
        }
     }
 
-    if (deal_number==1)                /* shift the aces down to the 1st column */
-       for (suit=HEARTS;suit<=CLUBS;suit++)
-       {
+    if (deal_number == 1)      /* shift the aces down to the 1st column */
+       for (suit = HEARTS; suit <= CLUBS; suit++) {
            grid[suit * GRID_WIDTH] = suit * SUIT_LENGTH;
-           grid[aces[suit]]=NOCARD;
-           freeptr[suit]=aces[suit];
+           grid[aces[suit]] = NOCARD;
+           freeptr[suit] = aces[suit];
        }
 }
 
-static void printcard(int value)
+static void
+printcard(int value)
 {
     (void) addch(' ');
     if (value == NOCARD)
        (void) addstr("   ");
-    else
-    {
+    else {
        addch(ranks[value % SUIT_LENGTH][0] | COLOR_PAIR(BLUE_ON_WHITE));
        addch(ranks[value % SUIT_LENGTH][1] | COLOR_PAIR(BLUE_ON_WHITE));
        addch(suits[value / SUIT_LENGTH]);
@@ -182,151 +208,144 @@ static void printcard(int value)
     (void) addch(' ');
 }
 
-static void display_cards(int deal)
+static void
+display_cards(int deal)
 {
     int row, card;
 
     clear();
-    (void)printw(
-                "Blue Moon 2.1 - by Tim Lister & Eric Raymond - Deal %d.\n",
-                deal);
-    for(row=HEARTS;row<=CLUBS;row++)
-    {
+    (void) printw(
+                    "Blue Moon 2.1 - by Tim Lister & Eric Raymond - Deal %d.\n",
+                    deal);
+    for (row = HEARTS; row <= CLUBS; row++) {
        move(BASEROW + row + row + 2, 1);
-       for(card=0;card<GRID_WIDTH;card++)
+       for (card = 0; card < GRID_WIDTH; card++)
            printcard(grid[row * GRID_WIDTH + card]);
     }
 
-    move(PROMPTROW + 2, 0); refresh();
+    move(PROMPTROW + 2, 0);
+    refresh();
 #define P(x)   (void)printw("%s\n", x)
-P("   This 52-card solitaire starts with  the entire deck shuffled and dealt");
-P("out in four rows.  The aces are then moved to the left end of the layout,");
-P("making 4 initial free spaces.  You may move to a space only the card that");
-P("matches the left neighbor in suit, and is one greater in rank.  Kings are");
-P("high, so no cards may be placed to their right (they create dead spaces).");
-P("  When no moves can be made,  cards still out of sequence are  reshuffled");
-P("and dealt face up after the ends of the partial sequences, leaving a card");
-P("space after each sequence, so that each row looks like a partial sequence");
-P("followed by a space, followed by enough cards to make a row of 14.       ");
-P("  A moment's reflection will show that this game cannot take more than 13");
-P("deals. A good score is 1-3 deals, 4-7 is average, 8 or more is poor.     ");
+    P("   This 52-card solitaire starts with  the entire deck shuffled and dealt");
+    P("out in four rows.  The aces are then moved to the left end of the layout,");
+    P("making 4 initial free spaces.  You may move to a space only the card that");
+    P("matches the left neighbor in suit, and is one greater in rank.  Kings are");
+    P("high, so no cards may be placed to their right (they create dead spaces).");
+    P("  When no moves can be made,  cards still out of sequence are  reshuffled");
+    P("and dealt face up after the ends of the partial sequences, leaving a card");
+    P("space after each sequence, so that each row looks like a partial sequence");
+    P("followed by a space, followed by enough cards to make a row of 14.       ");
+    P("  A moment's reflection will show that this game cannot take more than 13");
+    P("deals. A good score is 1-3 deals, 4-7 is average, 8 or more is poor.     ");
 #undef P
     refresh();
 }
 
-static int find(int card)
+static int
+find(int card)
 {
     int i;
 
-    if ((card<0) || (card>=PACK_SIZE))
-       return(NOCARD);
-    for(i = 0; i < GRID_LENGTH; i++)
+    if ((card < 0) || (card >= PACK_SIZE))
+       return (NOCARD);
+    for (i = 0; i < GRID_LENGTH; i++)
        if (grid[i] == card)
            return i;
-    return(NOCARD);
+    return (NOCARD);
 }
 
-static void movecard(int src, int dst)
+static void
+movecard(int src, int dst)
 {
-    grid[dst]=grid[src];
-    grid[src]=NOCARD;
+    grid[dst] = grid[src];
+    grid[src] = NOCARD;
 
-    move( BASEROW + (dst / GRID_WIDTH)*2+2, (dst % GRID_WIDTH)*5 + 1);
+    move(BASEROW + (dst / GRID_WIDTH) * 2 + 2, (dst % GRID_WIDTH) * 5 + 1);
     printcard(grid[dst]);
 
-    move( BASEROW + (src / GRID_WIDTH)*2+2, (src % GRID_WIDTH)*5 + 1);
+    move(BASEROW + (src / GRID_WIDTH) * 2 + 2, (src % GRID_WIDTH) * 5 + 1);
     printcard(grid[src]);
 
     refresh();
 }
 
-static void play_game(void)
+static void
+play_game(void)
 {
-    int dead=0, i, j;
+    int dead = 0, i, j;
     char c;
     int selection[4], card;
 
-    while (dead<4)
-    {
-       dead=0;
-       for (i=0;i<4;i++)
-       {
-           card=grid[freeptr[i]-1];
+    while (dead < 4) {
+       dead = 0;
+       for (i = 0; i < 4; i++) {
+           card = grid[freeptr[i] - 1];
 
-           if (        ((card % SUIT_LENGTH)==KING)
+           if (((card % SUIT_LENGTH) == KING)
                ||
-               (card==NOCARD)  )
-               selection[i]=NOCARD;
+               (card == NOCARD))
+               selection[i] = NOCARD;
            else
-               selection[i]=find(card+1);
+               selection[i] = find(card + 1);
 
-           if (selection[i]==NOCARD)
+           if (selection[i] == NOCARD)
                dead++;
        };
 
-       if (dead < 4)
-       {
-           char        live[NSUITS+1], *lp = live;
-
-           for (i=0;i<4;i++)
-           {
-               if (selection[i] != NOCARD)
-               {
-                   move(BASEROW + (selection[i] / GRID_WIDTH)*2+3,
-                        (selection[i] % GRID_WIDTH)*5);
-                   (void)printw("   %c ", *lp++ = 'a' + i);
+       if (dead < 4) {
+           char live[NSUITS + 1], *lp = live;
+
+           for (i = 0; i < 4; i++) {
+               if (selection[i] != NOCARD) {
+                   move(BASEROW + (selection[i] / GRID_WIDTH) * 2 + 3,
+                        (selection[i] % GRID_WIDTH) * 5);
+                   (void) printw("   %c ", *lp++ = 'a' + i);
                }
            };
            *lp = '\0';
 
-           if (strlen(live) == 1)
-           {
-               move(PROMPTROW,0);
-               (void)printw(
-                   "Making forced moves...                                 ");
+           if (strlen(live) == 1) {
+               move(PROMPTROW, 0);
+               (void) printw(
+                                "Making forced moves...                                 ");
                refresh();
                (void) sleep(1);
                c = live[0];
-           }
-           else
-           {
-               char    buf[BUFSIZ];
+           } else {
+               char buf[BUFSIZ];
 
-               (void)sprintf(buf,
-                       "Type [%s] to move, r to redraw, q or INTR to quit: ",
-                       live);
+               (void) sprintf(buf,
+                              "Type [%s] to move, r to redraw, q or INTR to quit: ",
+                              live);
 
                do {
-                   move(PROMPTROW,0);
+                   move(PROMPTROW, 0);
                    (void) addstr(buf);
-                   move(PROMPTROW, (int)strlen(buf));
+                   move(PROMPTROW, (int) strlen(buf));
                    clrtoeol();
                    (void) addch(' ');
                } while
-                   (((c = getch())<'a' || c>'d') && (c!='r') && (c!='q'));
+                   (((c = getch()) < 'a' || c > 'd') && (c != 'r') && (c != 'q'));
            }
 
            for (j = 0; j < 4; j++)
-               if (selection[j]!=NOCARD)
-               {
-                   move(BASEROW + (selection[j] / GRID_WIDTH)*2+3,
-                        (selection[j] % GRID_WIDTH)*5);
-                   (void)printw("     ");
+               if (selection[j] != NOCARD) {
+                   move(BASEROW + (selection[j] / GRID_WIDTH) * 2 + 3,
+                        (selection[j] % GRID_WIDTH) * 5);
+                   (void) printw("     ");
                }
 
            if (c == 'r')
                display_cards(deal_number);
            else if (c == 'q')
                die(SIGINT);
-           else
-           {
-               i = c-'a';
+           else {
+               i = c - 'a';
                if (selection[i] == NOCARD)
                    beep();
-               else
-               {
+               else {
                    movecard(selection[i], freeptr[i]);
-                   freeptr[i]=selection[i];
+                   freeptr[i] = selection[i];
                }
            }
        }
@@ -334,94 +353,97 @@ static void play_game(void)
 
     move(PROMPTROW, 0);
     standout();
-    (void)printw("Finished deal %d - type any character to continue...", deal_number);
+    (void) printw("Finished deal %d - type any character to continue...", deal_number);
     standend();
     (void) getch();
 }
 
-static int collect_discards(void)
+static int
+collect_discards(void)
 {
-    int row, col, cardno=0, finish, gridno;
-
-    for (row=HEARTS;row<=CLUBS;row++)
-    {
-       finish=0;
-       for (col=1;col<GRID_WIDTH;col++)
-       {
-           gridno=row * GRID_WIDTH + col;
-
-           if ((grid[gridno]!=(grid[gridno-1]+1))&&(finish==0))
-           {
-               finish=1;
-               freeptr[row]=gridno;
+    int row, col, cardno = 0, finish, gridno;
+
+    for (row = HEARTS; row <= CLUBS; row++) {
+       finish = 0;
+       for (col = 1; col < GRID_WIDTH; col++) {
+           gridno = row * GRID_WIDTH + col;
+
+           if ((grid[gridno] != (grid[gridno - 1] + 1)) && (finish == 0)) {
+               finish = 1;
+               freeptr[row] = gridno;
            };
 
-           if ((finish!=0)&&(grid[gridno]!=NOCARD))
-               deck[cardno++]=grid[gridno];
+           if ((finish != 0) && (grid[gridno] != NOCARD))
+               deck[cardno++] = grid[gridno];
        }
     }
     return cardno;
 }
 
-static void game_finished(int deal)
+static void
+game_finished(int deal)
 {
     clear();
-    (void)printw("You finished the game in %d deals. This is ",deal);
+    (void) printw("You finished the game in %d deals. This is ", deal);
     standout();
-    if (deal<2)
-       (void)addstr("excellent");
-    else if (deal<4)
-       (void)addstr("good");
-    else if (deal<8)
-       (void)addstr("average");
+    if (deal < 2)
+       (void) addstr("excellent");
+    else if (deal < 4)
+       (void) addstr("good");
+    else if (deal < 8)
+       (void) addstr("average");
     else
-       (void)addstr("poor");
+       (void) addstr("poor");
     standend();
     (void) addstr(".         ");
     refresh();
 }
 
-int main(int argc, char *argv[])
+int
+main(int argc, char *argv[])
 {
-    (void) signal(SIGINT, die);
+    CATCHALL(die);
+
+    setlocale(LC_ALL, "");
+
     initscr();
 
     /*
      * We use COLOR_GREEN because COLOR_BLACK is wired to the wrong thing.
      */
     start_color();
-    init_pair(RED_ON_WHITE,    COLOR_RED,   COLOR_WHITE);
-    init_pair(BLUE_ON_WHITE,   COLOR_BLUE,  COLOR_WHITE);
-    init_pair(BLACK_ON_WHITE,  COLOR_BLACK, COLOR_WHITE);
+    init_pair(RED_ON_WHITE, COLOR_RED, COLOR_WHITE);
+    init_pair(BLUE_ON_WHITE, COLOR_BLUE, COLOR_WHITE);
+    init_pair(BLACK_ON_WHITE, COLOR_BLACK, COLOR_WHITE);
 
 #ifndef COLOR_PAIR
-    letters[0] = OR_COLORS('h', RED_ON_WHITE);         /* hearts */
+    letters[0] = OR_COLORS('h', RED_ON_WHITE); /* hearts */
     letters[1] = OR_COLORS('s', BLACK_ON_WHITE);       /* spades */
-    letters[2] = OR_COLORS('d', RED_ON_WHITE);         /* diamonds */
+    letters[2] = OR_COLORS('d', RED_ON_WHITE); /* diamonds */
     letters[3] = OR_COLORS('c', BLACK_ON_WHITE);       /* clubs */
-#if defined(__i386__) && defined(A_ALTCHARSET)
-    glyphs[0]  = PC_COLORS('\003', RED_ON_WHITE);      /* hearts */
-    glyphs[1]  = PC_COLORS('\006', BLACK_ON_WHITE);    /* spades */
-    glyphs[2]  = PC_COLORS('\004', RED_ON_WHITE);      /* diamonds */
-    glyphs[3]  = PC_COLORS('\005', BLACK_ON_WHITE);    /* clubs */
+#if USE_CP437
+    glyphs[0] = PC_COLORS('\003', RED_ON_WHITE);       /* hearts */
+    glyphs[1] = PC_COLORS('\006', BLACK_ON_WHITE);     /* spades */
+    glyphs[2] = PC_COLORS('\004', RED_ON_WHITE);       /* diamonds */
+    glyphs[3] = PC_COLORS('\005', BLACK_ON_WHITE);     /* clubs */
 #endif
 #endif
 
-#if defined(__i386__) && defined(A_ALTCHARSET)
+#if USE_CP437
     if (tigetstr("smpch"))
        suits = glyphs;
-#endif /* __i386__ && A_ALTCHARSET */
+#endif /* USE_CP437 */
 
     cbreak();
 
     if (argc == 2)
-       srand((unsigned)atoi(argv[1]));
+       srand((unsigned) atoi(argv[1]));
     else
-       srand((unsigned)time((time_t *)0));
+       srand((unsigned) time((time_t *) 0));
 
     init_vars();
 
-    do{
+    do {
        deal_number++;
        shuffle(deck_size);
        deal_cards();
@@ -429,12 +451,12 @@ int main(int argc, char *argv[])
        play_game();
     }
     while
-       ((deck_size=collect_discards()) != 0);
+       ((deck_size = collect_discards()) != 0);
 
     game_finished(deal_number);
 
     die(SIGINT);
-    /*NOTREACHED*/
+    /*NOTREACHED */
 }
 
 /* blue.c ends here */