Commit fc04bac1 authored by Martin Schultz's avatar Martin Schultz
Browse files

made the stl reader check for ascii file keyword instead of computing binary size

parent b792b0c6
Pipeline #2432 failed with stage
in 53 minutes and 32 seconds
...@@ -61,6 +61,13 @@ ...@@ -61,6 +61,13 @@
#include <OpenMesh/Core/IO/reader/STLReader.hh> #include <OpenMesh/Core/IO/reader/STLReader.hh>
#include <OpenMesh/Core/IO/IOManager.hh> #include <OpenMesh/Core/IO/IOManager.hh>
//comppare strings crossplatform ignorign case
#ifdef _WIN32
#define strnicmp _strnicmp
#else
#define strnicmp strncasecmp
#endif
//=== NAMESPACES ============================================================== //=== NAMESPACES ==============================================================
...@@ -447,41 +454,32 @@ _STLReader_::STL_Type ...@@ -447,41 +454,32 @@ _STLReader_::STL_Type
_STLReader_:: _STLReader_::
check_stl_type(const std::string& _filename) const check_stl_type(const std::string& _filename) const
{ {
// assume it's binary stl, then file size is known from #triangles
// if size matches, it's really binary
// open file // open file
FILE* in = fopen(_filename.c_str(), "rb"); std::ifstream ifs (_filename.c_str(), std::ifstream::binary);
if (!in) return NONE; if(!ifs.good())
{
omerr() << "could not open file" << _filename << std::endl;
// determine endian mode return NONE;
union { unsigned int i; unsigned char c[4]; } endian_test; }
endian_test.i = 1;
bool swapFlag = (endian_test.c[3] == 1);
// read number of triangles
char dummy[100];
fread(dummy, 1, 80, in);
size_t nT = read_int(in, swapFlag);
// compute file size from nT
size_t binary_size = 84 + nT*50;
// get actual file size //find first non whitespace character
size_t file_size(0); std::string line = "";
rewind(in); std::size_t firstChar;
while (!feof(in)) while(line.empty() && ifs.good())
file_size += fread(dummy, 1, 100, in); {
fclose(in); std::getline(ifs,line);
firstChar = line.find_first_not_of("\t ");
}
//check for ascii keyword solid
if(strnicmp("solid",&line[firstChar],5) == 0)
{
return STLA;
}
// if sizes match -> it's STLB //if the file does not start with solid it is STLB
return (binary_size == file_size ? STLB : STLA); return STLB;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment