|
|
1.1 root 1: /* aread.c: read and parse an airspace file */
2:
3: #include <stdio.h>
4: #include <sys/ttyio.h>
5: #include <sys/param.h>
6: #include <sys/timeb.h>
7: #include <ctype.h>
8: #include <signal.h>
9: #include "ahdr.h"
10:
11: /* The following section reads a file containing info on the
12: * current airspace. A sample looks like:
13: Apple1
14: size: 15x24
15: airway: 1=(0,13) [20-30] SE 8=(10,23) [10-5]
16: airway: 0=(4,0) S 9=(4,23)
17: airway: 2=(14,15) NW 7=(0,1)
18: airway: 3=(0,9) NE 6=(9,0)
19: airway: 4=(14,7) SW 5=(0,21)
20: airport: %=(4,11) S
21: airport: #=(10,11) NE
22: navaid: *=(4,5)
23: navaid: *=(4,17)
24: * where the airspace id starts in the first column, and everything else
25: * is indented one tab and has syntax exactly as shown.
26: * Numbers in square brackets are proportion of entries-exits from-to this
27: * point. Default for normal places is 10 and default for airports is 16.
28: */
29:
30: /* note: [prob] code is obsolete */
31:
32: #define I_SIZE 1 /* these are the tokens for the airspace identifiers*/
33: #define I_AIRWAY 2
34: #define I_AIRPORT 3
35: #define I_NAVAID 4
36:
37: struct namestr
38: { char *i_name;
39: int i_token;
40: } name[] =
41: { "size", I_SIZE,
42: "airway", I_AIRWAY,
43: "airport", I_AIRPORT,
44: "navaid", I_NAVAID,
45: 0
46: };
47:
48: extern int npaths; /* number of paths in the path file */
49: extern int maxflow;
50: extern struct flow fpath[MAXPATHS];
51:
52: #define BUFSIZE 100
53:
54: extern struct pstruct entry[EMAX],airport[AMAX],navaid[NMAX];
55: extern char *airspace,*airfile,*flowfile;
56: extern int height,width;
57: extern char screen[MAXWIDTH][MAXHEIGHT];
58: extern int nentry,nairport,nnavaid;
59: extern int inawtot,inaptot,outawtot,outaptot;
60:
61: char *strchr();
62:
63: readspace() /* read the airspace file to get user's desired airspace */
64: { FILE *asfile;
65: char lbuf[BUFSIZE]; /* line from the airspace file */
66: char ibuf[BUFSIZE]; /* airspace identifier */
67: char *c;
68: struct namestr *n;
69: int i,org,dst;
70: FILE *flowstream;
71: struct flow *path;
72:
73: if ((asfile = fopen(airfile,"r")) == NULL)
74: err("Cannot open airspace file, %s\n",airfile);
75: do /* scan through the file until we get the right airspace */
76: { if (fgets(lbuf,BUFSIZE,asfile) == NULL)
77: err("Couldn't find airspace %s in %s\n",airspace,airfile);
78: if (lbuf[0] == '\t') continue; /* not an airspace id */
79: for (c=lbuf; *c; c++) if (*c == '\n') *c = 0; /*kill newline*/
80: }
81: while (strcmp(lbuf,airspace));
82: /* next consider each line of this airspace in turn */
83: while (fgets(lbuf,BUFSIZE,asfile) != NULL & lbuf[0] == '\t')
84: { for (c=lbuf; *c == '\t' || *c == ' '; c++); /* skip blanks */
85: strcpy(ibuf,c);
86: if ((c = strchr(ibuf,':')) == 0)
87: err("No colon in %s, line %s",airfile,lbuf);
88: *c = 0; /* terminate the command id */
89: for (n = name; n->i_name != 0; n++) /* get symbol */
90: if (strcmp(ibuf, n->i_name) == 0) break;
91: switch(n->i_token)
92: { case I_SIZE: sizeread(lbuf); break;
93: case I_AIRWAY: airwayread(lbuf); break;
94: case I_AIRPORT: apread(lbuf); break;
95: case I_NAVAID: navaidread(lbuf); break;
96: default: err("Unrecognized id in %s, line %s",
97: airfile,lbuf);
98: }
99: }
100: fclose(asfile);
101: /* now put commas on all the airways */
102: for (i=0; i<nentry; i++) /* go both ways -- doubles the work */
103: { int x,y,dx,dy;
104:
105: x = entry[i].p_x;
106: y = entry[i].p_y;
107: dx = entry[i].p_dx;
108: dy = entry[i].p_dy;
109: while (x>=0 && y>=0 && x<width && y<height)
110: { if (screen[x][y] == '.') screen[x][y] = ',';
111: x += dx;
112: y += dy;
113: }
114: }
115: if (!flowfile) /* if no flow file specified, look for one */
116: { char *s,*t;
117: static char flowbuf[80];
118: FILE *test;
119:
120: if (*(t = airfile) == '/') /* full airfile path? */
121: { for (s = flowbuf; *s++ = *t++; ); /* copy airfile */
122: while (*--s != '/'); /* back to last slash */
123: s++;
124: }
125: else s = flowbuf;
126: for (t = airspace; *t; *s++ = *t++);/*air space*/
127: for (t = ".flow"; *s++ = *t++; );
128: if ((test = fopen(flowbuf,"r")) != NULL) /* it's there */
129: { fclose(test);
130: flowfile = flowbuf;
131: }
132: }
133: if (flowfile) /* flow control */
134: { maxflow = 0;
135: if ((flowstream = fopen(flowfile,"r")) == NULL)
136: err("Cannot open flow control file: %s\n",flowfile);
137: path = &fpath[npaths = 0];
138: while (fgets(lbuf,BUFSIZE,flowstream) != NULL)
139: { if (lbuf[0] == '\n') continue; /* ignore newlines */
140: org = *(c = lbuf); /* 1st char is origin */
141: if (*++c != '-')
142: err("Path format: x->y 123\nYou gave me %s\n",
143: lbuf);
144: if (*++c != '>')
145: err("Path format: x->y 123\nYou gave me %s\n",
146: lbuf);
147: dst = *++c;
148: /* we need to code these in their flightpath() fmt */
149: pcode(org,path,1);
150: pcode(dst,path,0);
151: path->f_freq = atoi(++c); /* get relative freq*/
152: maxflow += path->f_freq; /* total frequency */
153:
154: /* read distances for minimal paths */
155: while (*++c) if (*c == ' ') break; /* next fld */
156: path->f_cmds = (*c == 0? 1 : atoi(c));
157: if (*c) while (*++c) if (*c != ' ') break;
158: if (*c) while (*++c) if (*c == ' ') break;
159: path->f_dist[0] = (*c == 0? 1 : atoi(c));
160: for (i=1;i<7;i++) path->f_dist[i] = path->f_dist[0];
161: for (i = 7; i < NALT; i++)
162: { if (*c) while (*++c) if (*c != ' ') break;
163: if (*c) while (*++c) if (*c == ' ') break;
164: if (*c) path->f_dist[i] = atoi(c);
165: else path->f_dist[i] = path->f_dist[i-1];
166: }
167:
168: path++;
169: npaths++;
170: }
171: fclose(flowstream);
172: }
173: }
174:
175: pcode(c,path,from) /* find flightplan() entry/exit code for character c */
176: char c;
177: struct flow *path;
178: int from;
179: { int i;
180:
181: for (i=0; i<nentry; i++)
182: if (c == entry[i].p_sym) break;
183: if (i<nentry)
184: { if (from)
185: { path->f_from = i;
186: path->f_fair = 0;
187: }
188: else
189: { path->f_to = i;
190: path->f_tair = 0;
191: }
192: return;
193: }
194: for (i=0; i<nairport; i++)
195: if (c == airport[i].p_sym) break;
196: if (i<nairport)
197: { if (from)
198: { path->f_from = i;
199: path->f_fair = 1;
200: }
201: else
202: { path->f_to = i;
203: path->f_tair = 1;
204: }
205: return;
206: }
207: err("Unrecognized point %c in path file.\n",c);
208: }
209:
210:
211: sizeread(buf)
212: char *buf;
213: { char *c;
214:
215: c = strchr(buf,':'); /* previously checked for existence */
216: width = atoi(++c);
217: if ((c = strchr(buf,'x')) == 0)
218: err("A size line must be of the form size: 15x25");
219: height = atoi(++c);
220: if (width > MAXWIDTH || width < MINWIDTH)
221: err("Width must be in the range %d to %d",MINWIDTH,MAXWIDTH);
222: if (height > MAXHEIGHT || height < MINHEIGHT)
223: err("Height must be in the range %d to %d",MINHEIGHT,MAXHEIGHT);
224: }
225:
226:
227: char *
228: getpoint(buf,p) /* read an entry point, airport, or beacon from file */
229: char *buf;
230: struct pstruct *p;
231: { char *c;
232: int i;
233:
234: c = strchr(buf,'=');
235: if (c == 0) return(0);
236: p->p_sym = *--c;
237: c = strchr(c,'(');
238: if (c == 0) return(0);
239: p->p_x = atoi(++c);
240: c = strchr(c,',');
241: if (c == 0) return(0);
242: p->p_y = atoi(++c);
243: c = strchr(c,')');
244: if (c == 0) return(0);
245: screen[p->p_x][p->p_y] = p->p_sym;
246: ++c; /* space or return after ) */
247: /* note: [prob] code is obsolete */
248: if (*(c+1) == '[') /* if next char is [, then we have a proportion */
249: { p->p_inprop = atoi(c+2);
250: c = strchr(c,'-');
251: if (c == 0) return(0);
252: p->p_outprop = atoi(++c);
253: c = strchr(c,']');
254: if (c == 0) return(0);
255: c++;
256: }
257: return(c);
258: }
259:
260: char *
261: getdirec(c,p)
262: char *c;
263: struct pstruct *p;
264: { while (*c != ' ' && *c && *c != '\n')
265: { switch(*c++)
266: { case 'N':
267: p->p_dy = -1;
268: break;
269: case 'S':
270: p->p_dy = 1;
271: break;
272: case 'E':
273: p->p_dx = 1;
274: break;
275: case 'W':
276: p->p_dx = -1;
277: break;
278: default : return(0);
279: }
280: }
281: return(c);
282: }
283:
284: airwayread(buf)
285: char *buf;
286: { char *c;
287: struct pstruct *p,*q;
288:
289: p = &entry[nentry++];
290: p->p_inprop = p->p_outprop = 10;
291: c = getpoint(buf,p);
292: inawtot += p->p_inprop;
293: outawtot += p->p_outprop;
294: if (c == 0) err("Airway syntax error");
295: c = strchr(c,' '); /* now get direction */
296: if (c == 0) err("Airway syntax error");
297: p->p_dx = p->p_dy = 0;
298: c = getdirec(++c,p);
299: if (c == 0) err("Airway direction error");
300: q = &entry[nentry++];
301: q->p_inprop = q->p_outprop = 10;
302: c = getpoint(c,q);
303: inawtot += q->p_inprop;
304: outawtot += q->p_outprop;
305: if (c == 0) err("Airway syntax error");
306: q->p_dx = -p->p_dx; /* reverse direction from other entry */
307: q->p_dy = -p->p_dy;
308: }
309:
310: apread(buf)
311: char *buf;
312: { char *c;
313: struct pstruct *p;
314:
315: p = &airport[nairport++];
316: p->p_inprop = p->p_outprop = 26;
317: c = getpoint(buf,p);
318: inaptot += p->p_inprop;
319: outaptot += p->p_outprop;
320: if (c == 0) err("Airport syntax error");
321: p->p_dx = p->p_dy = 0;
322: c = getdirec(++c,p);
323: if (c == 0) err("Airport direction syntax error");
324: }
325:
326: navaidread(buf)
327: char *buf;
328: {
329: if (getpoint(buf,&navaid[nnavaid++]) == 0)
330: err("Navaid syntax error");
331: }
332:
333:
334:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.