Author: cazfi
Date: Wed Aug 10 12:32:33 2016
New Revision: 33539

URL: http://svn.gna.org/viewcvs/freeciv?rev=33539&view=rev
Log:
Factored out universal_value_from_str() from universal_by_rule_name().

See patch #7571

Modified:
    trunk/common/requirements.c
    trunk/common/requirements.h

Modified: trunk/common/requirements.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/requirements.c?rev=33539&r1=33538&r2=33539&view=diff
==============================================================================
--- trunk/common/requirements.c (original)
+++ trunk/common/requirements.c Wed Aug 10 12:32:33 2016
@@ -56,7 +56,7 @@
   FIXME: ensure that every caller checks error return!
 **************************************************************************/
 struct universal universal_by_rule_name(const char *kind,
-                                       const char *value)
+                                        const char *value)
 {
   struct universal source;
 
@@ -65,248 +65,259 @@
     return source;
   }
 
+  universal_value_from_str(&source, value);
+
+  return source;
+}
+
+/**************************************************************************
+  Parse requirement value strings into a universal
+  structure.
+**************************************************************************/
+void universal_value_from_str(struct universal *source, const char *value)
+{
   /* Finally scan the value string based on the type of the source. */
-  switch (source.kind) {
+  switch (source->kind) {
   case VUT_NONE:
-    return source;
+    return;
   case VUT_ADVANCE:
-    source.value.advance = advance_by_rule_name(value);
-    if (source.value.advance != NULL) {
-      return source;
+    source->value.advance = advance_by_rule_name(value);
+    if (source->value.advance != NULL) {
+      return;
     }
     break;
   case VUT_TECHFLAG:
-    source.value.techflag
+    source->value.techflag
       = tech_flag_id_by_name(value, fc_strcasecmp);
-    if (tech_flag_id_is_valid(source.value.techflag)) {
-      return source;
+    if (tech_flag_id_is_valid(source->value.techflag)) {
+      return;
     }
     break;
   case VUT_GOVERNMENT:
-    source.value.govern = government_by_rule_name(value);
-    if (source.value.govern != NULL) {
-      return source;
+    source->value.govern = government_by_rule_name(value);
+    if (source->value.govern != NULL) {
+      return;
     }
     break;
   case VUT_ACHIEVEMENT:
-    source.value.achievement = achievement_by_rule_name(value);
-    if (source.value.achievement != NULL) {
-      return source;
+    source->value.achievement = achievement_by_rule_name(value);
+    if (source->value.achievement != NULL) {
+      return;
     }
     break;
   case VUT_STYLE:
-    source.value.style = style_by_rule_name(value);
-    if (source.value.style != NULL) {
-      return source;
+    source->value.style = style_by_rule_name(value);
+    if (source->value.style != NULL) {
+      return;
     }
     break;
   case VUT_IMPROVEMENT:
-    source.value.building = improvement_by_rule_name(value);
-    if (source.value.building != NULL) {
-      return source;
+    source->value.building = improvement_by_rule_name(value);
+    if (source->value.building != NULL) {
+      return;
     }
     break;
   case VUT_IMPR_GENUS:
-    source.value.impr_genus = impr_genus_id_by_name(value, fc_strcasecmp);
-    if (impr_genus_id_is_valid(source.value.impr_genus)) {
-      return source;
+    source->value.impr_genus = impr_genus_id_by_name(value, fc_strcasecmp);
+    if (impr_genus_id_is_valid(source->value.impr_genus)) {
+      return;
     }
     break;
   case VUT_EXTRA:
-    source.value.extra = extra_type_by_rule_name(value);
-    if (source.value.extra != NULL) {
-      return source;
+    source->value.extra = extra_type_by_rule_name(value);
+    if (source->value.extra != NULL) {
+      return;
     }
     break;
   case VUT_GOOD:
-    source.value.good = goods_by_rule_name(value);
-    if (source.value.good != NULL) {
-      return source;
+    source->value.good = goods_by_rule_name(value);
+    if (source->value.good != NULL) {
+      return;
     }
     break;
   case VUT_TERRAIN:
-    source.value.terrain = terrain_by_rule_name(value);
-    if (source.value.terrain != T_UNKNOWN) {
-      return source;
+    source->value.terrain = terrain_by_rule_name(value);
+    if (source->value.terrain != T_UNKNOWN) {
+      return;
     }
     break;
   case VUT_TERRFLAG:
-    source.value.terrainflag
+    source->value.terrainflag
       = terrain_flag_id_by_name(value, fc_strcasecmp);
-    if (terrain_flag_id_is_valid(source.value.terrainflag)) {
-      return source;
+    if (terrain_flag_id_is_valid(source->value.terrainflag)) {
+      return;
     }
     break;
   case VUT_NATION:
-    source.value.nation = nation_by_rule_name(value);
-    if (source.value.nation != NO_NATION_SELECTED) {
-      return source;
+    source->value.nation = nation_by_rule_name(value);
+    if (source->value.nation != NO_NATION_SELECTED) {
+      return;
     }
     break;
   case VUT_NATIONGROUP:
-    source.value.nationgroup = nation_group_by_rule_name(value);
-    if (source.value.nationgroup != NULL) {
-      return source;
+    source->value.nationgroup = nation_group_by_rule_name(value);
+    if (source->value.nationgroup != NULL) {
+      return;
     }
     break;
   case VUT_NATIONALITY:
-    source.value.nationality = nation_by_rule_name(value);
-    if (source.value.nationality != NO_NATION_SELECTED) {
-      return source;
+    source->value.nationality = nation_by_rule_name(value);
+    if (source->value.nationality != NO_NATION_SELECTED) {
+      return;
     }
     break;
   case VUT_DIPLREL:
-    source.value.diplrel = diplrel_by_rule_name(value);
-    if (source.value.diplrel != diplrel_other_invalid()) {
-      return source;
+    source->value.diplrel = diplrel_by_rule_name(value);
+    if (source->value.diplrel != diplrel_other_invalid()) {
+      return;
     }
     break;
   case VUT_UTYPE:
-    source.value.utype = unit_type_by_rule_name(value);
-    if (source.value.utype) {
-      return source;
+    source->value.utype = unit_type_by_rule_name(value);
+    if (source->value.utype) {
+      return;
     }
     break;
   case VUT_UTFLAG:
-    source.value.unitflag = unit_type_flag_id_by_name(value, fc_strcasecmp);
-    if (unit_type_flag_id_is_valid(source.value.unitflag)) {
-      return source;
+    source->value.unitflag = unit_type_flag_id_by_name(value, fc_strcasecmp);
+    if (unit_type_flag_id_is_valid(source->value.unitflag)) {
+      return;
     }
     break;
   case VUT_UCLASS:
-    source.value.uclass = unit_class_by_rule_name(value);
-    if (source.value.uclass) {
-      return source;
+    source->value.uclass = unit_class_by_rule_name(value);
+    if (source->value.uclass) {
+      return;
     }
     break;
   case VUT_UCFLAG:
-    source.value.unitclassflag
+    source->value.unitclassflag
       = unit_class_flag_id_by_name(value, fc_strcasecmp);
-    if (unit_class_flag_id_is_valid(source.value.unitclassflag)) {
-      return source;
+    if (unit_class_flag_id_is_valid(source->value.unitclassflag)) {
+      return;
     }
     break;
   case VUT_MINVETERAN:
-    source.value.minveteran = atoi(value);
-    if (source.value.minveteran > 0) {
-      return source;
+    source->value.minveteran = atoi(value);
+    if (source->value.minveteran > 0) {
+      return;
     }
     break;
   case VUT_UNITSTATE:
-    source.value.unit_state = ustate_prop_by_name(value, fc_strcasecmp);
-    if (ustate_prop_is_valid(source.value.unit_state)) {
-      return source;
+    source->value.unit_state = ustate_prop_by_name(value, fc_strcasecmp);
+    if (ustate_prop_is_valid(source->value.unit_state)) {
+      return;
     }
     break;
   case VUT_MINMOVES:
-    source.value.minmoves = atoi(value);
-    if (source.value.minmoves > 0) {
-      return source;
+    source->value.minmoves = atoi(value);
+    if (source->value.minmoves > 0) {
+      return;
     }
     break;
   case VUT_MINHP:
-    source.value.min_hit_points = atoi(value);
-    if (source.value.min_hit_points > 0) {
-      return source;
+    source->value.min_hit_points = atoi(value);
+    if (source->value.min_hit_points > 0) {
+      return;
     }
     break;
   case VUT_AGE:
-    source.value.age = atoi(value);
-    if (source.value.age > 0) {
-      return source;
+    source->value.age = atoi(value);
+    if (source->value.age > 0) {
+      return;
     }
     break;
   case VUT_MINTECHS:
-    source.value.min_techs = atoi(value);
-    if (source.value.min_techs > 0) {
-      return source;
+    source->value.min_techs = atoi(value);
+    if (source->value.min_techs > 0) {
+      return;
     }
   case VUT_ACTION:
-    source.value.action = action_by_rule_name(value);
-    if (source.value.action != NULL) {
-      return source;
+    source->value.action = action_by_rule_name(value);
+    if (source->value.action != NULL) {
+      return;
     }
     break;
   case VUT_OTYPE:
-    source.value.outputtype = output_type_by_identifier(value);
-    if (source.value.outputtype != O_LAST) {
-      return source;
+    source->value.outputtype = output_type_by_identifier(value);
+    if (source->value.outputtype != O_LAST) {
+      return;
     }
     break;
   case VUT_SPECIALIST:
-    source.value.specialist = specialist_by_rule_name(value);
-    if (source.value.specialist) {
-      return source;
+    source->value.specialist = specialist_by_rule_name(value);
+    if (source->value.specialist) {
+      return;
     }
   case VUT_MINSIZE:
-    source.value.minsize = atoi(value);
-    if (source.value.minsize > 0) {
-      return source;
+    source->value.minsize = atoi(value);
+    if (source->value.minsize > 0) {
+      return;
     }
     break;
   case VUT_MINCULTURE:
-    source.value.minculture = atoi(value);
-    if (source.value.minculture > 0) {
-      return source;
+    source->value.minculture = atoi(value);
+    if (source->value.minculture > 0) {
+      return;
     }
     break;
   case VUT_AI_LEVEL:
-    source.value.ai_level = ai_level_by_name(value, fc_strcasecmp);
-    if (ai_level_is_valid(source.value.ai_level)) {
-      return source;
+    source->value.ai_level = ai_level_by_name(value, fc_strcasecmp);
+    if (ai_level_is_valid(source->value.ai_level)) {
+      return;
     }
     break;
   case VUT_MAXTILEUNITS:
-    source.value.max_tile_units = atoi(value);
-    if (0 <= source.value.max_tile_units) {
-      return source;
+    source->value.max_tile_units = atoi(value);
+    if (0 <= source->value.max_tile_units) {
+      return;
     }
     break;
   case VUT_TERRAINCLASS:
-    source.value.terrainclass
+    source->value.terrainclass
       = terrain_class_by_name(value, fc_strcasecmp);
-    if (terrain_class_is_valid(source.value.terrainclass)) {
-      return source;
+    if (terrain_class_is_valid(source->value.terrainclass)) {
+      return;
     }
     break;
   case VUT_BASEFLAG:
-    source.value.baseflag = base_flag_id_by_name(value, fc_strcasecmp);
-    if (base_flag_id_is_valid(source.value.baseflag)) {
-      return source;
+    source->value.baseflag = base_flag_id_by_name(value, fc_strcasecmp);
+    if (base_flag_id_is_valid(source->value.baseflag)) {
+      return;
     }
     break;
   case VUT_ROADFLAG:
-    source.value.roadflag = road_flag_id_by_name(value, fc_strcasecmp);
-    if (road_flag_id_is_valid(source.value.roadflag)) {
-      return source;
+    source->value.roadflag = road_flag_id_by_name(value, fc_strcasecmp);
+    if (road_flag_id_is_valid(source->value.roadflag)) {
+      return;
     }
     break;
   case VUT_EXTRAFLAG:
-    source.value.extraflag = extra_flag_id_by_name(value, fc_strcasecmp);
-    if (extra_flag_id_is_valid(source.value.extraflag)) {
-      return source;
+    source->value.extraflag = extra_flag_id_by_name(value, fc_strcasecmp);
+    if (extra_flag_id_is_valid(source->value.extraflag)) {
+      return;
     }
     break;
   case VUT_MINYEAR:
-    source.value.minyear = atoi(value);
-    return source;
+    source->value.minyear = atoi(value);
+    return;
   case VUT_TOPO:
-    source.value.topo_property = topo_flag_by_name(value, fc_strcasecmp);
-    if (topo_flag_is_valid(source.value.topo_property)) {
-      return source;
+    source->value.topo_property = topo_flag_by_name(value, fc_strcasecmp);
+    if (topo_flag_is_valid(source->value.topo_property)) {
+      return;
     }
     break;
   case VUT_TERRAINALTER:
-    source.value.terrainalter
+    source->value.terrainalter
       = terrain_alteration_by_name(value, fc_strcasecmp);
-    if (terrain_alteration_is_valid(source.value.terrainalter)) {
-      return source;
+    if (terrain_alteration_is_valid(source->value.terrainalter)) {
+      return;
     }
     break;
   case VUT_CITYTILE:
-    source.value.citytile = citytile_type_by_name(value, fc_strcasecmp);
-    if (source.value.citytile != CITYT_LAST) {
-      return source;
+    source->value.citytile = citytile_type_by_name(value, fc_strcasecmp);
+    if (source->value.citytile != CITYT_LAST) {
+      return;
     }
     break;
   case VUT_COUNT:
@@ -314,8 +325,7 @@
   }
 
   /* If we reach here there's been an error. */
-  source.kind = universals_n_invalid();
-  return source;
+  source->kind = universals_n_invalid();
 }
 
 /**************************************************************************

Modified: trunk/common/requirements.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/common/requirements.h?rev=33539&r1=33538&r2=33539&view=diff
==============================================================================
--- trunk/common/requirements.h (original)
+++ trunk/common/requirements.h Wed Aug 10 12:32:33 2016
@@ -145,6 +145,7 @@
                                     const int value);
 struct universal universal_by_rule_name(const char *kind,
                                        const char *value);
+void universal_value_from_str(struct universal *source, const char *value);
 void universal_extraction(const struct universal *source,
                          int *kind, int *value);
 


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to