Line data Source code
1 : #include <stdio.h>
2 : #include <string.h>
3 : #include <stdlib.h>
4 : #include "hazard.h"
5 : #include "myassert.h"
6 :
7 : #include "cpl_port.h"
8 :
9 : /*
10 : * Uncomment the following to have error messages sent to stdout.
11 : */
12 : /* #define VERBOSE */
13 : #undef VERBOSE
14 :
15 : typedef struct {
16 : const char *abrev, *name;
17 : uChar number;
18 : } HazTable;
19 :
20 : enum {
21 : HAZ_FA, HAZ_BZ, HAZ_CF, HAZ_EH, HAZ_EC, HAZ_FW, HAZ_FF,
22 : HAZ_FZ, HAZ_GL, HAZ_HZ, HAZ_SE, HAZ_UP, HAZ_HW, HAZ_HF, HAZ_HU,
23 : HAZ_HI, HAZ_LE, HAZ_LS, HAZ_SV, HAZ_SR, HAZ_TO, HAZ_TR, HAZ_TI,
24 : HAZ_TS, HAZ_TY, HAZ_WC, HAZ_WS, HAZ_DS, HAZ_HS, HAZ_SU, HAZ_IS,
25 : HAZ_IP, HAZ_AS, HAZ_AF, HAZ_MH, HAZ_DU, HAZ_BS, HAZ_BW, HAZ_FG,
26 : HAZ_MF, HAZ_SM, HAZ_MS, HAZ_ZF, HAZ_ZR, HAZ_ZY, HAZ_FR, HAZ_HT,
27 : HAZ_LB, HAZ_LW, HAZ_LO, HAZ_SC, HAZ_SW, HAZ_RB, HAZ_SI, HAZ_SN,
28 : HAZ_SB, HAZ_WI, HAZ_WW, HAZ_MA, HAZ_EW, HAZ_SS, HAZ_FL, HAZ_BH,
29 : HAZ_RP, HAZ_NONE, /* MPA 1/2017 Added: HAZ_EW, HAZ_SS, HAZ_FL MPA 3/2017 Added: HAZ_BH, HAZ_RP*/
30 : HAZ_UNKNOWN
31 : };
32 :
33 : /* HAZ_EW, HAZ_SS, HAZ_FL */
34 :
35 : /* See: http://products.weather.gov/PDD/HazardGrid0608.pdf */
36 : static const HazTable HazCode[] = {
37 : /* Watch section */
38 : /* 0 */ {"FA", "Areal Flood", HAZ_FA},
39 : /* 1 */ {"BZ", "Blizzard", HAZ_BZ},
40 : /* 2 */ {"CF", "Coastal Flood", HAZ_CF},
41 : /* 3 */ {"EH", "Excessive Heat", HAZ_EH},
42 : /* 4 */ {"EC", "Extreme Cold", HAZ_EC}, /* Excessive Cold */
43 : /* 5 */ {"FW", "Fire Weather", HAZ_FW},
44 : /* 6 */ {"FF", "Flash Flood", HAZ_FF},
45 : /* 7 */ {"FZ", "Freeze", HAZ_FZ},
46 : /* 8 */ {"GL", "Gale", HAZ_GL},
47 : /* 9 */ {"HZ", "Hard Freeze", HAZ_HZ},
48 : /* 10 */ {"SE", "Hazardous Seas", HAZ_SE},
49 : /* 11 */ {"UP", "Heavy Freezing Spray", HAZ_UP},
50 : /* 12 */ {"HW", "High Wind", HAZ_HW},
51 : /* 13 */ {"HF", "Hurricane Force", HAZ_HF},
52 : /* 14 */ {"HU", "Hurricane", HAZ_HU},
53 : /* 15 */ {"HI", "Hurricane Wind", HAZ_HI}, /* Inland Hurricane */
54 : /* 16 */ {"LE", "Lake Effect Snow", HAZ_LE},
55 : /* 17 */ {"LS", "Lakeshore Flood", HAZ_LS},
56 : /* 18 */ {"SV", "Severe Thunderstorm", HAZ_SV},
57 : /* 19 */ {"SR", "Storm", HAZ_SR},
58 : /* 20 */ {"TO", "Tornado", HAZ_TO},
59 : /* 21 */ {"TR", "Tropical Storm", HAZ_TR},
60 : /* 22 */ {"TI", "Tropical Storm Wind", HAZ_TI}, /* Inland Tropical Storm */
61 : /* 23 */ {"TS", "Tsunami", HAZ_TS},
62 : /* 24 */ {"TY", "Typhoon", HAZ_TY},
63 : /* 25 */ {"WC", "Wind Chill", HAZ_WC},
64 : /* 26 */ {"WS", "Winter Storm", HAZ_WS},
65 : /* Warning section */
66 : /* BZ, CF */
67 : /* 27 */ {"DS", "Dust Storm", HAZ_DS},
68 : /* EH, EC, FZ, GL, HZ, SE, UP */
69 : /* 28 */ {"HS", "Heavy Snow", HAZ_HS},
70 : /* 29 */ {"SU", "High Surf", HAZ_SU},
71 : /* HW, HF, HU, HI */
72 : /* 30 */ {"IS", "Ice Storm", HAZ_IS},
73 : /* LE, LS, FW */
74 : /* 31 */ {"IP", "Sleet", HAZ_IP},
75 : /* SR, TR, TI, TS, TY, WC, WS */
76 : /* Advisory section */
77 : /* 32 */ {"AS", "Air Stagnation", HAZ_AS},
78 : /* 33 */ {"AF", "Ashfall", HAZ_AF}, /* Duplicate 1 */
79 : /* 34 */ {"MH", "Ashfall", HAZ_MH}, /* Duplicate 1 */
80 : /* 35 */ {"DU", "Blowing Dust", HAZ_DU},
81 : /* 36 */ {"BS", "Blowing Snow", HAZ_BS},
82 : /* 37 */ {"BW", "Brisk Wind", HAZ_BW}, /* Blowing Wind */
83 : /* CF */
84 : /* 38 */ {"FG", "Dense Fog", HAZ_FG}, /* Duplicate 2 */
85 : /* 39 */ {"MF", "Dense Fog", HAZ_MF}, /* Duplicate 2 */
86 : /* 40 */ {"SM", "Dense Smoke", HAZ_SM}, /* Duplicate 3 */
87 : /* 41 */ {"MS", "Dense Smoke", HAZ_MS}, /* Duplicate 3 */
88 : /* 42 */ {"ZF", "Freezing Fog", HAZ_ZF},
89 : /* 43 */ {"ZR", "Freezing Rain", HAZ_ZR},
90 : /* UP */
91 : /* 45 */ {"ZY", "Heavy Freezing Spray", HAZ_ZY},
92 : /* 46 */ {"FR", "Frost", HAZ_FR},
93 : /* 47 */ {"HT", "Heat", HAZ_HT},
94 : /* SU, LE */
95 : /* 48 */ {"LB", "Lake Effect Snow and Blowing Snow", HAZ_LB},
96 : /* 49 */ {"LW", "Lake Wind", HAZ_LW},
97 : /* LS */
98 : /* 50 */ {"LO", "Low Water", HAZ_LO},
99 : /* IP */
100 : /* 51 */ {"SC", "Small Craft", HAZ_SC},
101 : /* 52 */ {"SW", "Small Craft for Hazardous Seas", HAZ_SW},
102 : /* 53 */ {"RB", "Small Craft for Rough Bar", HAZ_RB},
103 : /* 54 */ {"SI", "Small Craft for Winds", HAZ_SI},
104 : /* 55 */ {"SN", "Snow", HAZ_SN},
105 : /* 56 */ {"SB", "Snow and Blowing Snow", HAZ_SB},
106 : /* TS */
107 : /* 57 */ {"WI", "Wind", HAZ_WI},
108 : /* 58 */ {"WW", "Winter Weather", HAZ_WW},
109 : /* Extra Based on GFE documentation */
110 : /* 59 */ {"MA", "Special Marine", HAZ_MA},
111 : /* 60 */ {"EW", "Excessive Wind", HAZ_EW}, /* MPA 1/2017 comment{"EW", "Excessive Wind", HAZ_EW},comment */
112 : /* 61 */ {"FL", "Flood", HAZ_FL}, /* MPA 1/2017 comment{"FL", "Excessive Wind", HAZ_FL},comment */
113 : /* 62 */ {"SS", "Storm Surge", HAZ_SS}, /* MPA 1/2017 */
114 : /* 59 */ {"BH", "Beach Hazard", HAZ_BH},
115 : /* 60 */ {"RP", "Rip Current", HAZ_RP},
116 : /* 63 */ {"None", "None", HAZ_NONE},
117 :
118 : };
119 :
120 : enum {
121 : SIG_A, SIG_S, SIG_Y, SIG_W, SIG_NONE
122 : };
123 :
124 : /* Based on the method used in "matchHazImageCodes()" */
125 0 : static int HazardRank1 (uChar haz, uChar sig)
126 : {
127 :
128 : /*printf ("HazardRank1\n");*/
129 :
130 0 : if ((haz == HAZ_HF) && (sig == SIG_W))
131 0 : return 15;
132 0 : if ((haz == HAZ_HI) && (sig == SIG_W))
133 0 : return 16;
134 0 : if ((haz == HAZ_HU) && (sig == SIG_W))
135 0 : return 17;
136 0 : if ((haz == HAZ_TY) && (sig == SIG_W))
137 0 : return 20;
138 0 : if ((haz == HAZ_BZ) && (sig == SIG_W))
139 0 : return 23;
140 0 : if ((haz == HAZ_IS) && (sig == SIG_W))
141 0 : return 24;
142 0 : if ((haz == HAZ_TI) && (sig == SIG_W))
143 0 : return 25;
144 0 : if ((haz == HAZ_HS) && (sig == SIG_W))
145 0 : return 26;
146 0 : if ((haz == HAZ_WS) && (sig == SIG_W))
147 0 : return 27;
148 0 : if ((haz == HAZ_HW) && (sig == SIG_W))
149 0 : return 28;
150 0 : if ((haz == HAZ_TR) && (sig == SIG_W))
151 0 : return 29;
152 0 : if ((haz == HAZ_SR) && (sig == SIG_W))
153 0 : return 31;
154 0 : if ((haz == HAZ_CF) && (sig == SIG_W))
155 0 : return 36;
156 0 : if ((haz == HAZ_LS) && (sig == SIG_W))
157 0 : return 37;
158 0 : if ((haz == HAZ_SU) && (sig == SIG_W))
159 0 : return 40;
160 0 : if ((haz == HAZ_IP) && (sig == SIG_W))
161 0 : return 41;
162 0 : if ((haz == HAZ_LE) && (sig == SIG_W))
163 0 : return 42;
164 0 : if ((haz == HAZ_EH) && (sig == SIG_W))
165 0 : return 43;
166 0 : if ((haz == HAZ_DS) && (sig == SIG_W))
167 0 : return 44;
168 0 : if ((haz == HAZ_TO) && (sig == SIG_A))
169 0 : return 46;
170 0 : if ((haz == HAZ_SV) && (sig == SIG_A))
171 0 : return 48;
172 0 : if ((haz == HAZ_FF) && (sig == SIG_A))
173 0 : return 49;
174 0 : if ((haz == HAZ_GL) && (sig == SIG_W))
175 0 : return 53;
176 0 : if ((haz == HAZ_WC) && (sig == SIG_W))
177 0 : return 57;
178 0 : if ((haz == HAZ_EC) && (sig == SIG_W))
179 0 : return 58;
180 0 : if ((haz == HAZ_HZ) && (sig == SIG_W))
181 0 : return 59;
182 0 : if ((haz == HAZ_FZ) && (sig == SIG_W))
183 0 : return 60;
184 0 : if ((haz == HAZ_FW) && (sig == SIG_W))
185 0 : return 61;
186 0 : if ((haz == HAZ_HU) && (sig == SIG_A))
187 0 : return 62;
188 0 : if ((haz == HAZ_TY) && (sig == SIG_A))
189 0 : return 64;
190 0 : if ((haz == HAZ_SB) && (sig == SIG_Y))
191 0 : return 68;
192 0 : if ((haz == HAZ_ZR) && (sig == SIG_Y))
193 0 : return 69;
194 0 : if ((haz == HAZ_IP) && (sig == SIG_Y))
195 0 : return 71;
196 0 : if ((haz == HAZ_WW) && (sig == SIG_Y))
197 0 : return 72;
198 0 : if ((haz == HAZ_LB) && (sig == SIG_Y))
199 0 : return 73;
200 0 : if ((haz == HAZ_LE) && (sig == SIG_Y))
201 0 : return 74;
202 0 : if ((haz == HAZ_WC) && (sig == SIG_Y))
203 0 : return 75;
204 0 : if ((haz == HAZ_HT) && (sig == SIG_Y))
205 0 : return 76;
206 : /*
207 : if ((haz == HAZ_FA) && (sig == SIG_Y))
208 : return 77;
209 : */
210 0 : if ((haz == HAZ_LS) && (sig == SIG_Y))
211 0 : return 82;
212 0 : if ((haz == HAZ_CF) && (sig == SIG_Y))
213 0 : return 83;
214 0 : if ((haz == HAZ_SU) && (sig == SIG_Y))
215 0 : return 85;
216 0 : if ((haz == HAZ_BS) && (sig == SIG_Y))
217 0 : return 86;
218 0 : if ((haz == HAZ_SN) && (sig == SIG_Y))
219 0 : return 87;
220 0 : if ((haz == HAZ_UP) && (sig == SIG_W))
221 0 : return 88;
222 0 : if ((haz == HAZ_SM) && (sig == SIG_Y))
223 0 : return 89;
224 0 : if ((haz == HAZ_SW) && (sig == SIG_Y))
225 0 : return 90;
226 0 : if ((haz == HAZ_RB) && (sig == SIG_Y))
227 0 : return 91;
228 0 : if ((haz == HAZ_SI) && (sig == SIG_Y))
229 0 : return 92;
230 0 : if ((haz == HAZ_SC) && (sig == SIG_Y))
231 0 : return 93;
232 0 : if ((haz == HAZ_BW) && (sig == SIG_Y))
233 0 : return 94;
234 0 : if ((haz == HAZ_SE) && (sig == SIG_W))
235 0 : return 95;
236 0 : if ((haz == HAZ_FG) && (sig == SIG_Y))
237 0 : return 96;
238 0 : if ((haz == HAZ_LW) && (sig == SIG_Y))
239 0 : return 97;
240 0 : if ((haz == HAZ_WI) && (sig == SIG_Y))
241 0 : return 98;
242 0 : if ((haz == HAZ_DU) && (sig == SIG_Y))
243 0 : return 99;
244 0 : if ((haz == HAZ_FR) && (sig == SIG_Y))
245 0 : return 100;
246 0 : if ((haz == HAZ_AF) && (sig == SIG_Y))
247 0 : return 101;
248 0 : if ((haz == HAZ_ZF) && (sig == SIG_Y))
249 0 : return 102;
250 0 : if ((haz == HAZ_UP) && (sig == SIG_Y))
251 0 : return 103;
252 0 : if ((haz == HAZ_AS) && (sig == SIG_Y))
253 0 : return 104;
254 0 : if ((haz == HAZ_LO) && (sig == SIG_Y))
255 0 : return 105;
256 0 : if ((haz == HAZ_BZ) && (sig == SIG_A))
257 0 : return 108;
258 0 : if ((haz == HAZ_TI) && (sig == SIG_A))
259 0 : return 109;
260 0 : if ((haz == HAZ_TR) && (sig == SIG_A))
261 0 : return 110;
262 0 : if ((haz == HAZ_HI) && (sig == SIG_A))
263 0 : return 112;
264 0 : if ((haz == HAZ_WS) && (sig == SIG_A))
265 0 : return 113;
266 0 : if ((haz == HAZ_CF) && (sig == SIG_A))
267 0 : return 114;
268 0 : if ((haz == HAZ_LS) && (sig == SIG_A))
269 0 : return 115;
270 0 : if ((haz == HAZ_FA) && (sig == SIG_A))
271 0 : return 117;
272 0 : if ((haz == HAZ_HW) && (sig == SIG_A))
273 0 : return 118;
274 0 : if ((haz == HAZ_EH) && (sig == SIG_A))
275 0 : return 119;
276 0 : if ((haz == HAZ_EC) && (sig == SIG_A))
277 0 : return 120;
278 0 : if ((haz == HAZ_WC) && (sig == SIG_A))
279 0 : return 121;
280 0 : if ((haz == HAZ_LE) && (sig == SIG_A))
281 0 : return 122;
282 0 : if ((haz == HAZ_FZ) && (sig == SIG_A))
283 0 : return 123;
284 0 : if ((haz == HAZ_FW) && (sig == SIG_A))
285 0 : return 124;
286 : /*
287 : if ((haz == HAZ_CF) && (sig == SIG_S))
288 : return 128;
289 : if ((haz == HAZ_LS) && (sig == SIG_S))
290 : return 129;
291 : if ((haz == HAZ_MA) && (sig == SIG_S))
292 : return 131;
293 : */
294 0 : return 9999;
295 : }
296 :
297 0 : static int HazTable1 (HazardStringType * haz)
298 : {
299 : int minVal;
300 : int i;
301 : int ans;
302 :
303 0 : minVal = 9999;
304 0 : for (i = 0; i < haz->numValid; i++) {
305 0 : ans = HazardRank1 (haz->haz[i], haz->sig[i]);
306 0 : if (minVal > ans) {
307 0 : minVal = ans;
308 : }
309 : }
310 0 : if (minVal > 131)
311 0 : minVal = 0;
312 0 : return minVal;
313 : }
314 :
315 : /* Based on the method used in "matchHazImageCodes()" */
316 : /* Based on Michael Allard email: 9/12/2008 */
317 0 : static int HazardRank2 (uChar haz, uChar sig)
318 : {
319 :
320 : /*printf ("HazardRank2\n");*/
321 :
322 0 : if ((haz == HAZ_TS) && (sig == SIG_W)) return 1;
323 :
324 0 : if ((haz == HAZ_HF) && (sig == SIG_W)) return 15;
325 0 : if ((haz == HAZ_HI) && (sig == SIG_W)) return 16;
326 0 : if ((haz == HAZ_HU) && (sig == SIG_W)) return 17;
327 :
328 0 : if ((haz == HAZ_TY) && (sig == SIG_W)) return 19;
329 :
330 0 : if ((haz == HAZ_BZ) && (sig == SIG_W)) return 23;
331 0 : if ((haz == HAZ_IS) && (sig == SIG_W)) return 24;
332 0 : if ((haz == HAZ_TI) && (sig == SIG_W)) return 25;
333 0 : if ((haz == HAZ_HS) && (sig == SIG_W)) return 26;
334 0 : if ((haz == HAZ_WS) && (sig == SIG_W)) return 27;
335 0 : if ((haz == HAZ_HW) && (sig == SIG_W)) return 28;
336 0 : if ((haz == HAZ_TR) && (sig == SIG_W)) return 29;
337 :
338 0 : if ((haz == HAZ_SR) && (sig == SIG_W)) return 31;
339 0 : if ((haz == HAZ_TS) && (sig == SIG_A)) return 32;
340 :
341 0 : if ((haz == HAZ_CF) && (sig == SIG_W)) return 36;
342 0 : if ((haz == HAZ_LS) && (sig == SIG_W)) return 37;
343 :
344 0 : if ((haz == HAZ_SU) && (sig == SIG_W)) return 40;
345 0 : if ((haz == HAZ_IP) && (sig == SIG_W)) return 41;
346 0 : if ((haz == HAZ_LE) && (sig == SIG_W)) return 42;
347 0 : if ((haz == HAZ_EH) && (sig == SIG_W)) return 43;
348 0 : if ((haz == HAZ_DS) && (sig == SIG_W)) return 44;
349 0 : if ((haz == HAZ_TO) && (sig == SIG_A)) return 45;
350 :
351 0 : if ((haz == HAZ_SV) && (sig == SIG_A)) return 47;
352 :
353 0 : if ((haz == HAZ_FF) && (sig == SIG_A)) return 49;
354 :
355 0 : if ((haz == HAZ_GL) && (sig == SIG_W)) return 53;
356 :
357 0 : if ((haz == HAZ_WC) && (sig == SIG_W)) return 57;
358 0 : if ((haz == HAZ_EC) && (sig == SIG_W)) return 58;
359 0 : if ((haz == HAZ_HZ) && (sig == SIG_W)) return 59;
360 0 : if ((haz == HAZ_FZ) && (sig == SIG_W)) return 60;
361 0 : if ((haz == HAZ_FW) && (sig == SIG_W)) return 61;
362 0 : if ((haz == HAZ_HU) && (sig == SIG_A)) return 62;
363 :
364 0 : if ((haz == HAZ_TY) && (sig == SIG_A)) return 64;
365 :
366 0 : if ((haz == HAZ_SB) && (sig == SIG_Y)) return 68;
367 0 : if ((haz == HAZ_ZR) && (sig == SIG_Y)) return 69;
368 :
369 0 : if ((haz == HAZ_IP) && (sig == SIG_Y)) return 71;
370 0 : if ((haz == HAZ_WW) && (sig == SIG_Y)) return 72;
371 0 : if ((haz == HAZ_LB) && (sig == SIG_Y)) return 73;
372 0 : if ((haz == HAZ_LE) && (sig == SIG_Y)) return 74;
373 0 : if ((haz == HAZ_WC) && (sig == SIG_Y)) return 75;
374 0 : if ((haz == HAZ_HT) && (sig == SIG_Y)) return 76;
375 :
376 0 : if ((haz == HAZ_LS) && (sig == SIG_Y)) return 83;
377 0 : if ((haz == HAZ_CF) && (sig == SIG_Y)) return 84;
378 0 : if ((haz == HAZ_SU) && (sig == SIG_Y)) return 85;
379 0 : if ((haz == HAZ_BS) && (sig == SIG_Y)) return 86;
380 0 : if ((haz == HAZ_SN) && (sig == SIG_Y)) return 87;
381 0 : if ((haz == HAZ_UP) && (sig == SIG_W)) return 88;
382 0 : if ((haz == HAZ_SM) && (sig == SIG_Y)) return 89;
383 0 : if ((haz == HAZ_MS) && (sig == SIG_Y)) return 90;
384 0 : if ((haz == HAZ_SW) && (sig == SIG_Y)) return 91;
385 0 : if ((haz == HAZ_RB) && (sig == SIG_Y)) return 92;
386 0 : if ((haz == HAZ_SI) && (sig == SIG_Y)) return 93;
387 0 : if ((haz == HAZ_SC) && (sig == SIG_Y)) return 94;
388 0 : if ((haz == HAZ_BW) && (sig == SIG_Y)) return 95;
389 0 : if ((haz == HAZ_SE) && (sig == SIG_W)) return 96;
390 0 : if ((haz == HAZ_FG) && (sig == SIG_Y)) return 97;
391 0 : if ((haz == HAZ_MF) && (sig == SIG_Y)) return 98;
392 0 : if ((haz == HAZ_LW) && (sig == SIG_Y)) return 99;
393 0 : if ((haz == HAZ_WI) && (sig == SIG_Y)) return 100;
394 0 : if ((haz == HAZ_DU) && (sig == SIG_Y)) return 101;
395 0 : if ((haz == HAZ_FR) && (sig == SIG_Y)) return 102;
396 0 : if ((haz == HAZ_AF) && (sig == SIG_Y)) return 103;
397 0 : if ((haz == HAZ_MH) && (sig == SIG_Y)) return 104;
398 0 : if ((haz == HAZ_ZF) && (sig == SIG_Y)) return 105;
399 0 : if ((haz == HAZ_UP) && (sig == SIG_Y)) return 106;
400 0 : if ((haz == HAZ_ZY) && (sig == SIG_Y)) return 107;
401 :
402 0 : if ((haz == HAZ_AS) && (sig == SIG_Y)) return 109;
403 0 : if ((haz == HAZ_LO) && (sig == SIG_Y)) return 110;
404 :
405 0 : if ((haz == HAZ_BZ) && (sig == SIG_A)) return 113;
406 0 : if ((haz == HAZ_TI) && (sig == SIG_A)) return 114;
407 0 : if ((haz == HAZ_HF) && (sig == SIG_A)) return 115;
408 0 : if ((haz == HAZ_HI) && (sig == SIG_A)) return 116;
409 0 : if ((haz == HAZ_TR) && (sig == SIG_A)) return 117;
410 :
411 0 : if ((haz == HAZ_SR) && (sig == SIG_A)) return 119;
412 0 : if ((haz == HAZ_GL) && (sig == SIG_A)) return 120;
413 0 : if ((haz == HAZ_WS) && (sig == SIG_A)) return 121;
414 0 : if ((haz == HAZ_SE) && (sig == SIG_A)) return 122;
415 0 : if ((haz == HAZ_UP) && (sig == SIG_A)) return 123;
416 0 : if ((haz == HAZ_CF) && (sig == SIG_A)) return 124;
417 0 : if ((haz == HAZ_LS) && (sig == SIG_A)) return 125;
418 :
419 0 : if ((haz == HAZ_FA) && (sig == SIG_A)) return 127;
420 0 : if ((haz == HAZ_HW) && (sig == SIG_A)) return 128;
421 0 : if ((haz == HAZ_EH) && (sig == SIG_A)) return 129;
422 0 : if ((haz == HAZ_EC) && (sig == SIG_A)) return 130;
423 0 : if ((haz == HAZ_WC) && (sig == SIG_A)) return 131;
424 0 : if ((haz == HAZ_LE) && (sig == SIG_A)) return 132;
425 0 : if ((haz == HAZ_HZ) && (sig == SIG_A)) return 133;
426 0 : if ((haz == HAZ_FZ) && (sig == SIG_A)) return 134;
427 0 : if ((haz == HAZ_FW) && (sig == SIG_A)) return 135;
428 :
429 0 : if ((haz == HAZ_CF) && (sig == SIG_S)) return 139;
430 :
431 0 : return 9999;
432 : }
433 :
434 0 : static int HazTable2 (HazardStringType * haz)
435 : {
436 : int minVal;
437 : int i;
438 : int ans;
439 :
440 0 : minVal = 9999;
441 0 : for (i = 0; i < haz->numValid; i++) {
442 0 : ans = HazardRank2 (haz->haz[i], haz->sig[i]);
443 0 : if (minVal > ans) {
444 0 : minVal = ans;
445 : }
446 : }
447 0 : if (minVal > 141)
448 0 : minVal = 0;
449 0 : return minVal;
450 : }
451 :
452 : /* Based on the method used in "matchHazImageCodes()" */
453 : /* Based on Michael Allard email: 7/13/2009 */
454 0 : static int HazardRank3 (uChar haz, uChar sig)
455 : {
456 :
457 : /*printf ("HazardRank3\n");*/
458 :
459 0 : if ((haz == HAZ_TS) && (sig == SIG_W)) return 1;
460 :
461 0 : if ((haz == HAZ_HF) && (sig == SIG_W)) return 15;
462 0 : if ((haz == HAZ_HI) && (sig == SIG_W)) return 16;
463 0 : if ((haz == HAZ_HU) && (sig == SIG_W)) return 17;
464 :
465 0 : if ((haz == HAZ_TY) && (sig == SIG_W)) return 19;
466 :
467 0 : if ((haz == HAZ_BZ) && (sig == SIG_W)) return 23;
468 0 : if ((haz == HAZ_IS) && (sig == SIG_W)) return 24;
469 0 : if ((haz == HAZ_TI) && (sig == SIG_W)) return 25;
470 0 : if ((haz == HAZ_HS) && (sig == SIG_W)) return 26;
471 0 : if ((haz == HAZ_WS) && (sig == SIG_W)) return 27;
472 0 : if ((haz == HAZ_HW) && (sig == SIG_W)) return 28;
473 0 : if ((haz == HAZ_TR) && (sig == SIG_W)) return 29;
474 :
475 0 : if ((haz == HAZ_SR) && (sig == SIG_W)) return 31;
476 0 : if ((haz == HAZ_TS) && (sig == SIG_A)) return 32;
477 :
478 0 : if ((haz == HAZ_AF) && (sig == SIG_W)) return 36;
479 0 : if ((haz == HAZ_CF) && (sig == SIG_W)) return 37;
480 0 : if ((haz == HAZ_LS) && (sig == SIG_W)) return 38;
481 :
482 0 : if ((haz == HAZ_SU) && (sig == SIG_W)) return 41;
483 0 : if ((haz == HAZ_IP) && (sig == SIG_W)) return 42;
484 0 : if ((haz == HAZ_LE) && (sig == SIG_W)) return 43;
485 0 : if ((haz == HAZ_EH) && (sig == SIG_W)) return 44;
486 0 : if ((haz == HAZ_DS) && (sig == SIG_W)) return 45;
487 0 : if ((haz == HAZ_TO) && (sig == SIG_A)) return 46;
488 :
489 0 : if ((haz == HAZ_SV) && (sig == SIG_A)) return 48;
490 :
491 0 : if ((haz == HAZ_FF) && (sig == SIG_A)) return 50;
492 :
493 0 : if ((haz == HAZ_GL) && (sig == SIG_W)) return 54;
494 :
495 0 : if ((haz == HAZ_WC) && (sig == SIG_W)) return 58;
496 0 : if ((haz == HAZ_EC) && (sig == SIG_W)) return 59;
497 0 : if ((haz == HAZ_HZ) && (sig == SIG_W)) return 60;
498 0 : if ((haz == HAZ_FZ) && (sig == SIG_W)) return 61;
499 0 : if ((haz == HAZ_FW) && (sig == SIG_W)) return 62;
500 0 : if ((haz == HAZ_HU) && (sig == SIG_A)) return 63;
501 :
502 0 : if ((haz == HAZ_TY) && (sig == SIG_A)) return 65;
503 :
504 0 : if ((haz == HAZ_SB) && (sig == SIG_Y)) return 69;
505 0 : if ((haz == HAZ_ZR) && (sig == SIG_Y)) return 70;
506 :
507 0 : if ((haz == HAZ_IP) && (sig == SIG_Y)) return 72;
508 0 : if ((haz == HAZ_WW) && (sig == SIG_Y)) return 73;
509 0 : if ((haz == HAZ_LB) && (sig == SIG_Y)) return 74;
510 0 : if ((haz == HAZ_LE) && (sig == SIG_Y)) return 75;
511 0 : if ((haz == HAZ_WC) && (sig == SIG_Y)) return 76;
512 0 : if ((haz == HAZ_HT) && (sig == SIG_Y)) return 77;
513 :
514 0 : if ((haz == HAZ_LS) && (sig == SIG_Y)) return 84;
515 0 : if ((haz == HAZ_CF) && (sig == SIG_Y)) return 85;
516 0 : if ((haz == HAZ_SU) && (sig == SIG_Y)) return 86;
517 0 : if ((haz == HAZ_BS) && (sig == SIG_Y)) return 87;
518 0 : if ((haz == HAZ_SN) && (sig == SIG_Y)) return 88;
519 0 : if ((haz == HAZ_UP) && (sig == SIG_W)) return 89;
520 0 : if ((haz == HAZ_SM) && (sig == SIG_Y)) return 90;
521 0 : if ((haz == HAZ_MS) && (sig == SIG_Y)) return 91;
522 0 : if ((haz == HAZ_SW) && (sig == SIG_Y)) return 92;
523 0 : if ((haz == HAZ_RB) && (sig == SIG_Y)) return 93;
524 0 : if ((haz == HAZ_SI) && (sig == SIG_Y)) return 94;
525 0 : if ((haz == HAZ_SC) && (sig == SIG_Y)) return 95;
526 0 : if ((haz == HAZ_BW) && (sig == SIG_Y)) return 96;
527 0 : if ((haz == HAZ_SE) && (sig == SIG_W)) return 97;
528 0 : if ((haz == HAZ_FG) && (sig == SIG_Y)) return 98;
529 0 : if ((haz == HAZ_MF) && (sig == SIG_Y)) return 99;
530 0 : if ((haz == HAZ_LW) && (sig == SIG_Y)) return 100;
531 0 : if ((haz == HAZ_WI) && (sig == SIG_Y)) return 101;
532 0 : if ((haz == HAZ_DU) && (sig == SIG_Y)) return 102;
533 0 : if ((haz == HAZ_FR) && (sig == SIG_Y)) return 103;
534 0 : if ((haz == HAZ_AF) && (sig == SIG_Y)) return 104;
535 0 : if ((haz == HAZ_MH) && (sig == SIG_Y)) return 105;
536 0 : if ((haz == HAZ_ZF) && (sig == SIG_Y)) return 106;
537 0 : if ((haz == HAZ_UP) && (sig == SIG_Y)) return 107;
538 0 : if ((haz == HAZ_ZY) && (sig == SIG_Y)) return 108;
539 :
540 0 : if ((haz == HAZ_AS) && (sig == SIG_Y)) return 110;
541 0 : if ((haz == HAZ_LO) && (sig == SIG_Y)) return 111;
542 :
543 0 : if ((haz == HAZ_BZ) && (sig == SIG_A)) return 114;
544 0 : if ((haz == HAZ_TI) && (sig == SIG_A)) return 115;
545 0 : if ((haz == HAZ_HF) && (sig == SIG_A)) return 116;
546 0 : if ((haz == HAZ_HI) && (sig == SIG_A)) return 117;
547 0 : if ((haz == HAZ_TR) && (sig == SIG_A)) return 118;
548 :
549 0 : if ((haz == HAZ_SR) && (sig == SIG_A)) return 120;
550 0 : if ((haz == HAZ_GL) && (sig == SIG_A)) return 121;
551 0 : if ((haz == HAZ_WS) && (sig == SIG_A)) return 122;
552 0 : if ((haz == HAZ_SE) && (sig == SIG_A)) return 123;
553 0 : if ((haz == HAZ_UP) && (sig == SIG_A)) return 124;
554 0 : if ((haz == HAZ_CF) && (sig == SIG_A)) return 125;
555 0 : if ((haz == HAZ_LS) && (sig == SIG_A)) return 126;
556 :
557 0 : if ((haz == HAZ_FA) && (sig == SIG_A)) return 128;
558 0 : if ((haz == HAZ_HW) && (sig == SIG_A)) return 129;
559 0 : if ((haz == HAZ_EH) && (sig == SIG_A)) return 130;
560 0 : if ((haz == HAZ_EC) && (sig == SIG_A)) return 131;
561 0 : if ((haz == HAZ_WC) && (sig == SIG_A)) return 132;
562 0 : if ((haz == HAZ_LE) && (sig == SIG_A)) return 133;
563 0 : if ((haz == HAZ_HZ) && (sig == SIG_A)) return 134;
564 0 : if ((haz == HAZ_FZ) && (sig == SIG_A)) return 135;
565 0 : if ((haz == HAZ_FW) && (sig == SIG_A)) return 136;
566 :
567 0 : if ((haz == HAZ_CF) && (sig == SIG_S)) return 140;
568 :
569 0 : return 9999;
570 : }
571 :
572 0 : static int HazTable3 (HazardStringType * haz)
573 : {
574 : int minVal;
575 : int i;
576 : int ans;
577 :
578 0 : minVal = 9999;
579 0 : for (i = 0; i < haz->numValid; i++) {
580 0 : ans = HazardRank3 (haz->haz[i], haz->sig[i]);
581 0 : if (minVal > ans) {
582 0 : minVal = ans;
583 : }
584 : }
585 0 : if (minVal > 148)
586 0 : minVal = 0;
587 0 : return minVal;
588 : }
589 :
590 : /* MPA 1/2017 */
591 : /* Based on the method used in "makeHazImageCodes.C" */
592 : /* Based on Timothy Boyer email: 1/2017 */
593 0 : static int HazardRank4 (uChar haz, uChar sig)
594 : {
595 :
596 : /*printf ("HazardRank4\n");*/
597 :
598 0 : if ((haz == HAZ_TS) && (sig == SIG_W)) return 1;
599 0 : if ((haz == HAZ_TO) && (sig == SIG_W)) return 2;
600 0 : if ((haz == HAZ_EW) && (sig == SIG_W)) return 3;
601 0 : if ((haz == HAZ_SV) && (sig == SIG_W)) return 4;
602 0 : if ((haz == HAZ_FF) && (sig == SIG_W)) return 5;
603 :
604 0 : if ((haz == HAZ_HF) && (sig == SIG_W)) return 15;
605 0 : if ((haz == HAZ_HI) && (sig == SIG_W)) return 16;
606 0 : if ((haz == HAZ_SS) && (sig == SIG_W)) return 17; /* Added MPA 1/2017 */
607 0 : if ((haz == HAZ_HU) && (sig == SIG_W)) return 18;
608 : //if ((haz == HAZ_HU) && (sig == SIG_W)) return 19;
609 0 : if ((haz == HAZ_TY) && (sig == SIG_W)) return 20; /* Added MPA 3/2017 */
610 : //if ((haz == HAZ_TY) && (sig == SIG_W)) return 21;
611 0 : if ((haz == HAZ_MA) && (sig == SIG_W)) return 22;
612 : //if ((haz == HAZ_MA) && (sig == SIG_W)) return 23;
613 0 : if ((haz == HAZ_BZ) && (sig == SIG_W)) return 24;
614 0 : if ((haz == HAZ_IS) && (sig == SIG_W)) return 25;
615 0 : if ((haz == HAZ_TI) && (sig == SIG_W)) return 26;
616 0 : if ((haz == HAZ_HS) && (sig == SIG_W)) return 27;
617 0 : if ((haz == HAZ_WS) && (sig == SIG_W)) return 28;
618 0 : if ((haz == HAZ_HW) && (sig == SIG_W)) return 29;
619 0 : if ((haz == HAZ_TR) && (sig == SIG_W)) return 30;
620 : //if ((haz == HAZ_TR) && (sig == SIG_W)) return 31;
621 0 : if ((haz == HAZ_SR) && (sig == SIG_W)) return 32;
622 0 : if ((haz == HAZ_TS) && (sig == SIG_A)) return 33;
623 :
624 0 : if ((haz == HAZ_AF) && (sig == SIG_W)) return 36; /* Added MPA 3/2017 */
625 0 : if ((haz == HAZ_CF) && (sig == SIG_W)) return 37;
626 0 : if ((haz == HAZ_LS) && (sig == SIG_W)) return 38;
627 0 : if ((haz == HAZ_FA) && (sig == SIG_W)) return 39;
628 0 : if ((haz == HAZ_FL) && (sig == SIG_W)) return 40;
629 0 : if ((haz == HAZ_SU) && (sig == SIG_W)) return 41;
630 0 : if ((haz == HAZ_IP) && (sig == SIG_W)) return 42;
631 0 : if ((haz == HAZ_LE) && (sig == SIG_W)) return 43;
632 0 : if ((haz == HAZ_EH) && (sig == SIG_W)) return 44;
633 0 : if ((haz == HAZ_DS) && (sig == SIG_W)) return 45;
634 0 : if ((haz == HAZ_TO) && (sig == SIG_A)) return 46;
635 : //if ((haz == HAZ_TO) && (sig == SIG_A)) return 47;
636 0 : if ((haz == HAZ_SV) && (sig == SIG_A)) return 48;
637 : //if ((haz == HAZ_SV) && (sig == SIG_A)) return 49;
638 0 : if ((haz == HAZ_FF) && (sig == SIG_A)) return 50;
639 : //if ((haz == HAZ_TO) && (sig == SIG_W)) return 51;
640 : //if ((haz == HAZ_SV) && (sig == SIG_W)) return 52;
641 : //if ((haz == HAZ_FF) && (sig == SIG_W)) return 53;
642 0 : if ((haz == HAZ_GL) && (sig == SIG_W)) return 54;
643 : //if ((haz == HAZ_FA) && (sig == SIG_W)) return 55;
644 : //if ((haz == HAZ_FL) && (sig == SIG_W)) return 56;
645 0 : if ((haz == HAZ_TS) && (sig == SIG_Y)) return 57; /* Added MPA 3/2017 */
646 0 : if ((haz == HAZ_WC) && (sig == SIG_W)) return 58;
647 0 : if ((haz == HAZ_EC) && (sig == SIG_W)) return 59;
648 0 : if ((haz == HAZ_HZ) && (sig == SIG_W)) return 60;
649 0 : if ((haz == HAZ_FZ) && (sig == SIG_W)) return 61;
650 0 : if ((haz == HAZ_FW) && (sig == SIG_W)) return 62;
651 0 : if ((haz == HAZ_SS) && (sig == SIG_A)) return 63; /* Added MPA 1/2017 */
652 0 : if ((haz == HAZ_HU) && (sig == SIG_A)) return 64;
653 : //if ((haz == HAZ_HU) && (sig == SIG_A)) return 65;
654 0 : if ((haz == HAZ_TY) && (sig == SIG_A)) return 66;
655 : //if ((haz == HAZ_TY) && (sig == SIG_A)) return 67; /* Added MPA 3/2017 */
656 0 : if ((haz == HAZ_HU) && (sig == SIG_S)) return 68;
657 : /* Added MPA 3/2017 */
658 0 : if ((haz == HAZ_TY) && (sig == SIG_S)) return 69;
659 : /* Added MPA 3/2017 */
660 0 : if ((haz == HAZ_SB) && (sig == SIG_Y)) return 70;
661 0 : if ((haz == HAZ_ZR) && (sig == SIG_Y)) return 71;
662 :
663 0 : if ((haz == HAZ_IP) && (sig == SIG_Y)) return 73;
664 0 : if ((haz == HAZ_WW) && (sig == SIG_Y)) return 74;
665 0 : if ((haz == HAZ_LB) && (sig == SIG_Y)) return 75;
666 0 : if ((haz == HAZ_LE) && (sig == SIG_Y)) return 76;
667 0 : if ((haz == HAZ_WC) && (sig == SIG_Y)) return 77;
668 0 : if ((haz == HAZ_HT) && (sig == SIG_Y)) return 78;
669 0 : if ((haz == HAZ_FA) && (sig == SIG_Y)) return 79;
670 : //if ((haz == HAZ_FA) && (sig == SIG_Y)) return 80;
671 : //if ((haz == HAZ_FA) && (sig == SIG_Y)) return 81;
672 : //if ((haz == HAZ_FA) && (sig == SIG_Y)) return 82;
673 0 : if ((haz == HAZ_FL) && (sig == SIG_Y)) return 83; /* Added MPA 3/2017 */
674 : //if ((haz == HAZ_FA) && (sig == SIG_Y)) return 84;
675 0 : if ((haz == HAZ_LS) && (sig == SIG_Y)) return 85;
676 0 : if ((haz == HAZ_CF) && (sig == SIG_Y)) return 86;
677 0 : if ((haz == HAZ_SU) && (sig == SIG_Y)) return 87;
678 0 : if ((haz == HAZ_BS) && (sig == SIG_Y)) return 88;
679 0 : if ((haz == HAZ_SN) && (sig == SIG_Y)) return 89;
680 0 : if ((haz == HAZ_UP) && (sig == SIG_W)) return 90;
681 0 : if ((haz == HAZ_SM) && (sig == SIG_Y)) return 91;
682 0 : if ((haz == HAZ_MS) && (sig == SIG_Y)) return 92;
683 0 : if ((haz == HAZ_SW) && (sig == SIG_Y)) return 93;
684 0 : if ((haz == HAZ_RB) && (sig == SIG_Y)) return 94;
685 0 : if ((haz == HAZ_SI) && (sig == SIG_Y)) return 95;
686 0 : if ((haz == HAZ_SC) && (sig == SIG_Y)) return 96;
687 0 : if ((haz == HAZ_BW) && (sig == SIG_Y)) return 97;
688 0 : if ((haz == HAZ_SE) && (sig == SIG_W)) return 98;
689 0 : if ((haz == HAZ_FG) && (sig == SIG_Y)) return 99;
690 0 : if ((haz == HAZ_MF) && (sig == SIG_Y)) return 100;
691 0 : if ((haz == HAZ_LW) && (sig == SIG_Y)) return 101;
692 0 : if ((haz == HAZ_WI) && (sig == SIG_Y)) return 102;
693 0 : if ((haz == HAZ_DU) && (sig == SIG_Y)) return 103;
694 0 : if ((haz == HAZ_FR) && (sig == SIG_Y)) return 104;
695 0 : if ((haz == HAZ_AF) && (sig == SIG_Y)) return 105;
696 0 : if ((haz == HAZ_MH) && (sig == SIG_Y)) return 106;
697 0 : if ((haz == HAZ_ZF) && (sig == SIG_Y)) return 107;
698 0 : if ((haz == HAZ_UP) && (sig == SIG_Y)) return 108;
699 0 : if ((haz == HAZ_AS) && (sig == SIG_Y)) return 109;
700 0 : if ((haz == HAZ_LO) && (sig == SIG_Y)) return 110;
701 :
702 0 : if ((haz == HAZ_BZ) && (sig == SIG_A)) return 113;
703 0 : if ((haz == HAZ_RP) && (sig == SIG_S)) return 114; /* Added MPA 3/2017 */
704 0 : if ((haz == HAZ_BH) && (sig == SIG_S)) return 115; /* Added MPA 3/2017 */
705 0 : if ((haz == HAZ_TI) && (sig == SIG_A)) return 116;
706 0 : if ((haz == HAZ_HF) && (sig == SIG_A)) return 117;
707 0 : if ((haz == HAZ_HI) && (sig == SIG_A)) return 118;
708 0 : if ((haz == HAZ_TR) && (sig == SIG_A)) return 119;
709 : //if ((haz == HAZ_TR) && (sig == SIG_A)) return 120;
710 0 : if ((haz == HAZ_SR) && (sig == SIG_A)) return 121;
711 0 : if ((haz == HAZ_GL) && (sig == SIG_A)) return 122;
712 0 : if ((haz == HAZ_WS) && (sig == SIG_A)) return 123;
713 0 : if ((haz == HAZ_SE) && (sig == SIG_A)) return 124;
714 0 : if ((haz == HAZ_UP) && (sig == SIG_A)) return 125;
715 0 : if ((haz == HAZ_CF) && (sig == SIG_A)) return 126;
716 0 : if ((haz == HAZ_LS) && (sig == SIG_A)) return 127;
717 0 : if ((haz == HAZ_FA) && (sig == SIG_A)) return 128;
718 0 : if ((haz == HAZ_HW) && (sig == SIG_A)) return 129;
719 0 : if ((haz == HAZ_EH) && (sig == SIG_A)) return 130;
720 0 : if ((haz == HAZ_EC) && (sig == SIG_A)) return 131;
721 0 : if ((haz == HAZ_WC) && (sig == SIG_A)) return 132;
722 0 : if ((haz == HAZ_LE) && (sig == SIG_A)) return 133;
723 0 : if ((haz == HAZ_HZ) && (sig == SIG_A)) return 134;
724 0 : if ((haz == HAZ_FZ) && (sig == SIG_A)) return 135;
725 0 : if ((haz == HAZ_FW) && (sig == SIG_A)) return 136;
726 :
727 0 : if ((haz == HAZ_CF) && (sig == SIG_S)) return 140;
728 0 : if ((haz == HAZ_LS) && (sig == SIG_S)) return 141;
729 0 : if ((haz == HAZ_MA) && (sig == SIG_S)) return 142;
730 :
731 0 : if ((haz == HAZ_TR) && (sig == SIG_S)) return 147;
732 :
733 0 : return 9999;
734 : }
735 :
736 : /* MPA 1/2017 */
737 0 : static int HazTable4 (HazardStringType * haz)
738 : {
739 : int minVal;
740 : int i;
741 : int ans;
742 :
743 0 : minVal = 9999;
744 0 : for (i = 0; i < haz->numValid; i++) {
745 0 : ans = HazardRank4 (haz->haz[i], haz->sig[i]); /* MPA 1/2017 */
746 0 : if (minVal > ans) {
747 0 : minVal = ans;
748 : }
749 : }
750 0 : if (minVal > 155)
751 0 : minVal = 0;
752 0 : return minVal;
753 : }
754 :
755 :
756 :
757 0 : static void InitHazardString (HazardStringType * haz)
758 : {
759 : int i; /* Used to traverse all the words. */
760 :
761 0 : haz->numValid = 0;
762 0 : haz->SimpleCode = 0;
763 0 : for (i = 0; i < NUM_HAZARD_WORD; i++) {
764 0 : haz->haz[i] = HAZ_NONE;
765 0 : haz->sig[i] = SIG_NONE;
766 0 : haz->english[i] = NULL;
767 : }
768 0 : }
769 :
770 0 : void FreeHazardString (HazardStringType * haz)
771 : {
772 : int j; /* Used to free all the english words. */
773 :
774 0 : for (j = 0; j < NUM_HAZARD_WORD; j++) {
775 0 : free (haz->english[j]);
776 : }
777 0 : InitHazardString (haz);
778 0 : }
779 :
780 0 : static void Hazard2English (HazardStringType * haz)
781 : {
782 : int i; /* Loop counter over number of words. */
783 : char buffer[400]; /* Temporary storage as we build up the phrase. */
784 :
785 0 : for (i = 0; i < haz->numValid; i++) {
786 0 : buffer[0] = '\0';
787 0 : if (haz->haz[i] == HAZ_NONE) {
788 0 : strcat (buffer, "<None>");
789 : } else {
790 0 : snprintf (buffer, sizeof(buffer), "%s", HazCode[haz->haz[i]].name);
791 0 : switch (haz->sig[i]) {
792 0 : case SIG_A:
793 0 : strcat (buffer, " Watch");
794 0 : break;
795 0 : case SIG_S:
796 0 : strcat (buffer, " Statement");
797 0 : break;
798 0 : case SIG_Y:
799 0 : strcat (buffer, " Advisory");
800 0 : break;
801 0 : case SIG_W:
802 0 : strcat (buffer, " Warning");
803 0 : break;
804 : }
805 0 : }
806 0 : haz->english[i] = (char *) malloc ((strlen (buffer) + 1) *
807 : sizeof (char));
808 0 : strcpy (haz->english[i], buffer);
809 : }
810 0 : }
811 :
812 0 : void ParseHazardString (HazardStringType * haz, char *data, int simpleVer)
813 : {
814 : char *start; /* Where current phrase starts. */
815 : char *end;
816 : char *ptr;
817 0 : uChar word = 0; /* Which word in sentence (# of ^ seen) */
818 : char f_continue;
819 : char f_found;
820 : int i;
821 :
822 0 : InitHazardString (haz);
823 : /* Handle 'None case. */
824 0 : if (strcmp (data, "<None>") == 0) {
825 0 : haz->numValid = 1;
826 0 : haz->haz[0] = HAZ_NONE;
827 0 : haz->sig[0] = SIG_NONE;
828 0 : Hazard2English (haz);
829 0 : if (simpleVer == 1) {
830 0 : haz->SimpleCode = HazTable1 (haz);
831 0 : } else if (simpleVer == 2) {
832 0 : haz->SimpleCode = HazTable2 (haz);
833 0 : } else if (simpleVer == 3) {
834 0 : haz->SimpleCode = HazTable3 (haz);
835 0 : } else if (simpleVer == 4) { /* MPA 1/2017 */
836 0 : haz->SimpleCode = HazTable4 (haz); /* MPA 1/2017 */
837 : } /* MPA 1/2017 */
838 0 : return;
839 : }
840 0 : start = data;
841 0 : f_continue = 1;
842 : do {
843 0 : if (word == 5) {
844 : #ifdef VERBOSE
845 : fprintf (stderr, "More than 5 hazards in '%s', ignoring the rest\n", data);
846 : #endif
847 0 : f_continue = 0;
848 0 : continue;
849 : }
850 0 : if ((end = strchr (start, '^')) != NULL) {
851 0 : *end = '\0';
852 : } else {
853 0 : f_continue = 0;
854 : }
855 :
856 0 : if ((ptr = strchr (start, '.')) == NULL) {
857 : #ifdef VERBOSE
858 : fprintf (stderr, "Problems parsing '%s' (Treating as <None>)\n", start);
859 : #endif
860 0 : if (f_continue) {
861 0 : *end = '^';
862 0 : start = end + 1;
863 : }
864 0 : continue;
865 : }
866 0 : *ptr = '\0';
867 0 : f_found = 0;
868 0 : for (i = 0; i < (int)(sizeof (HazCode) / sizeof (HazTable)); i++) {
869 0 : if (strcmp (start, HazCode[i].abrev) == 0) {
870 0 : f_found = 1;
871 0 : haz->haz[word] = HazCode[i].number;
872 0 : break;
873 : }
874 : }
875 0 : *ptr = '.';
876 0 : if (! f_found) {
877 : #ifdef VERBOSE
878 : fprintf (stderr, "Couldn't find the hazard type '%s' (Treating as <None>)\n", start);
879 : #endif
880 0 : if (f_continue) {
881 0 : *end = '^';
882 0 : start = end + 1;
883 : }
884 0 : continue;
885 : }
886 0 : switch (ptr[1]) {
887 0 : case 'A':
888 0 : haz->sig[word] = SIG_A;
889 0 : break;
890 0 : case 'S':
891 0 : haz->sig[word] = SIG_S;
892 0 : break;
893 0 : case 'Y':
894 0 : haz->sig[word] = SIG_Y;
895 0 : break;
896 0 : case 'W':
897 0 : haz->sig[word] = SIG_W;
898 0 : break;
899 0 : default:
900 : #ifdef VERBOSE
901 : fprintf (stderr, "Couldn't find the 'significance' '%s' (Treating as <None>)\n", start);
902 : #endif
903 0 : if (f_continue) {
904 0 : *end = '^';
905 0 : start = end + 1;
906 : }
907 0 : continue;
908 : }
909 :
910 0 : word++;
911 0 : if (f_continue) {
912 0 : *end = '^';
913 0 : start = end + 1;
914 : }
915 0 : } while (f_continue);
916 :
917 0 : if (word == 0) {
918 0 : haz->numValid = 1;
919 0 : haz->haz[0] = HAZ_NONE;
920 0 : haz->sig[0] = SIG_NONE;
921 0 : haz->english[0] = (char *) malloc ((strlen (data) + 1) *
922 : sizeof (char));
923 0 : strcpy (haz->english[0], data);
924 0 : if (simpleVer == 1) {
925 0 : haz->SimpleCode = HazTable1 (haz);
926 0 : } else if (simpleVer == 2) {
927 0 : haz->SimpleCode = HazTable2 (haz);
928 0 : } else if (simpleVer == 3) {
929 0 : haz->SimpleCode = HazTable3 (haz);
930 0 : } else if (simpleVer == 4) { /* MPA 1/2017 */
931 0 : haz->SimpleCode = HazTable4 (haz); /* MPA 1/2017 */
932 : } /* MPA 1/2017 */
933 0 : return;
934 : }
935 :
936 0 : haz->numValid = word;
937 0 : Hazard2English (haz);
938 0 : if (simpleVer == 1) {
939 0 : haz->SimpleCode = HazTable1 (haz);
940 0 : } else if (simpleVer == 2) {
941 0 : haz->SimpleCode = HazTable2 (haz);
942 0 : } else if (simpleVer == 3) {
943 0 : haz->SimpleCode = HazTable3 (haz);
944 0 : } else if (simpleVer == 4) { /* MPA 1/2017 */
945 0 : haz->SimpleCode = HazTable4 (haz); /* MPA 1/2017 */
946 : } /* MPA 1/2017 */
947 : /*
948 : printf ("%s\n", data);
949 : PrintHazardString (haz);
950 : */
951 0 : return;
952 : }
953 :
954 0 : void PrintHazardString (HazardStringType * haz)
955 : {
956 : int i; /* Used to traverse the ugly string structure. */
957 :
958 0 : printf ("numValid %d\n", haz->numValid);
959 0 : for (i = 0; i < haz->numValid; i++) {
960 0 : printf ("Haz=%d, Sig=%d ::", haz->haz[i], haz->sig[i]);
961 0 : printf ("HazName=%s ::", HazCode[haz->haz[i]].name);
962 0 : printf ("SimpleHazCode=%d ::", haz->SimpleCode);
963 0 : printf ("English=%s\n", haz->english[i]);
964 : }
965 0 : printf ("\n");
966 0 : }
967 :
968 : #ifdef DEBUG_HAZARD
969 : int main (int argc, char **argv)
970 : {
971 : HazardStringType haz;
972 : char buffer[100];
973 : ParseHazardString (&haz, "<None>", 1);
974 : PrintHazardString (&haz);
975 : FreeHazardString (&haz);
976 : printf ("----\n");
977 : strcpy (buffer, "FW.W:2^RecHiPos");
978 : ParseHazardString (&haz, buffer, 1);
979 : PrintHazardString (&haz);
980 : FreeHazardString (&haz);
981 : }
982 : #endif
|