Author: jtn Date: Tue Oct 4 11:12:00 2016 New Revision: 33986 URL: http://svn.gna.org/viewcvs/freeciv?rev=33986&view=rev Log: Give more useful diagnostic for invalid requirement type/value in ruleset.
See bug #25137. Modified: branches/S2_5/common/requirements.c Modified: branches/S2_5/common/requirements.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/common/requirements.c?rev=33986&r1=33985&r2=33986&view=diff ============================================================================== --- branches/S2_5/common/requirements.c (original) +++ branches/S2_5/common/requirements.c Tue Oct 4 11:12:00 2016 @@ -423,122 +423,128 @@ const char *value) { struct requirement req; - bool invalid = TRUE; + bool invalid; const char *error = NULL; req.source = universal_by_rule_name(type, value); - /* Scan the range string to find the range. If no range is given a - * default fallback is used rather than giving an error. */ - req.range = req_range_by_name(range, fc_strcasecmp); - if (!req_range_is_valid(req.range)) { + invalid = !universals_n_is_valid(req.source.kind); + if (invalid) { + error = "bad type or name"; + } else { + /* Scan the range string to find the range. If no range is given a + * default fallback is used rather than giving an error. */ + req.range = req_range_by_name(range, fc_strcasecmp); + if (!req_range_is_valid(req.range)) { + switch (req.source.kind) { + case VUT_NONE: + case VUT_COUNT: + break; + case VUT_IMPROVEMENT: + case VUT_SPECIAL: + case VUT_TERRAIN: + case VUT_TERRFLAG: + case VUT_RESOURCE: + case VUT_UTYPE: + case VUT_UTFLAG: + case VUT_UCLASS: + case VUT_UCFLAG: + case VUT_OTYPE: + case VUT_SPECIALIST: + case VUT_TERRAINCLASS: + case VUT_BASE: + case VUT_ROAD: + case VUT_TERRAINALTER: + case VUT_CITYTILE: + req.range = REQ_RANGE_LOCAL; + break; + case VUT_MINSIZE: + case VUT_NATIONALITY: + req.range = REQ_RANGE_CITY; + break; + case VUT_GOVERNMENT: + case VUT_ADVANCE: + case VUT_TECHFLAG: + case VUT_NATION: + case VUT_AI_LEVEL: + req.range = REQ_RANGE_PLAYER; + break; + case VUT_MINYEAR: + req.range = REQ_RANGE_WORLD; + break; + } + } + + req.survives = survives; + req.negated = negated; + + /* These checks match what combinations are supported inside + * is_req_active(). However, it's only possible to do basic checks, + * not anything that might depend on the rest of the ruleset which + * might not have been lodaed yet. */ switch (req.source.kind) { - case VUT_NONE: - case VUT_COUNT: + case VUT_TERRAIN: + case VUT_SPECIAL: + case VUT_RESOURCE: + case VUT_TERRAINCLASS: + case VUT_TERRFLAG: + case VUT_BASE: + case VUT_ROAD: + invalid = (req.range != REQ_RANGE_LOCAL + && req.range != REQ_RANGE_CADJACENT + && req.range != REQ_RANGE_ADJACENT + && req.range != REQ_RANGE_CITY); break; - case VUT_IMPROVEMENT: - case VUT_SPECIAL: - case VUT_TERRAIN: - case VUT_TERRFLAG: - case VUT_RESOURCE: + case VUT_ADVANCE: + case VUT_TECHFLAG: + invalid = (req.range < REQ_RANGE_PLAYER); + break; + case VUT_GOVERNMENT: + case VUT_AI_LEVEL: + invalid = (req.range != REQ_RANGE_PLAYER); + break; + case VUT_MINSIZE: + case VUT_NATIONALITY: + invalid = (req.range != REQ_RANGE_CITY); + break; + case VUT_NATION: + invalid = (req.range != REQ_RANGE_PLAYER + && req.range != REQ_RANGE_WORLD); + break; case VUT_UTYPE: case VUT_UTFLAG: case VUT_UCLASS: case VUT_UCFLAG: case VUT_OTYPE: case VUT_SPECIALIST: - case VUT_TERRAINCLASS: - case VUT_BASE: - case VUT_ROAD: - case VUT_TERRAINALTER: + case VUT_TERRAINALTER: /* XXX could in principle support C/ADJACENT */ + invalid = (req.range != REQ_RANGE_LOCAL); + break; case VUT_CITYTILE: - req.range = REQ_RANGE_LOCAL; - break; - case VUT_MINSIZE: - case VUT_NATIONALITY: - req.range = REQ_RANGE_CITY; - break; - case VUT_GOVERNMENT: - case VUT_ADVANCE: - case VUT_TECHFLAG: - case VUT_NATION: - case VUT_AI_LEVEL: - req.range = REQ_RANGE_PLAYER; + invalid = (req.range != REQ_RANGE_LOCAL + && req.range != REQ_RANGE_CADJACENT + && req.range != REQ_RANGE_ADJACENT); break; case VUT_MINYEAR: - req.range = REQ_RANGE_WORLD; + invalid = (req.range != REQ_RANGE_WORLD); break; - } - } - - req.survives = survives; - req.negated = negated; - - /* These checks match what combinations are supported inside - * is_req_active(). However, it's only possible to do basic checks, - * not anything that might depend on the rest of the ruleset which - * might not have been lodaed yet. */ - switch (req.source.kind) { - case VUT_TERRAIN: - case VUT_SPECIAL: - case VUT_RESOURCE: - case VUT_TERRAINCLASS: - case VUT_TERRFLAG: - case VUT_BASE: - case VUT_ROAD: - invalid = (req.range != REQ_RANGE_LOCAL - && req.range != REQ_RANGE_CADJACENT - && req.range != REQ_RANGE_ADJACENT - && req.range != REQ_RANGE_CITY); - break; - case VUT_ADVANCE: - case VUT_TECHFLAG: - invalid = (req.range < REQ_RANGE_PLAYER); - break; - case VUT_GOVERNMENT: - case VUT_AI_LEVEL: - invalid = (req.range != REQ_RANGE_PLAYER); - break; - case VUT_MINSIZE: - case VUT_NATIONALITY: - invalid = (req.range != REQ_RANGE_CITY); - break; - case VUT_NATION: - invalid = (req.range != REQ_RANGE_PLAYER - && req.range != REQ_RANGE_WORLD); - break; - case VUT_UTYPE: - case VUT_UTFLAG: - case VUT_UCLASS: - case VUT_UCFLAG: - case VUT_OTYPE: - case VUT_SPECIALIST: - case VUT_TERRAINALTER: /* XXX could in principle support C/ADJACENT */ - invalid = (req.range != REQ_RANGE_LOCAL); - break; - case VUT_CITYTILE: - invalid = (req.range != REQ_RANGE_LOCAL - && req.range != REQ_RANGE_CADJACENT - && req.range != REQ_RANGE_ADJACENT); - break; - case VUT_MINYEAR: - invalid = (req.range != REQ_RANGE_WORLD); - break; - case VUT_IMPROVEMENT: - /* Valid ranges depend on the building genus (wonder/improvement), - * which might not have been loaded from the ruleset yet. - * So we allow anything here, and do a proper check once ruleset - * loading is complete, in sanity_check_req_individual(). */ - case VUT_NONE: - invalid = FALSE; - break; - case VUT_COUNT: - break; - } - - if (invalid) { - error = "bad range"; - } else { + case VUT_IMPROVEMENT: + /* Valid ranges depend on the building genus (wonder/improvement), + * which might not have been loaded from the ruleset yet. + * So we allow anything here, and do a proper check once ruleset + * loading is complete, in sanity_check_req_individual(). */ + case VUT_NONE: + invalid = FALSE; + break; + case VUT_COUNT: + break; + } + if (invalid) { + error = "bad range"; + } + } + + if (!invalid) { /* Check 'survives'. */ switch (req.source.kind) { case VUT_IMPROVEMENT: _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits