LCOV - code coverage report
Current view: top level - frmts/grib/degrib/degrib - hazard.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 0 620 0.0 %
Date: 2024-04-27 14:28:19 Functions: 0 13 0.0 %

          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

Generated by: LCOV version 1.14