Original Post
Usual story... release build stuffing up. Any file I try to load with tinyxml++ whilst debugging just won't load. The file is there and I've tried both relative and absolute paths for the file name to no avail. The exception points towards the end of the function at the delete [] buf line. The tinyxml++ release build C++ command line options:
int main(int argc, char* args[])
{
using namespace ticpp;
Document xml_doc("settings.xml");
xml_doc.LoadFile();
return 0;
}
bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding )
{
if ( !file )
{
SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
return false;
}
// Delete the existing data:
Clear();
location.Clear();
// Get the file size, so we can pre-allocate the string. HUGE speed impact.
long length = 0;
fseek( file, 0, SEEK_END );
length = ftell( file );
fseek( file, 0, SEEK_SET );
// Strange case, but good to handle up front.
if ( length <= 0 )
{
SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
return false;
}
// If we have a file, assume it is all one big XML file, and read it in.
// The document parser may decide the document ends sooner than the entire file, however.
TIXML_STRING data;
data.reserve( length );
// Subtle bug here. TinyXml did use fgets. But from the XML spec:
// 2.11 End-of-Line Handling
// <snip>
// <quote>
// ...the XML processor MUST behave as if it normalized all line breaks in external
// parsed entities (including the document entity) on input, before parsing, by translating
// both the two-character sequence #xD #xA and any #xD that is not followed by #xA to
// a single #xA character.
// </quote>
//
// It is not clear fgets does that, and certainly isn't clear it works cross platform.
// Generally, you expect fgets to translate from the convention of the OS to the c/unix
// convention, and not work generally.
/*
while( fgets( buf, sizeof(buf), file ) )
{
data += buf;
}
*/
char* buf = new char[ length+1 ];
buf[0] = 0;
if ( fread( buf, length, 1, file ) != 1 ) {
delete [] buf;
SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
return false;
}
const char* lastPos = buf;
const char* p = buf;
buf[length] = 0;
while( *p ) {
assert( p < (buf+length) );
if ( *p == 0xa ) {
// Newline character. No special rules for this. Append all the characters
// since the last string, and include the newline.
data.append( lastPos, (p-lastPos+1) ); // append, include the newline
++p; // move past the newline
lastPos = p; // and point to the new buffer (may be 0)
assert( p <= (buf+length) );
}
else if ( *p == 0xd ) {
// Carriage return. Append what we have so far, then
// handle moving forward in the buffer.
if ( (p-lastPos) > 0 ) {
data.append( lastPos, p-lastPos ); // do not add the CR
}
data += (char)0xa; // a proper newline
if ( *(p+1) == 0xa ) {
// Carriage return - new line sequence
p += 2;
lastPos = p;
assert( p <= (buf+length) );
}
else {
// it was followed by something else...that is presumably characters again.
++p;
lastPos = p;
assert( p <= (buf+length) );
}
}
else {
++p;
}
}
// Handle any left over characters.
if ( p-lastPos ) {
data.append( lastPos, p-lastPos );
}
delete [] buf;
buf = 0;
Parse( data.c_str(), 0, encoding );
if ( Error() )
return false;
else
return true;
}
Quote:The tinyxml++ release build linker command line options:
/Od /D "TIXML_USE_TICPP" /D "UNICODE" /D "_UNICODE" /D "_CRT_SECURE_NO_DEPRECATE" /D "WIN32" /D "_CONSOLE" /D "NDEBUG" /GF /FD /EHsc /MD /Gy /Fo"obj/Release\\" /Fd"obj/Release\vc80.pdb" /W4 /nologo /c /Zi /TP /errorReport:prompt
Quote:My project's release build C++ command line options:
/OUT:"lib/ticpp.lib" /NOLOGO
Quote:My project's release build linker command line options:
/Od /GL /I "E:\Dev\SDL\include" /I "E:\Dev\tinyxml++" /I "E:\Dev\Boost_old" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "USE_LOG" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Zi /TP /wd4996 /errorReport:prompt
Quote:If I run without debugging, the program is fine (ie loads all xml files properly) until I try and exit, at which point I get an exception (I do have several singletons which might be causing this). Any help with why this might be happening is greatly appreciated. Cheers.
/OUT:"C:\Documents and Settings\Bill\My Documents\Visual Studio 2005\Projects\CHECKERS\Checkers_SDL\Release\Checkers_SDL.exe" /NOLOGO /LIBPATH:"E:\Dev\tinyxml++\lib" /LIBPATH:"E:\Dev\SDL\lib" /MANIFEST /MANIFESTFILE:"Release\Checkers_SDL.exe.intermediate.manifest" /NODEFAULTLIB:"(/NODEFAULTLIB:[uuid.lib" /NODEFAULTLIB:"msvcrt.lib])" /DEBUG /PDB:"c:\Documents and Settings\Bill\My Documents\Visual Studio 2005\Projects\CHECKERS\Checkers_SDL\release\Checkers_SDL.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT SDL.lib SDLmain.lib SDL_image.lib SDL_ttf.lib SDL_mixer.lib msvcrtd.lib ticpp.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib