date and time created 88/01/02 20:53:24 by bostic
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Sun, 3 Jan 1988 12:53:24 +0000 (04:53 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Sun, 3 Jan 1988 12:53:24 +0000 (04:53 -0800)
SCCS-vsn: games/monop/getinp.c 5.1
SCCS-vsn: games/monop/initdeck.c 5.1

usr/src/games/monop/getinp.c [new file with mode: 0644]
usr/src/games/monop/initdeck.c [new file with mode: 0644]

diff --git a/usr/src/games/monop/getinp.c b/usr/src/games/monop/getinp.c
new file mode 100644 (file)
index 0000000..32f8e7a
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)getinp.c   5.1 (Berkeley) %G%";
+#endif /* not lint */
+
+# include      <stdio.h>
+# include      <ctype.h>
+
+# define       reg     register
+
+# define       LINE    70
+
+static char    buf[257];
+
+getinp(prompt, list)
+char   *prompt, *list[]; {
+
+       reg int i, n_match, match;
+       char    *sp;
+       int     plen;
+
+
+       for (;;) {
+inter:
+               printf(prompt);
+               for (sp = buf; (*sp=getchar()) != '\n'; )
+                       if (*sp == -1)  /* check for interupted system call */
+                               goto inter;
+                       else if (sp != buf || *sp != ' ')
+                               sp++;
+               if (buf[0] == '?' && buf[1] == '\n') {
+                       printf("Valid inputs are: ");
+                       for (i = 0, match = 18; list[i]; i++) {
+                               if ((match+=(n_match=strlen(list[i]))) > LINE) {
+                                       printf("\n\t");
+                                       match = n_match + 8;
+                               }
+                               if (*list[i] == '\0') {
+                                       match += 8;
+                                       printf("<RETURN>");
+                               }
+                               else
+                                       printf(list[i]);
+                               if (list[i+1])
+                                       printf(", ");
+                               else
+                                       putchar('\n');
+                               match += 2;
+                       }
+                       continue;
+               }
+               *sp = '\0';
+               for (sp = buf; *sp; sp++)
+                       if (isupper(*sp))
+                               *sp = tolower(*sp);
+               for (i = n_match = 0; list[i]; i++)
+                       if (comp(list[i])) {
+                               n_match++;
+                               match = i;
+                       }
+               if (n_match == 1)
+                       return match;
+               else if (buf[0] != '\0')
+                       printf("Illegal response: \"%s\".  Use '?' to get list of valid answers\n", buf);
+       }
+}
+
+static
+comp(s1)
+char   *s1; {
+
+       reg char        *sp, *tsp, c;
+
+       if (buf[0] != '\0')
+               for (sp = buf, tsp = s1; *sp; ) {
+                       c = isupper(*tsp) ? tolower(*tsp) : *tsp;
+                       tsp++;
+                       if (c != *sp++)
+                               return 0;
+               }
+       else if (*s1 != '\0')
+               return 0;
+       return 1;
+}
diff --git a/usr/src/games/monop/initdeck.c b/usr/src/games/monop/initdeck.c
new file mode 100644 (file)
index 0000000..72981ee
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1987 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)initdeck.c 5.1 (Berkeley) %G%";
+#endif /* not lint */
+
+# include      <stdio.h>
+# include      "deck.h"
+
+/*
+ *     This program initializes the card files for monopoly.
+ * It reads in a data file with Com. Chest cards, followed by
+ * the Chance card.  The two are seperated by a line of "%-".
+ * All other cards are seperated by lines of "%%".  In the front
+ * of the file is the data for the decks in the same order.
+ * This includes the seek pointer for the start of each card.
+ * All cards start with their execution code, followed by the
+ * string to print, terminated with a null byte.
+ */
+
+# define       TRUE    1
+# define       FALSE   0
+
+# define       bool    char
+# define       reg     register
+
+char   *infile         = "cards.inp",          /* input file           */
+       *outfile        = "cards.pck";          /* "packed" file        */
+
+long   ftell();
+
+DECK   deck[2];
+
+FILE   *inf, *outf;
+
+main(ac, av)
+int    ac;
+char   *av[]; {
+
+       getargs(ac, av);
+       if ((inf = fopen(infile, "r")) == NULL) {
+               perror(infile);
+               exit(1);
+       }
+       count();
+       /*
+        * allocate space for pointers.
+        */
+       CC_D.offsets = calloc(CC_D.num_cards + 1, sizeof (long));
+       CH_D.offsets = calloc(CH_D.num_cards + 1, sizeof (long));
+       fseek(inf, 0L, 0);
+       if ((outf = fopen(outfile, "w")) == NULL) {
+               perror(outfile);
+               exit(0);
+       }
+
+       fwrite(deck, sizeof (DECK), 2, outf);
+       fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
+       fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
+       putem();
+
+       fclose(inf);
+       fseek(outf, 0, 0L);
+       fwrite(deck, sizeof (DECK), 2, outf);
+       fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
+       fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
+       fclose(outf);
+       printf("There were %d com. chest and %d chance cards\n", CC_D.num_cards, CH_D.num_cards);
+       exit(0);
+}
+
+getargs(ac, av)
+int    ac;
+char   *av[]; {
+
+       if (ac > 2) {
+               infile = av[2] ? av[2] : infile;
+               if (ac > 3)
+                       outfile = av[3];
+       }
+}
+/*
+ * count the cards
+ */
+count() {
+
+       reg bool        newline;
+       reg DECK        *in_deck;
+       reg char        c;
+
+       newline = TRUE;
+       in_deck = &CC_D;
+       while ((c=getc(inf)) != EOF)
+               if (newline && c == '%') {
+                       newline = FALSE;
+                       in_deck->num_cards++;
+                       if (getc(inf) == '-')
+                               in_deck = &CH_D;
+               }
+               else
+                       newline = (c == '\n');
+       in_deck->num_cards++;
+}
+/*
+ *     put strings in the file
+ */
+putem() {
+
+       reg bool        newline;
+       reg DECK        *in_deck;
+       reg char        c;
+       reg int         num;
+
+       in_deck = &CC_D;
+       CC_D.num_cards = 1;
+       CH_D.num_cards = 0;
+       CC_D.offsets[0] = ftell(outf);
+       putc(getc(inf), outf);
+       putc(getc(inf), outf);
+       for (num = 0; (c=getc(inf)) != '\n'; )
+               num = num * 10 + (c - '0');
+       putw(num, outf);
+       newline = FALSE;
+       while ((c=getc(inf)) != EOF)
+               if (newline && c == '%') {
+                       putc('\0', outf);
+                       newline = FALSE;
+                       if (getc(inf) == '-')
+                               in_deck = &CH_D;
+                       while (getc(inf) != '\n')
+                               continue;
+                       in_deck->offsets[in_deck->num_cards++] = ftell(outf);
+                       if ((c=getc(inf)) == EOF)
+                               break;
+                       putc(c, outf);
+                       putc(c = getc(inf), outf);
+                       for (num = 0; (c=getc(inf)) != EOF && c != '\n'; )
+                               num = num * 10 + (c - '0');
+                       putw(num, outf);
+               }
+               else {
+                       putc(c, outf);
+                       newline = (c == '\n');
+               }
+       putc('\0', outf);
+}