swr/rast: non-regex knob fallback code for gcc < 4.9
authorTim Rowley <timothy.o.rowley@intel.com>
Wed, 26 Jul 2017 20:17:49 +0000 (15:17 -0500)
committerTim Rowley <timothy.o.rowley@intel.com>
Thu, 27 Jul 2017 13:31:21 +0000 (08:31 -0500)
gcc prior to 4.9 didn't implement <regex>, causing a startup crash
in the swr knob parameter reading code.

CC: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.cpp

index e109fd26597511d4a86cc39f626340c32d315031..06b93bd72bb0bbcea57735846d9c3685f40011b3 100644 (file)
@@ -140,6 +140,26 @@ extern GlobalKnobs g_GlobalKnobs;
 //========================================================
 void KnobBase::autoExpandEnvironmentVariables(std::string &text)
 {
+#if (__GNUC__) && (GCC_VERSION < 409000)
+    // <regex> isn't implemented prior to gcc-4.9.0
+    // unix style variable replacement
+    size_t start;
+    while ((start = text.find("${'${'}")) != std::string::npos) {
+        size_t end = text.find("}");
+        if (end == std::string::npos)
+            break;
+        const std::string var = GetEnv(text.substr(start + 2, end - start - 2));
+        text.replace(start, end - start + 1, var);
+    }
+    // win32 style variable replacement
+    while ((start = text.find("%")) != std::string::npos) {
+        size_t end = text.find("%", start + 1);
+        if (end == std::string::npos)
+            break;
+        const std::string var = GetEnv(text.substr(start + 1, end - start - 1));
+        text.replace(start, end - start + 1, var);
+    }
+#else
     {
         // unix style variable replacement
         static std::regex env("\\$\\{([^}]+)\\}");
@@ -164,6 +184,7 @@ void KnobBase::autoExpandEnvironmentVariables(std::string &text)
             text.replace(match.prefix().length(), match[0].length(), var);
         }
     }
+#endif
 }