Changed VRML parsers to use LINE_READER

This commit is contained in:
Cirilo Bernardo 2016-01-12 10:12:50 +11:00
parent cbfd05e799
commit c952cb4902
4 changed files with 401 additions and 296 deletions

View File

@ -7,6 +7,7 @@ include_directories(
add_definitions( -DDEBUG_VRML1=2 -DDEBUG_VRML2=2 ) add_definitions( -DDEBUG_VRML1=2 -DDEBUG_VRML2=2 )
add_library( s3d_plugin_vrml MODULE add_library( s3d_plugin_vrml MODULE
${CMAKE_SOURCE_DIR}/common/richio.cpp
vrml.cpp vrml.cpp
wrlproc.cpp wrlproc.cpp
v2/vrml2_node.cpp v2/vrml2_node.cpp

View File

@ -38,6 +38,7 @@
#include <string> #include <string>
#include <wx/string.h> #include <wx/string.h>
#include <wx/filename.h> #include <wx/filename.h>
#include "richio.h"
#include "plugins/3d/3d_plugin.h" #include "plugins/3d/3d_plugin.h"
#include "plugins/3dapi/ifsg_all.h" #include "plugins/3dapi/ifsg_all.h"
#include "wrlproc.h" #include "wrlproc.h"
@ -179,11 +180,25 @@ SCENEGRAPH* Load( char const* aFileName )
LOCALESWITCH switcher; LOCALESWITCH switcher;
SCENEGRAPH* scene = NULL; SCENEGRAPH* scene = NULL;
// VRML file processor FILE_LINE_READER* modelFile = NULL;
WRLPROC proc;
if( !proc.Open( std::string( fname.ToUTF8() ) ) ) try
{
// set the max char limit to 8MB; if a VRML file contains
// longer lines then perhaps it shouldn't be used
modelFile = new FILE_LINE_READER( fname, 0, 8388608 );
}
catch( IO_ERROR &e )
{
#ifdef DEBUG
std::cout << " * [INFO] load failed: input line too long\n";
#endif
return NULL; return NULL;
}
// VRML file processor
WRLPROC proc( modelFile );
if( proc.GetVRMLType() == VRML_V1 ) if( proc.GetVRMLType() == VRML_V1 )
{ {
@ -243,6 +258,9 @@ SCENEGRAPH* Load( char const* aFileName )
delete bp; delete bp;
} }
if( NULL != modelFile )
delete modelFile;
// DEBUG: WRITE OUT VRML2 FILE TO CONFIRM STRUCTURE // DEBUG: WRITE OUT VRML2 FILE TO CONFIRM STRUCTURE
#if defined( DEBUG_VRML1 ) || defined( DEBUG_VRML2 ) #if defined( DEBUG_VRML1 ) || defined( DEBUG_VRML2 )
if( scene ) if( scene )

File diff suppressed because it is too large Load Diff

View File

@ -34,21 +34,22 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "richio.h"
#include "wrltypes.h" #include "wrltypes.h"
class WRLPROC class WRLPROC
{ {
private: private:
std::ifstream m_file; LINE_READER* m_file;
std::string m_filename; // name of the open file
size_t m_filepos; // position in the file
size_t m_fileline; // line being processed
size_t m_linepos; // position within 'buf'
std::string m_buf; // string being parsed std::string m_buf; // string being parsed
bool m_eof;
unsigned int m_fileline;
unsigned int m_bufpos;
WRLVERSION m_fileVersion; // VRML file version WRLVERSION m_fileVersion; // VRML file version
std::string m_error; // error message std::string m_error; // error message
std::string m_badchars; // characters forbidden in VRML{1|2} names std::string m_badchars; // characters forbidden in VRML{1|2} names
std::string m_filename;
// getRawLine reads a single non-blank line and in the case of a VRML1 file // getRawLine reads a single non-blank line and in the case of a VRML1 file
// it checks for invalid characters (bit 8 set). If m_buf is not empty and // it checks for invalid characters (bit 8 set). If m_buf is not empty and
@ -57,11 +58,9 @@ private:
bool getRawLine( void ); bool getRawLine( void );
public: public:
WRLPROC(); WRLPROC( LINE_READER* aLineReader );
~WRLPROC(); ~WRLPROC();
bool Open( const std::string& aFileName );
void Close();
bool eof( void ); bool eof( void );
// return the VRML Version // return the VRML Version