Author: cazfi
Date: Tue Jan 13 23:58:58 2015
New Revision: 27668

URL: http://svn.gna.org/viewcvs/freeciv?rev=27668&view=rev
Log:
Support alternative ruleset capstr in compatibility mode ruleset loading.

See patch #5692

Modified:
    trunk/server/rscompat.c
    trunk/server/rscompat.h
    trunk/server/ruleset.c

Modified: trunk/server/rscompat.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/rscompat.c?rev=27668&r1=27667&r2=27668&view=diff
==============================================================================
--- trunk/server/rscompat.c     (original)
+++ trunk/server/rscompat.c     Tue Jan 13 23:58:58 2015
@@ -43,9 +43,11 @@
   This checks the string and that the required capabilities are satisified.
 **************************************************************************/
 int rscompat_check_capabilities(struct section_file *file,
-                                const char *filename)
+                                const char *filename,
+                                struct rscompat_info *info)
 {
   const char *datafile_options;
+  bool ok = FALSE;
 
   if (!(datafile_options = secfile_lookup_str(file, "datafile.options"))) {
     log_fatal("\"%s\": ruleset capability problem:", filename);
@@ -53,22 +55,36 @@
 
     return 0;
   }
-  if (!has_capabilities(RULESET_CAPABILITIES, datafile_options)) {
-    log_fatal("\"%s\": ruleset datafile appears incompatible:", filename);
-    log_fatal("  datafile options: %s", datafile_options);
-    log_fatal("  supported options: %s", RULESET_CAPABILITIES);
-    ruleset_error(LOG_ERROR, "Capability problem");
 
-    return 0;
+  if (info->compat_mode) {
+    /* Check alternative capstr first, so that when we do the main capstr 
check,
+     * we already know that failures there are fatal (error message correct, 
can return
+     * immediately) */
+
+    if (has_capabilities(RULESET_COMPAT_CAP, datafile_options)
+        && has_capabilities(datafile_options, RULESET_COMPAT_CAP)) {
+      ok = TRUE;
+    }
   }
-  if (!has_capabilities(datafile_options, RULESET_CAPABILITIES)) {
-    log_fatal("\"%s\": ruleset datafile claims required option(s)"
-              " that we don't support:", filename);
-    log_fatal("  datafile options: %s", datafile_options);
-    log_fatal("  supported options: %s", RULESET_CAPABILITIES);
-    ruleset_error(LOG_ERROR, "Capability problem");
 
-    return 0;
+  if (!ok) {
+    if (!has_capabilities(RULESET_CAPABILITIES, datafile_options)) {
+      log_fatal("\"%s\": ruleset datafile appears incompatible:", filename);
+      log_fatal("  datafile options: %s", datafile_options);
+      log_fatal("  supported options: %s", RULESET_CAPABILITIES);
+      ruleset_error(LOG_ERROR, "Capability problem");
+
+      return 0;
+    }
+    if (!has_capabilities(datafile_options, RULESET_CAPABILITIES)) {
+      log_fatal("\"%s\": ruleset datafile claims required option(s)"
+                " that we don't support:", filename);
+      log_fatal("  datafile options: %s", datafile_options);
+      log_fatal("  supported options: %s", RULESET_CAPABILITIES);
+      ruleset_error(LOG_ERROR, "Capability problem");
+
+      return 0;
+    }
   }
 
   return secfile_lookup_int_default(file, 1, "datafile.format_version");

Modified: trunk/server/rscompat.h
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/rscompat.h?rev=27668&r1=27667&r2=27668&view=diff
==============================================================================
--- trunk/server/rscompat.h     (original)
+++ trunk/server/rscompat.h     Tue Jan 13 23:58:58 2015
@@ -20,6 +20,8 @@
 /* utility */
 #include "support.h"
 
+#define RULESET_COMPAT_CAP "+Freeciv-ruleset-Devel-2014.September.14c"
+
 struct rscompat_info
 {
   bool compat_mode;
@@ -37,7 +39,8 @@
 
 void rscompat_init_info(struct rscompat_info *info);
 
-int rscompat_check_capabilities(struct section_file *file, const char 
*filename);
+int rscompat_check_capabilities(struct section_file *file, const char 
*filename,
+                                struct rscompat_info *info);
 
 void rscompat_postprocess(struct rscompat_info *info);
 

Modified: trunk/server/ruleset.c
URL: 
http://svn.gna.org/viewcvs/freeciv/trunk/server/ruleset.c?rev=27668&r1=27667&r2=27668&view=diff
==============================================================================
--- trunk/server/ruleset.c      (original)
+++ trunk/server/ruleset.c      Tue Jan 13 23:58:58 2015
@@ -1078,7 +1078,7 @@
   const char *filename = secfile_name(file);
   bool ok = TRUE;
 
-  compat->ver_techs = rscompat_check_capabilities(file, filename);
+  compat->ver_techs = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_techs <= 0) {
     return FALSE;
   }
@@ -1465,7 +1465,7 @@
   char msg[MAX_LEN_MSG];
   bool ok = TRUE;
 
-  compat->ver_units = rscompat_check_capabilities(file, filename);
+  compat->ver_units = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_units <= 0) {
     return FALSE;
   }
@@ -1992,7 +1992,7 @@
   const char *filename = secfile_name(file);
   bool ok = TRUE;
 
-  compat->ver_buildings = rscompat_check_capabilities(file, filename);
+  compat->ver_buildings = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_buildings <= 0) {
     return FALSE;
   }
@@ -2367,7 +2367,7 @@
   const char *filename = secfile_name(file);
   bool ok = TRUE;
 
-  compat->ver_terrain = rscompat_check_capabilities(file, filename);
+  compat->ver_terrain = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_terrain <= 0) {
     return FALSE;
   }
@@ -3230,7 +3230,7 @@
   const char *filename = secfile_name(file);
   bool ok = TRUE;
 
-  compat->ver_governments = rscompat_check_capabilities(file, filename);
+  compat->ver_governments = rscompat_check_capabilities(file, filename, 
compat);
   if (compat->ver_governments <= 0) {
     return FALSE;
   }
@@ -3711,7 +3711,7 @@
   size_t agcount, atcount, ascount;
   bool ok = TRUE;
 
-  compat->ver_nations = rscompat_check_capabilities(file, filename);
+  compat->ver_nations = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_nations <= 0) {
     return FALSE;
   }
@@ -4374,7 +4374,7 @@
   int i;
   bool ok = TRUE;
 
-  compat->ver_styles = rscompat_check_capabilities(file, filename);
+  compat->ver_styles = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_styles <= 0) {
     return FALSE;
   }
@@ -4459,7 +4459,7 @@
   struct section_list *sec;
   bool ok = TRUE;
 
-  compat->ver_cities = rscompat_check_capabilities(file, filename);
+  compat->ver_cities = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_cities <= 0) {
     return FALSE;
   }
@@ -4590,7 +4590,7 @@
 
   filename = secfile_name(file);
 
-  compat->ver_effects = rscompat_check_capabilities(file, filename);
+  compat->ver_effects = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_effects <= 0) {
     return FALSE;
   }
@@ -4740,7 +4740,7 @@
   filename = secfile_name(file);
 
   /* section: datafile */
-  compat->ver_game = rscompat_check_capabilities(file, filename);
+  compat->ver_game = rscompat_check_capabilities(file, filename, compat);
   if (compat->ver_game <= 0) {
     return FALSE;
   }


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

Reply via email to