ソースを参照

Reimplement isalnum(c,C locale) because I can't make AppVeyor see satndard version.

Stepan Hrbek 9 年 前
コミット
24f03141d6
2 ファイル変更10 行追加9 行削除
  1. 10 6
      code/ColladaExporter.cpp
  2. 0 3
      code/ColladaExporter.h

+ 10 - 6
code/ColladaExporter.cpp

@@ -93,8 +93,7 @@ void ExportSceneCollada(const char* pFile, IOSystem* pIOSystem, const aiScene* p
 ColladaExporter::ColladaExporter( const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file) : mIOSystem(pIOSystem), mPath(path), mFile(file)
 {
     // make sure that all formatting happens using the standard, C locale and not the user's current locale
-    clocale = std::locale("C");
-    mOutput.imbue( clocale );
+    mOutput.imbue( std::locale("C") );
 
     mScene = pScene;
     mSceneOwned = false;
@@ -527,6 +526,13 @@ void ColladaExporter::ReadMaterialSurface( Surface& poSurface, const aiMaterial*
   }
 }
 
+// ------------------------------------------------------------------------------------------------
+// Reimplementation of isalnum(,C locale), because AppVeyor does not see standard version.
+static bool isalnum_C(char c)
+{
+  return strchr("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",c);
+}
+
 // ------------------------------------------------------------------------------------------------
 // Writes an image entry for the given surface
 void ColladaExporter::WriteImageEntry( const Surface& pSurface, const std::string& pNameAdd)
@@ -541,7 +547,7 @@ void ColladaExporter::WriteImageEntry( const Surface& pSurface, const std::strin
     std::stringstream imageUrlEncoded;
     for( std::string::const_iterator it = pSurface.texture.begin(); it != pSurface.texture.end(); ++it )
     {
-      if( isalnum( (unsigned char) *it, clocale) || *it == '_' || *it == '.' || *it == '/' || *it == '\\' )
+      if( isalnum_C( (unsigned char) *it) || *it == '_' || *it == '.' || *it == '/' || *it == '\\' )
         imageUrlEncoded << *it;
       else
         imageUrlEncoded << '%' << std::hex << size_t( (unsigned char) *it) << std::dec;
@@ -632,9 +638,7 @@ void ColladaExporter::WriteMaterials()
       name = "mat";
     materials[a].name = std::string( "m") + boost::lexical_cast<std::string> (a) + name.C_Str();
     for( std::string::iterator it = materials[a].name.begin(); it != materials[a].name.end(); ++it ) {
-        // isalnum on MSVC asserts for code points outside [0,255]. Thus prevent unwanted promotion
-        // of char to signed int and take the unsigned char value.
-      if( !isalnum( static_cast<uint8_t>(*it), clocale ) ) {
+      if( !isalnum_C( *it ) ) {
         *it = '_';
       }
     }

+ 0 - 3
code/ColladaExporter.h

@@ -130,9 +130,6 @@ public:
     std::stringstream mOutput;
 
 protected:
-    /// C locale
-    std::locale clocale;
-
     /// The IOSystem for output
     IOSystem* mIOSystem;