ANSIfication; bug report 4.3BSD/bin/223
[unix-history] / usr / src / games / monop / initdeck.c
CommitLineData
ec5c7841 1/*
d99e6414 2 * Copyright (c) 1980 Regents of the University of California.
ec5c7841
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
d99e6414
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
ec5c7841
KB
16 */
17
18#ifndef lint
19char copyright[] =
d99e6414 20"@(#) Copyright (c) 1980 Regents of the University of California.\n\
ec5c7841
KB
21 All rights reserved.\n";
22#endif /* not lint */
23
24#ifndef lint
d99e6414 25static char sccsid[] = "@(#)initdeck.c 5.3 (Berkeley) %G%";
ec5c7841
KB
26#endif /* not lint */
27
28# include <stdio.h>
29# include "deck.h"
30
31/*
32 * This program initializes the card files for monopoly.
33 * It reads in a data file with Com. Chest cards, followed by
34 * the Chance card. The two are seperated by a line of "%-".
35 * All other cards are seperated by lines of "%%". In the front
36 * of the file is the data for the decks in the same order.
37 * This includes the seek pointer for the start of each card.
38 * All cards start with their execution code, followed by the
39 * string to print, terminated with a null byte.
40 */
41
42# define TRUE 1
43# define FALSE 0
44
45# define bool char
46# define reg register
47
48char *infile = "cards.inp", /* input file */
49 *outfile = "cards.pck"; /* "packed" file */
50
2497392a
KB
51extern long ftell();
52extern char *calloc();
ec5c7841
KB
53
54DECK deck[2];
55
56FILE *inf, *outf;
57
58main(ac, av)
59int ac;
60char *av[]; {
61
62 getargs(ac, av);
63 if ((inf = fopen(infile, "r")) == NULL) {
64 perror(infile);
65 exit(1);
66 }
67 count();
68 /*
69 * allocate space for pointers.
70 */
2497392a
KB
71 CC_D.offsets = (long *)calloc(CC_D.num_cards + 1, sizeof (long));
72 CH_D.offsets = (long *)calloc(CH_D.num_cards + 1, sizeof (long));
ec5c7841
KB
73 fseek(inf, 0L, 0);
74 if ((outf = fopen(outfile, "w")) == NULL) {
75 perror(outfile);
76 exit(0);
77 }
78
79 fwrite(deck, sizeof (DECK), 2, outf);
80 fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
81 fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
82 putem();
83
84 fclose(inf);
85 fseek(outf, 0, 0L);
86 fwrite(deck, sizeof (DECK), 2, outf);
87 fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
88 fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
89 fclose(outf);
90 printf("There were %d com. chest and %d chance cards\n", CC_D.num_cards, CH_D.num_cards);
91 exit(0);
92}
93
94getargs(ac, av)
95int ac;
96char *av[]; {
97
98 if (ac > 2) {
99 infile = av[2] ? av[2] : infile;
100 if (ac > 3)
101 outfile = av[3];
102 }
103}
104/*
105 * count the cards
106 */
107count() {
108
109 reg bool newline;
110 reg DECK *in_deck;
111 reg char c;
112
113 newline = TRUE;
114 in_deck = &CC_D;
115 while ((c=getc(inf)) != EOF)
116 if (newline && c == '%') {
117 newline = FALSE;
118 in_deck->num_cards++;
119 if (getc(inf) == '-')
120 in_deck = &CH_D;
121 }
122 else
123 newline = (c == '\n');
124 in_deck->num_cards++;
125}
126/*
127 * put strings in the file
128 */
129putem() {
130
131 reg bool newline;
132 reg DECK *in_deck;
133 reg char c;
134 reg int num;
135
136 in_deck = &CC_D;
137 CC_D.num_cards = 1;
138 CH_D.num_cards = 0;
139 CC_D.offsets[0] = ftell(outf);
140 putc(getc(inf), outf);
141 putc(getc(inf), outf);
142 for (num = 0; (c=getc(inf)) != '\n'; )
143 num = num * 10 + (c - '0');
144 putw(num, outf);
145 newline = FALSE;
146 while ((c=getc(inf)) != EOF)
147 if (newline && c == '%') {
148 putc('\0', outf);
149 newline = FALSE;
150 if (getc(inf) == '-')
151 in_deck = &CH_D;
152 while (getc(inf) != '\n')
153 continue;
154 in_deck->offsets[in_deck->num_cards++] = ftell(outf);
155 if ((c=getc(inf)) == EOF)
156 break;
157 putc(c, outf);
158 putc(c = getc(inf), outf);
159 for (num = 0; (c=getc(inf)) != EOF && c != '\n'; )
160 num = num * 10 + (c - '0');
161 putw(num, outf);
162 }
163 else {
164 putc(c, outf);
165 newline = (c == '\n');
166 }
167 putc('\0', outf);
168}