1 /*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1980, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)initdeck.c 8.1 (Berkeley) 05/31/93";
16 #endif /* not lint */
17
18 # include <stdio.h>
19 # include "deck.h"
20
21 /*
22 * This program initializes the card files for monopoly.
23 * It reads in a data file with Com. Chest cards, followed by
24 * the Chance card. The two are seperated by a line of "%-".
25 * All other cards are seperated by lines of "%%". In the front
26 * of the file is the data for the decks in the same order.
27 * This includes the seek pointer for the start of each card.
28 * All cards start with their execution code, followed by the
29 * string to print, terminated with a null byte.
30 */
31
32 # define TRUE 1
33 # define FALSE 0
34
35 # define bool char
36 # define reg register
37
38 char *infile = "cards.inp", /* input file */
39 *outfile = "cards.pck"; /* "packed" file */
40
41 extern long ftell();
42 extern char *calloc();
43
44 DECK deck[2];
45
46 FILE *inf, *outf;
47
main(ac,av)48 main(ac, av)
49 int ac;
50 char *av[]; {
51
52 getargs(ac, av);
53 if ((inf = fopen(infile, "r")) == NULL) {
54 perror(infile);
55 exit(1);
56 }
57 count();
58 /*
59 * allocate space for pointers.
60 */
61 CC_D.offsets = (long *)calloc(CC_D.num_cards + 1, sizeof (long));
62 CH_D.offsets = (long *)calloc(CH_D.num_cards + 1, sizeof (long));
63 fseek(inf, 0L, 0);
64 if ((outf = fopen(outfile, "w")) == NULL) {
65 perror(outfile);
66 exit(0);
67 }
68
69 fwrite(deck, sizeof (DECK), 2, outf);
70 fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
71 fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
72 putem();
73
74 fclose(inf);
75 fseek(outf, 0, 0L);
76 fwrite(deck, sizeof (DECK), 2, outf);
77 fwrite(CC_D.offsets, sizeof (long), CC_D.num_cards, outf);
78 fwrite(CH_D.offsets, sizeof (long), CH_D.num_cards, outf);
79 fclose(outf);
80 printf("There were %d com. chest and %d chance cards\n", CC_D.num_cards, CH_D.num_cards);
81 exit(0);
82 }
83
getargs(ac,av)84 getargs(ac, av)
85 int ac;
86 char *av[]; {
87
88 if (ac > 1)
89 infile = av[1];
90 if (ac > 2)
91 outfile = av[2];
92 }
93
94 /*
95 * count the cards
96 */
count()97 count() {
98
99 reg bool newline;
100 reg DECK *in_deck;
101 reg char c;
102
103 newline = TRUE;
104 in_deck = &CC_D;
105 while ((c=getc(inf)) != EOF)
106 if (newline && c == '%') {
107 newline = FALSE;
108 in_deck->num_cards++;
109 if (getc(inf) == '-')
110 in_deck = &CH_D;
111 }
112 else
113 newline = (c == '\n');
114 in_deck->num_cards++;
115 }
116 /*
117 * put strings in the file
118 */
putem()119 putem() {
120
121 reg bool newline;
122 reg DECK *in_deck;
123 reg char c;
124 reg int num;
125
126 in_deck = &CC_D;
127 CC_D.num_cards = 1;
128 CH_D.num_cards = 0;
129 CC_D.offsets[0] = ftell(outf);
130 putc(getc(inf), outf);
131 putc(getc(inf), outf);
132 for (num = 0; (c=getc(inf)) != '\n'; )
133 num = num * 10 + (c - '0');
134 putw(num, outf);
135 newline = FALSE;
136 while ((c=getc(inf)) != EOF)
137 if (newline && c == '%') {
138 putc('\0', outf);
139 newline = FALSE;
140 if (getc(inf) == '-')
141 in_deck = &CH_D;
142 while (getc(inf) != '\n')
143 continue;
144 in_deck->offsets[in_deck->num_cards++] = ftell(outf);
145 if ((c=getc(inf)) == EOF)
146 break;
147 putc(c, outf);
148 putc(c = getc(inf), outf);
149 for (num = 0; (c=getc(inf)) != EOF && c != '\n'; )
150 num = num * 10 + (c - '0');
151 putw(num, outf);
152 }
153 else {
154 putc(c, outf);
155 newline = (c == '\n');
156 }
157 putc('\0', outf);
158 }
159