XMLError XMLDocument::Parse( const char* p, size_t len ) { const char* start = p; Clear(); if ( !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } if ( len == (size_t)(-1) ) { len = strlen( p ); } _charBuffer = new char[ len+1 ]; memcpy( _charBuffer, p, len ); _charBuffer[len] = 0; p = XMLUtil::SkipWhiteSpace( p ); p = XMLUtil::ReadBOM( p, &_writeBOM ); if ( !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } ptrdiff_t delta = p - start; // skip initial whitespace, BOM, etc. ParseDeep( _charBuffer+delta, 0 ); return _errorID; }
XMLError XMLDocument::Parse( const char* p, size_t len ) { DeleteChildren(); InitDocument(); if ( !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } if ( len == (size_t)(-1) ) { len = strlen( p ); } _charBuffer = new char[ len+1 ]; memcpy( _charBuffer, p, len ); _charBuffer[len] = 0; p = XMLUtil::SkipWhiteSpace( p ); p = XMLUtil::ReadBOM( p, &_writeBOM ); if ( !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } ParseDeep( _charBuffer, 0 ); return _errorID; }
XMLError XMLDocument::LoadFile( const char* filename ) { DeleteChildren(); InitDocument(); FILE* fp = 0; #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE) errno_t err = fopen_s(&fp, filename, "rb" ); if ( !fp || err) { #else fp = fopen( filename, "rb" ); if ( !fp) { #endif SetError( XML_ERROR_FILE_NOT_FOUND, filename, 0 ); return _errorID; } LoadFile( fp ); fclose( fp ); return _errorID; } XMLError XMLDocument::LoadFile( FILE* fp ) { DeleteChildren(); InitDocument(); fseek( fp, 0, SEEK_END ); size_t size = ftell( fp ); fseek( fp, 0, SEEK_SET ); if ( size == 0 ) { return _errorID; } _charBuffer = new char[size+1]; size_t read = fread( _charBuffer, 1, size, fp ); if ( read != size ) { SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); return _errorID; } _charBuffer[size] = 0; const char* p = _charBuffer; p = XMLUtil::SkipWhiteSpace( p ); p = XMLUtil::ReadBOM( p, &_writeBOM ); if ( !p || !*p ) { SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); return _errorID; } ParseDeep( _charBuffer + (p-_charBuffer), 0 ); return _errorID; }
XMLError XMLDocument::LoadFile(FILE* fp) { Clear(); fseek(fp, 0, SEEK_SET); if (fgetc(fp) == EOF && ferror(fp) != 0) { SetError(XML_ERROR_FILE_READ_ERROR, 0, 0); return _errorID; } fseek(fp, 0, SEEK_END); const long filelength = ftell(fp); fseek(fp, 0, SEEK_SET); if (filelength == -1L) { SetError(XML_ERROR_FILE_READ_ERROR, 0, 0); return _errorID; } const size_t size = filelength; if (size == 0) { SetError(XML_ERROR_EMPTY_DOCUMENT, 0, 0); return _errorID; } _charBuffer = new char[size + 1]; size_t read = fread(_charBuffer, 1, size, fp); if (read != size) { SetError(XML_ERROR_FILE_READ_ERROR, 0, 0); return _errorID; } _charBuffer[size] = 0; const char* p = _charBuffer; p = XMLUtil::SkipWhiteSpace(p); p = XMLUtil::ReadBOM(p, &_writeBOM); if (!p || !*p) { SetError(XML_ERROR_EMPTY_DOCUMENT, 0, 0); return _errorID; } ParseDeep(_charBuffer + (p - _charBuffer), 0); return _errorID; }
XMLError XMLDocument::Parse(const char* p, size_t len) { const char* start = p; Clear(); if (len == 0 || !p || !*p) { SetError(XML_ERROR_EMPTY_DOCUMENT, 0, 0); return _errorID; } if (len == (size_t)(-1)) { len = strlen(p); } _charBuffer = new char[len + 1]; memcpy(_charBuffer, p, len); _charBuffer[len] = 0; p = XMLUtil::SkipWhiteSpace(p); p = XMLUtil::ReadBOM(p, &_writeBOM); if (!p || !*p) { SetError(XML_ERROR_EMPTY_DOCUMENT, 0, 0); return _errorID; } ptrdiff_t delta = p - start; // skip initial whitespace, BOM, etc. ParseDeep(_charBuffer + delta, 0); if (_errorID) { // clean up now essentially dangling memory. // and the parse fail can put objects in the // pools that are dead and inaccessible. DeleteChildren(); _elementPool.Clear(); _attributePool.Clear(); _textPool.Clear(); _commentPool.Clear(); } return _errorID; }