From: Keith Bostic Date: Sun, 3 Jan 1988 12:53:24 +0000 (-0800) Subject: date and time created 88/01/02 20:53:24 by bostic X-Git-Tag: BSD-4_3_Net_1-Snapshot-Development~2799 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/ec5c7841400c2c7ae960d7f60785a74ab21501b5 date and time created 88/01/02 20:53:24 by bostic SCCS-vsn: games/monop/getinp.c 5.1 SCCS-vsn: games/monop/initdeck.c 5.1 --- diff --git a/usr/src/games/monop/getinp.c b/usr/src/games/monop/getinp.c new file mode 100644 index 0000000000..32f8e7aab6 --- /dev/null +++ b/usr/src/games/monop/getinp.c @@ -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 +# include + +# 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(""); + } + 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 index 0000000000..72981ee966 --- /dev/null +++ b/usr/src/games/monop/initdeck.c @@ -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 +# 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); +}