]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - monop/initdeck.c
merge with Lite, new RCS id conventions, etc.
[bsdgames-darwin.git] / monop / initdeck.c
1 /* $NetBSD: initdeck.c,v 1.3 1995/03/23 08:34:43 cgd Exp $ */
2
3 /*
4 * Copyright (c) 1980, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #ifndef lint
37 static char copyright[] =
38 "@(#) Copyright (c) 1980, 1993\n\
39 The Regents of the University of California. All rights reserved.\n";
40 #endif /* not lint */
41
42 #ifndef lint
43 #if 0
44 static char sccsid[] = "@(#)initdeck.c 8.1 (Berkeley) 5/31/93";
45 #else
46 static char rcsid[] = "$NetBSD: initdeck.c,v 1.3 1995/03/23 08:34:43 cgd Exp $";
47 #endif
48 #endif /* not lint */
49
50 # include <stdio.h>
51 # include "deck.h"
52
53 /*
54 * This program initializes the card files for monopoly.
55 * It reads in a data file with Com. Chest cards, followed by
56 * the Chance card. The two are seperated by a line of "%-".
57 * All other cards are seperated by lines of "%%". In the front
58 * of the file is the data for the decks in the same order.
59 * This includes the seek pointer for the start of each card.
60 * All cards start with their execution code, followed by the
61 * string to print, terminated with a null byte.
62 */
63
64 # define TRUE 1
65 # define FALSE 0
66
67 # define bool char
68 # define reg register
69
70 char *infile = "cards.inp", /* input file */
71 *outfile = "cards.pck"; /* "packed" file */
72
73 extern long ftell();
74 extern char *calloc();
75
76 DECK deck[2];
77
78 FILE *inf, *outf;
79
80 main(ac, av)
81 int ac;
82 char *av[]; {
83
84 getargs(ac, av);
85 if ((inf = fopen(infile, "r")) == NULL) {
86 perror(infile);
87 exit(1);
88 }
89 count();
90 /*
91 * allocate space for pointers.
92 */
93 CC_D.offsets = (long *)calloc(CC_D.num_cards + 1, sizeof (long));
94 CH_D.offsets = (long *)calloc(CH_D.num_cards + 1, sizeof (long));
95 fseek(inf, 0L, 0);
96 if ((outf = fopen(outfile, "w")) == NULL) {
97 perror(outfile);
98 exit(0);
99 }
100
101 fwrite(deck, sizeof (DECK), 2, outf);
102 fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
103 fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
104 putem();
105
106 fclose(inf);
107 fseek(outf, 0, 0L);
108 fwrite(deck, sizeof (DECK), 2, outf);
109 fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
110 fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
111 fclose(outf);
112 printf("There were %d com. chest and %d chance cards\n", CC_D.num_cards, CH_D.num_cards);
113 exit(0);
114 }
115
116 getargs(ac, av)
117 int ac;
118 char *av[]; {
119
120 if (ac > 1)
121 infile = av[1];
122 if (ac > 2)
123 outfile = av[2];
124 }
125
126 /*
127 * count the cards
128 */
129 count() {
130
131 reg bool newline;
132 reg DECK *in_deck;
133 reg char c;
134
135 newline = TRUE;
136 in_deck = &CC_D;
137 while ((c=getc(inf)) != EOF)
138 if (newline && c == '%') {
139 newline = FALSE;
140 in_deck->num_cards++;
141 if (getc(inf) == '-')
142 in_deck = &CH_D;
143 }
144 else
145 newline = (c == '\n');
146 in_deck->num_cards++;
147 }
148 /*
149 * put strings in the file
150 */
151 putem() {
152
153 reg bool newline;
154 reg DECK *in_deck;
155 reg char c;
156 reg int num;
157
158 in_deck = &CC_D;
159 CC_D.num_cards = 1;
160 CH_D.num_cards = 0;
161 CC_D.offsets[0] = ftell(outf);
162 putc(getc(inf), outf);
163 putc(getc(inf), outf);
164 for (num = 0; (c=getc(inf)) != '\n'; )
165 num = num * 10 + (c - '0');
166 putw(num, outf);
167 newline = FALSE;
168 while ((c=getc(inf)) != EOF)
169 if (newline && c == '%') {
170 putc('\0', outf);
171 newline = FALSE;
172 if (getc(inf) == '-')
173 in_deck = &CH_D;
174 while (getc(inf) != '\n')
175 continue;
176 in_deck->offsets[in_deck->num_cards++] = ftell(outf);
177 if ((c=getc(inf)) == EOF)
178 break;
179 putc(c, outf);
180 putc(c = getc(inf), outf);
181 for (num = 0; (c=getc(inf)) != EOF && c != '\n'; )
182 num = num * 10 + (c - '0');
183 putw(num, outf);
184 }
185 else {
186 putc(c, outf);
187 newline = (c == '\n');
188 }
189 putc('\0', outf);
190 }