]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - fish/fish.c
Correct capital of the Philippines, allow usual spelling of Jakarta
[bsdgames-darwin.git] / fish / fish.c
index 182305e5990c2e249e3a5d5072203b03599e851c..25c1977e64c23961361c564e16eb85591ba1d5e7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: fish.c,v 1.5 1997/11/16 21:41:53 christos Exp $        */
+/*     $NetBSD: fish.c,v 1.12 2000/03/28 19:37:54 tron Exp $   */
 
 /*-
  * Copyright (c) 1990, 1993
 
 /*-
  * Copyright (c) 1990, 1993
@@ -46,7 +46,7 @@ __COPYRIGHT("@(#) Copyright (c) 1990, 1993\n\
 #if 0
 static char sccsid[] = "@(#)fish.c     8.1 (Berkeley) 5/31/93";
 #else
 #if 0
 static char sccsid[] = "@(#)fish.c     8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: fish.c,v 1.5 1997/11/16 21:41:53 christos Exp $");
+__RCSID("$NetBSD: fish.c,v 1.12 2000/03/28 19:37:54 tron Exp $");
 #endif
 #endif /* not lint */
 
 #endif
 #endif /* not lint */
 
@@ -65,25 +65,27 @@ __RCSID("$NetBSD: fish.c,v 1.5 1997/11/16 21:41:53 christos Exp $");
 #define        RANKS           13
 #define        HANDSIZE        7
 #define        CARDS           4
 #define        RANKS           13
 #define        HANDSIZE        7
 #define        CARDS           4
+#define        TOTCARDS        RANKS * CARDS
 
 #define        USER            1
 #define        COMPUTER        0
 #define        OTHER(a)        (1 - (a))
 
 
 #define        USER            1
 #define        COMPUTER        0
 #define        OTHER(a)        (1 - (a))
 
-char *cards[] = {
+const char *const cards[] = {
        "A", "2", "3", "4", "5", "6", "7",
        "8", "9", "10", "J", "Q", "K", NULL,
 };
 #define        PRC(card)       (void)printf(" %s", cards[card])
 
 int promode;
        "A", "2", "3", "4", "5", "6", "7",
        "8", "9", "10", "J", "Q", "K", NULL,
 };
 #define        PRC(card)       (void)printf(" %s", cards[card])
 
 int promode;
-int asked[RANKS], comphand[RANKS], deck[RANKS];
+int asked[RANKS], comphand[RANKS], deck[TOTCARDS];
 int userasked[RANKS], userhand[RANKS];
 int userasked[RANKS], userhand[RANKS];
+int curcard = TOTCARDS;
 
 
-void   chkwinner __P((int, int *));
+void   chkwinner __P((int, const int *));
 int    compmove __P((void));
 int    compmove __P((void));
-int    countbooks __P((int *));
-int    countcards __P((int *));
+int    countbooks __P((const int *));
+int    countcards __P((const int *));
 int    drawcard __P((int, int *));
 int    gofish __P((int, int, int *));
 void   goodmove __P((int, int, int *, int *));
 int    drawcard __P((int, int *));
 int    gofish __P((int, int, int *));
 void   goodmove __P((int, int, int *, int *));
@@ -91,10 +93,10 @@ void        init __P((void));
 void   instructions __P((void));
 int    main __P((int, char *[]));
 int    nrandom __P((int));
 void   instructions __P((void));
 int    main __P((int, char *[]));
 int    nrandom __P((int));
-void   printhand __P((int *));
+void   printhand __P((const int *));
 void   printplayer __P((int));
 int    promove __P((void));
 void   printplayer __P((int));
 int    promove __P((void));
-void   usage __P((void));
+void   usage __P((void)) __attribute__((__noreturn__));
 int    usermove __P((void));
 
 int
 int    usermove __P((void));
 
 int
@@ -104,6 +106,9 @@ main(argc, argv)
 {
        int ch, move;
 
 {
        int ch, move;
 
+       /* Revoke setgid privileges */
+       setregid(getgid(), getgid());
+
        while ((ch = getopt(argc, argv, "p")) != -1)
                switch(ch) {
                case 'p':
        while ((ch = getopt(argc, argv, "p")) != -1)
                switch(ch) {
                case 'p':
@@ -111,8 +116,7 @@ main(argc, argv)
                        break;
                case '?':
                default:
                        break;
                case '?':
                default:
-                       (void)fprintf(stderr, "usage: fish [-p]\n");
-                       exit(1);
+                       usage();
                }
 
        srandom(time((time_t *)NULL));
                }
 
        srandom(time((time_t *)NULL));
@@ -153,7 +157,7 @@ int
 usermove()
 {
        int n;
 usermove()
 {
        int n;
-       char **p;
+       const char *const *p;
        char buf[256];
 
        (void)printf("\nYour hand is:");
        char buf[256];
 
        (void)printf("\nYour hand is:");
@@ -162,13 +166,13 @@ usermove()
        for (;;) {
                (void)printf("You ask me for: ");
                (void)fflush(stdout);
        for (;;) {
                (void)printf("You ask me for: ");
                (void)fflush(stdout);
-               if (fgets(buf, BUFSIZ, stdin) == NULL)
+               if (fgets(buf, sizeof(buf), stdin) == NULL)
                        exit(0);
                if (buf[0] == '\0')
                        continue;
                if (buf[0] == '\n') {
                        (void)printf("%d cards in my hand, %d in the pool.\n",
                        exit(0);
                if (buf[0] == '\0')
                        continue;
                if (buf[0] == '\n') {
                        (void)printf("%d cards in my hand, %d in the pool.\n",
-                           countcards(comphand), countcards(deck));
+                           countcards(comphand), curcard);
                        (void)printf("My books:");
                        (void)countbooks(comphand);
                        continue;
                        (void)printf("My books:");
                        (void)countbooks(comphand);
                        continue;
@@ -268,9 +272,7 @@ drawcard(player, hand)
 {
        int card;
 
 {
        int card;
 
-       while (deck[card = nrandom(RANKS)] == 0);
-       ++hand[card];
-       --deck[card];
+       ++hand[card = deck[--curcard]];
        if (player == USER || hand[card] == CARDS) {
                printplayer(player);
                (void)printf("drew %s", cards[card]);
        if (player == USER || hand[card] == CARDS) {
                printplayer(player);
                (void)printf("drew %s", cards[card]);
@@ -328,7 +330,7 @@ goodmove(player, move, hand, opphand)
 void
 chkwinner(player, hand)
        int player;
 void
 chkwinner(player, hand)
        int player;
-       int *hand;
+       const int *hand;
 {
        int cb, i, ub;
 
 {
        int cb, i, ub;
 
@@ -371,7 +373,7 @@ printplayer(player)
 
 void
 printhand(hand)
 
 void
 printhand(hand)
-       int *hand;
+       const int *hand;
 {
        int book, i, j;
 
 {
        int book, i, j;
 
@@ -392,7 +394,7 @@ printhand(hand)
 
 int
 countcards(hand)
 
 int
 countcards(hand)
-       int *hand;
+       const int *hand;
 {
        int i, count;
 
 {
        int i, count;
 
@@ -403,7 +405,7 @@ countcards(hand)
 
 int
 countbooks(hand)
 
 int
 countbooks(hand)
-       int *hand;
+       const int *hand;
 {
        int i, count;
 
 {
        int i, count;
 
@@ -421,19 +423,21 @@ countbooks(hand)
 void
 init()
 {
 void
 init()
 {
-       int i, rank;
+       int i, j, temp;
 
 
-       for (i = 0; i < RANKS; ++i)
-               deck[i] = CARDS;
-       for (i = 0; i < HANDSIZE; ++i) {
-               while (!deck[rank = nrandom(RANKS)]);
-               ++userhand[rank];
-               --deck[rank];
+       for (i = 0; i < TOTCARDS; ++i)
+               deck[i] = i % RANKS;
+       for (i = 0; i < TOTCARDS - 1; ++i) {
+               j = nrandom(TOTCARDS-i);
+               if (j == 0)
+                       continue;
+               temp = deck[i];
+               deck[i] = deck[i+j];
+               deck[i+j] = temp;
        }
        for (i = 0; i < HANDSIZE; ++i) {
        }
        for (i = 0; i < HANDSIZE; ++i) {
-               while (!deck[rank = nrandom(RANKS)]);
-               ++comphand[rank];
-               --deck[rank];
+               ++userhand[deck[--curcard]];
+               ++comphand[deck[--curcard]];
        }
 }
 
        }
 }
 
@@ -450,6 +454,8 @@ instructions()
 {
        int input;
        pid_t pid;
 {
        int input;
        pid_t pid;
+       int fd;
+       const char *pager;
        int status;
 
        (void)printf("Would you like instructions (y or n)? ");
        int status;
 
        (void)printf("Would you like instructions (y or n)? ");
@@ -460,10 +466,18 @@ instructions()
 
        switch (pid = fork()) {
        case 0: /* child */
 
        switch (pid = fork()) {
        case 0: /* child */
-               (void)setuid(getuid());
-               (void)setgid(getgid());
-               (void)execl(_PATH_MORE, "more", _PATH_INSTR, NULL);
-               err(1, "%s %s", _PATH_MORE, _PATH_INSTR);
+               if (!isatty(1))
+                       pager = "cat";
+               else {
+                       if (!(pager = getenv("PAGER")) || (*pager == 0))
+                               pager = _PATH_MORE;
+               }
+               if ((fd = open(_PATH_INSTR, O_RDONLY)) == -1)
+                       err(1, "open %s", _PATH_INSTR);
+               if (dup2(fd, 0) == -1)
+                       err(1, "dup2");
+               (void)execl("/bin/sh", "sh", "-c", pager, NULL);
+               err(1, "exec sh -c %s", pager);
                /*NOTREACHED*/
        case -1:
                err(1, "fork");
                /*NOTREACHED*/
        case -1:
                err(1, "fork");