107 lines
2.3 KiB
C++
107 lines
2.3 KiB
C++
#include "guess_extension.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include "is_stl.h"
|
|
#include "ply.h"
|
|
|
|
IGL_INLINE void igl::guess_extension(FILE * fp, std::string & guess)
|
|
{
|
|
const auto is_off = [](FILE * fp)-> bool
|
|
{
|
|
char header[1000];
|
|
const std::string OFF("OFF");
|
|
const std::string NOFF("NOFF");
|
|
const std::string COFF("COFF");
|
|
bool f = (fscanf(fp,"%s\n",header)==1 && (
|
|
std::string(header).compare(0, OFF.length(), OFF)==0 ||
|
|
std::string(header).compare(0, COFF.length(), COFF)==0 ||
|
|
std::string(header).compare(0,NOFF.length(),NOFF)==0));
|
|
rewind(fp);
|
|
return f;
|
|
};
|
|
const auto is_ply = [](FILE * ply_file) -> bool
|
|
{
|
|
int nelems;
|
|
char ** elem_names;
|
|
igl::ply::PlyFile * in_ply = igl::ply::ply_read(ply_file,&nelems,&elem_names);
|
|
if(in_ply==NULL)
|
|
{
|
|
return false;
|
|
}
|
|
free(in_ply);
|
|
rewind(ply_file);
|
|
return true;
|
|
};
|
|
const auto is_wrl = [](FILE * wrl_file)->bool
|
|
{
|
|
bool still_comments = true;
|
|
char line[1000];
|
|
std::string needle("point [");
|
|
std::string haystack;
|
|
while(still_comments)
|
|
{
|
|
if(fgets(line,1000,wrl_file) == NULL)
|
|
{
|
|
rewind(wrl_file);
|
|
return false;
|
|
}
|
|
haystack = std::string(line);
|
|
still_comments = std::string::npos == haystack.find(needle);
|
|
}
|
|
rewind(wrl_file);
|
|
return true;
|
|
};
|
|
const auto is_mesh = [](FILE * mesh_file )->bool
|
|
{
|
|
char line[2048];
|
|
// eat comments at beginning of file
|
|
bool still_comments= true;
|
|
while(still_comments)
|
|
{
|
|
if(fgets(line,2048,mesh_file) == NULL)
|
|
{
|
|
rewind(mesh_file);
|
|
return false;
|
|
}
|
|
still_comments = (line[0] == '#' || line[0] == '\n');
|
|
}
|
|
char str[2048];
|
|
sscanf(line," %s",str);
|
|
// check that first word is MeshVersionFormatted
|
|
if(0!=strcmp(str,"MeshVersionFormatted"))
|
|
{
|
|
rewind(mesh_file);
|
|
return false;
|
|
}
|
|
rewind(mesh_file);
|
|
return true;
|
|
};
|
|
guess = "obj";
|
|
if(is_mesh(fp))
|
|
{
|
|
guess = "mesh";
|
|
}else if(is_off(fp))
|
|
{
|
|
guess = "off";
|
|
}else if(is_ply(fp))
|
|
{
|
|
guess = "ply";
|
|
}else if(igl::is_stl(fp))
|
|
{
|
|
guess = "stl";
|
|
}else if(is_wrl(fp))
|
|
{
|
|
guess = "wrl";
|
|
}
|
|
// else obj
|
|
rewind(fp);
|
|
}
|
|
|
|
IGL_INLINE std::string igl::guess_extension(FILE * fp)
|
|
{
|
|
std::string guess;
|
|
guess_extension(fp,guess);
|
|
return guess;
|
|
}
|