ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/cvmaze.c
Revision: 1.2
Committed: Fri Aug 1 14:14:24 2003 UTC (20 years, 9 months ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R6P1, rad3R6
Changes since 1.1: +1 -6 lines
Log Message:
Eliminated CPM, MAC, and UNIX conditional compiles.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: cvmaze.c,v 1.1 2003/02/22 02:07:26 greg Exp $";
3 #endif
4 /*
5 * THE MAZE GAME definitions and global structures
6 *
7 * Written by Greg Ward 8/4/84
8 */
9
10
11 #include "meta.h"
12
13
14 #define ERROR (-1) /* something wrong */
15
16 #define OK 0 /* everything swell */
17
18 #define TRUE 1
19
20 #define FALSE 0
21
22 #define UP 1
23
24 #define DOWN 2
25
26 #define LEFT 3
27
28 #define RIGHT 4
29
30 #define min(a, b) ((a) < (b) ? (a) : (b))
31
32 #define max(a, b) ((a) > (b) ? (a) : (b))
33
34 #define VSEP '|' /* vertical separator */
35
36 #define HSEP '-' /* horizontal separator */
37
38 #define ISECT '+' /* intersection character */
39
40 #define MARKS " ^v<>*" /* maze markings */
41
42 #define TUP 1 /* mark for trace up */
43
44 #define TDOWN 2 /* mark for trace down */
45
46 #define TLEFT 3 /* mark for trace left */
47
48 #define TRIGHT 4 /* mark for trace right */
49
50 #define MAN 5 /* mark for player */
51
52 #define MAXSIDE 50 /* maximum maze side */
53
54 #define YES 1 /* edge is there */
55
56 #define NO 0 /* edge isn't there */
57
58 #define MAYBE 2 /* undecided */
59
60
61
62
63
64 #define DIRECTION char
65
66 #define EDGE char
67
68 #define MRKINDX char
69
70 struct MAZE {
71 EDGE r0[MAXSIDE+1][MAXSIDE],
72 c0[MAXSIDE+1][MAXSIDE];
73
74 int nrows, ncols;
75
76 MRKINDX mark[MAXSIDE][MAXSIDE];
77
78 int rt, rb, cl, cr;
79
80 };
81
82
83
84 /*
85 * Convert maze to metafile
86 */
87
88
89
90
91
92 struct MAZE amaze; /* our working maze */
93
94 int cellsize; /* the size of a maze cell (in metacoordinates) */
95
96 char *progname;
97
98
99 main(argc, argv)
100
101 int argc;
102 char **argv;
103
104 {
105 FILE *fp;
106
107 progname = *argv++;
108 argc--;
109
110 if (argc)
111
112 for ( ; argc; argc--, argv++) {
113 if ((fp = fopen(*argv, "r")) == NULL) {
114 fprintf(stderr, "%s: no such file\n", *argv);
115 exit(1);
116 }
117 execute(fp);
118 fclose(fp);
119 }
120
121 else
122
123 execute(stdin);
124
125 writeof(stdout);
126
127 return(0);
128 }
129
130
131
132
133 execute(fp) /* process file fp */
134
135 FILE *fp;
136
137 {
138
139 while (readmaze(fp, &amaze, MARKS) != ERROR) {
140
141 cellsize = (XYSIZE-1)/max(amaze.nrows, amaze.ncols);
142 printmaze(stdout, &amaze, MARKS);
143 pglob(PEOP, 0200, NULL);
144 }
145
146 }
147
148
149
150
151
152 printmaze(fp, mzp, mrks) /* print maze to fp */
153
154 FILE *fp;
155 struct MAZE *mzp;
156 char *mrks;
157
158 {
159 int i;
160
161 for (i = mzp->rt; i < mzp->rb; i++) {
162
163 putrline(fp, mzp, i);
164
165 putcline(fp, mzp, i, mrks);
166
167 }
168
169 putrline(fp, mzp, mzp->rb);
170
171 }
172
173
174
175
176 putrline(fp, mzp, row) /* print horizontal row to fp */
177
178 FILE *fp;
179 struct MAZE *mzp;
180 int row;
181
182 {
183 register int j;
184
185 for (j = mzp->cl; j < mzp->cr; j++)
186 if (mzp->r0[row][j] == YES)
187 plseg(0, j*cellsize, (XYSIZE-1)-row*cellsize, (j+1)*cellsize, (XYSIZE-1)-row*cellsize);
188
189 }
190
191
192
193
194
195 putcline(fp, mzp, row, mrks) /* print column line to fp */
196
197 FILE *fp;
198 struct MAZE *mzp;
199 int row;
200 char mrks[];
201
202 {
203 register int j;
204 char s[2];
205
206 s[1] = '\0';
207
208 for (j = mzp->cl; j <= mzp->cr; j++)
209 if (mzp->c0[j][row] == YES)
210 plseg(0, j*cellsize, (XYSIZE-1)-row*cellsize, j*cellsize, (XYSIZE-1)-(row+1)*cellsize);
211
212 }
213
214
215
216
217
218 readmaze(fp, mzp, mrks) /* read maze from fp into mzp */
219
220 FILE *fp;
221 struct MAZE *mzp;
222 char *mrks;
223
224 {
225 int i;
226
227 mzp->rt = mzp->rb = mzp->cl = mzp->cr = mzp->nrows = mzp ->ncols = 0;
228
229 if ((mzp->cr = mzp->ncols = getrline(fp, mzp, 0)) == 0)
230 return(ERROR);
231
232 for (i = 0; i <= MAXSIDE; i++) {
233
234 if (getcline(fp, mzp, i, mrks) != mzp->ncols)
235 break;
236
237 if (getrline(fp, mzp, i+1) != mzp->ncols)
238 return(ERROR);
239
240 }
241
242 if (i > MAXSIDE)
243 return(ERROR);
244
245 mzp->rb = mzp->nrows = i;
246 return(OK);
247 }
248
249
250
251 getrline(fp, mzp, row) /* get row from fp */
252
253 FILE *fp;
254 struct MAZE *mzp;
255 int row;
256
257 {
258 int j, nc;
259 char *fgets(), linbuf[4 + 4*MAXSIDE];
260
261 if (fgets(linbuf, sizeof(linbuf), fp) == NULL)
262 return(0);
263
264 nc = (strlen(linbuf) - 2) / 4;
265
266 for (j = 0; j < nc; j++)
267
268 switch (linbuf[2 + 4*j]) {
269
270 case HSEP:
271 mzp->r0[row][j] = YES;
272 break;
273
274 case ' ':
275 mzp->r0[row][j] = NO;
276 break;
277
278 default:
279 return(0);
280 break;
281
282 }
283
284 return(nc);
285 }
286
287
288
289
290
291 getcline(fp, mzp, row, mrks) /* get column line from fp */
292
293 FILE *fp;
294 struct MAZE *mzp;
295 int row;
296 char mrks[];
297
298 {
299 int j, nc, k;
300 char *fgets(), linbuf[4 + 4*MAXSIDE];
301
302 if (fgets(linbuf, sizeof(linbuf), fp) == NULL)
303 return(0);
304
305 nc = (strlen(linbuf) - 2) / 4;
306
307 for (j = 0; j < nc; j++) {
308
309 switch (linbuf[4*j]) {
310
311 case VSEP:
312 mzp->c0[j][row] = YES;
313 break;
314
315 case ' ':
316 mzp->c0[j][row] = NO;
317 break;
318
319 default:
320 return(0);
321 break;
322
323 }
324
325 for (k = 0; mrks[k]; k++)
326
327 if (linbuf[2 + 4*j] == mrks[k]) {
328 mzp->mark[row][j] = k;
329 break;
330 }
331
332 if (!mrks[k])
333 return(0);
334
335 }
336
337 switch (linbuf[4*nc]) {
338
339 case VSEP:
340 mzp->c0[nc][row] = YES;
341 break;
342
343 case ' ':
344 mzp->c0[nc][row] = NO;
345 break;
346
347 default:
348 return(0);
349 break;
350
351 }
352
353 return(nc);
354 }