A port of the irrlicht XML parser library.
irrXML.cpp@0:41a49a73580c, 2010-11-17 (annotated)
- Committer:
- hlipka
- Date:
- Wed Nov 17 20:19:41 2010 +0000
- Revision:
- 0:41a49a73580c
initial version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hlipka | 0:41a49a73580c | 1 | // Copyright (C) 2002-2005 Nikolaus Gebhardt |
hlipka | 0:41a49a73580c | 2 | // This file is part of the "Irrlicht Engine" and the "irrXML" project. |
hlipka | 0:41a49a73580c | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h |
hlipka | 0:41a49a73580c | 4 | |
hlipka | 0:41a49a73580c | 5 | #include "irrXML.h" |
hlipka | 0:41a49a73580c | 6 | #include "irrString.h" |
hlipka | 0:41a49a73580c | 7 | #include "irrArray.h" |
hlipka | 0:41a49a73580c | 8 | #include "fast_atof.h" |
hlipka | 0:41a49a73580c | 9 | #include "CXMLReaderImpl.h" |
hlipka | 0:41a49a73580c | 10 | |
hlipka | 0:41a49a73580c | 11 | namespace irr |
hlipka | 0:41a49a73580c | 12 | { |
hlipka | 0:41a49a73580c | 13 | namespace io |
hlipka | 0:41a49a73580c | 14 | { |
hlipka | 0:41a49a73580c | 15 | |
hlipka | 0:41a49a73580c | 16 | //! Implementation of the file read callback for ordinary files |
hlipka | 0:41a49a73580c | 17 | class CFileReadCallBack : public IFileReadCallBack |
hlipka | 0:41a49a73580c | 18 | { |
hlipka | 0:41a49a73580c | 19 | public: |
hlipka | 0:41a49a73580c | 20 | |
hlipka | 0:41a49a73580c | 21 | //! construct from filename |
hlipka | 0:41a49a73580c | 22 | CFileReadCallBack(const char* filename) |
hlipka | 0:41a49a73580c | 23 | : File(0), Size(0), Close(true) |
hlipka | 0:41a49a73580c | 24 | { |
hlipka | 0:41a49a73580c | 25 | // open file |
hlipka | 0:41a49a73580c | 26 | File = fopen(filename, "rb"); |
hlipka | 0:41a49a73580c | 27 | |
hlipka | 0:41a49a73580c | 28 | if (File) |
hlipka | 0:41a49a73580c | 29 | getFileSize(); |
hlipka | 0:41a49a73580c | 30 | } |
hlipka | 0:41a49a73580c | 31 | |
hlipka | 0:41a49a73580c | 32 | //! construct from FILE pointer |
hlipka | 0:41a49a73580c | 33 | CFileReadCallBack(FILE* file) |
hlipka | 0:41a49a73580c | 34 | : File(file), Size(0), Close(false) |
hlipka | 0:41a49a73580c | 35 | { |
hlipka | 0:41a49a73580c | 36 | if (File) |
hlipka | 0:41a49a73580c | 37 | getFileSize(); |
hlipka | 0:41a49a73580c | 38 | } |
hlipka | 0:41a49a73580c | 39 | |
hlipka | 0:41a49a73580c | 40 | //! destructor |
hlipka | 0:41a49a73580c | 41 | virtual ~CFileReadCallBack() |
hlipka | 0:41a49a73580c | 42 | { |
hlipka | 0:41a49a73580c | 43 | if (Close && File) |
hlipka | 0:41a49a73580c | 44 | fclose(File); |
hlipka | 0:41a49a73580c | 45 | } |
hlipka | 0:41a49a73580c | 46 | |
hlipka | 0:41a49a73580c | 47 | //! Reads an amount of bytes from the file. |
hlipka | 0:41a49a73580c | 48 | virtual int read(void* buffer, int sizeToRead) |
hlipka | 0:41a49a73580c | 49 | { |
hlipka | 0:41a49a73580c | 50 | if (!File) |
hlipka | 0:41a49a73580c | 51 | return 0; |
hlipka | 0:41a49a73580c | 52 | |
hlipka | 0:41a49a73580c | 53 | return (int)fread(buffer, 1, sizeToRead, File); |
hlipka | 0:41a49a73580c | 54 | } |
hlipka | 0:41a49a73580c | 55 | |
hlipka | 0:41a49a73580c | 56 | //! Returns size of file in bytes |
hlipka | 0:41a49a73580c | 57 | virtual int getSize() |
hlipka | 0:41a49a73580c | 58 | { |
hlipka | 0:41a49a73580c | 59 | return Size; |
hlipka | 0:41a49a73580c | 60 | } |
hlipka | 0:41a49a73580c | 61 | |
hlipka | 0:41a49a73580c | 62 | private: |
hlipka | 0:41a49a73580c | 63 | |
hlipka | 0:41a49a73580c | 64 | //! retrieves the file size of the open file |
hlipka | 0:41a49a73580c | 65 | void getFileSize() |
hlipka | 0:41a49a73580c | 66 | { |
hlipka | 0:41a49a73580c | 67 | fseek(File, 0, SEEK_END); |
hlipka | 0:41a49a73580c | 68 | Size = ftell(File); |
hlipka | 0:41a49a73580c | 69 | fseek(File, 0, SEEK_SET); |
hlipka | 0:41a49a73580c | 70 | } |
hlipka | 0:41a49a73580c | 71 | |
hlipka | 0:41a49a73580c | 72 | FILE* File; |
hlipka | 0:41a49a73580c | 73 | int Size; |
hlipka | 0:41a49a73580c | 74 | bool Close; |
hlipka | 0:41a49a73580c | 75 | |
hlipka | 0:41a49a73580c | 76 | }; // end class CFileReadCallBack |
hlipka | 0:41a49a73580c | 77 | |
hlipka | 0:41a49a73580c | 78 | |
hlipka | 0:41a49a73580c | 79 | |
hlipka | 0:41a49a73580c | 80 | // FACTORY FUNCTIONS: |
hlipka | 0:41a49a73580c | 81 | |
hlipka | 0:41a49a73580c | 82 | |
hlipka | 0:41a49a73580c | 83 | //! Creates an instance of an UFT-8 or ASCII character xml parser. |
hlipka | 0:41a49a73580c | 84 | IrrXMLReader* createIrrXMLReader(const char* filename) |
hlipka | 0:41a49a73580c | 85 | { |
hlipka | 0:41a49a73580c | 86 | return new CXMLReaderImpl<char, IXMLBase>(new CFileReadCallBack(filename)); |
hlipka | 0:41a49a73580c | 87 | } |
hlipka | 0:41a49a73580c | 88 | |
hlipka | 0:41a49a73580c | 89 | |
hlipka | 0:41a49a73580c | 90 | //! Creates an instance of an UFT-8 or ASCII character xml parser. |
hlipka | 0:41a49a73580c | 91 | IrrXMLReader* createIrrXMLReader(FILE* file) |
hlipka | 0:41a49a73580c | 92 | { |
hlipka | 0:41a49a73580c | 93 | return new CXMLReaderImpl<char, IXMLBase>(new CFileReadCallBack(file)); |
hlipka | 0:41a49a73580c | 94 | } |
hlipka | 0:41a49a73580c | 95 | |
hlipka | 0:41a49a73580c | 96 | |
hlipka | 0:41a49a73580c | 97 | //! Creates an instance of an UFT-8 or ASCII character xml parser. |
hlipka | 0:41a49a73580c | 98 | IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback) |
hlipka | 0:41a49a73580c | 99 | { |
hlipka | 0:41a49a73580c | 100 | return new CXMLReaderImpl<char, IXMLBase>(callback, false); |
hlipka | 0:41a49a73580c | 101 | } |
hlipka | 0:41a49a73580c | 102 | |
hlipka | 0:41a49a73580c | 103 | |
hlipka | 0:41a49a73580c | 104 | //! Creates an instance of an UTF-16 xml parser. |
hlipka | 0:41a49a73580c | 105 | IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename) |
hlipka | 0:41a49a73580c | 106 | { |
hlipka | 0:41a49a73580c | 107 | return new CXMLReaderImpl<char16, IXMLBase>(new CFileReadCallBack(filename)); |
hlipka | 0:41a49a73580c | 108 | } |
hlipka | 0:41a49a73580c | 109 | |
hlipka | 0:41a49a73580c | 110 | |
hlipka | 0:41a49a73580c | 111 | //! Creates an instance of an UTF-16 xml parser. |
hlipka | 0:41a49a73580c | 112 | IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file) |
hlipka | 0:41a49a73580c | 113 | { |
hlipka | 0:41a49a73580c | 114 | return new CXMLReaderImpl<char16, IXMLBase>(new CFileReadCallBack(file)); |
hlipka | 0:41a49a73580c | 115 | } |
hlipka | 0:41a49a73580c | 116 | |
hlipka | 0:41a49a73580c | 117 | |
hlipka | 0:41a49a73580c | 118 | //! Creates an instance of an UTF-16 xml parser. |
hlipka | 0:41a49a73580c | 119 | IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback) |
hlipka | 0:41a49a73580c | 120 | { |
hlipka | 0:41a49a73580c | 121 | return new CXMLReaderImpl<char16, IXMLBase>(callback, false); |
hlipka | 0:41a49a73580c | 122 | } |
hlipka | 0:41a49a73580c | 123 | |
hlipka | 0:41a49a73580c | 124 | |
hlipka | 0:41a49a73580c | 125 | //! Creates an instance of an UTF-32 xml parser. |
hlipka | 0:41a49a73580c | 126 | IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename) |
hlipka | 0:41a49a73580c | 127 | { |
hlipka | 0:41a49a73580c | 128 | return new CXMLReaderImpl<char32, IXMLBase>(new CFileReadCallBack(filename)); |
hlipka | 0:41a49a73580c | 129 | } |
hlipka | 0:41a49a73580c | 130 | |
hlipka | 0:41a49a73580c | 131 | |
hlipka | 0:41a49a73580c | 132 | //! Creates an instance of an UTF-32 xml parser. |
hlipka | 0:41a49a73580c | 133 | IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file) |
hlipka | 0:41a49a73580c | 134 | { |
hlipka | 0:41a49a73580c | 135 | return new CXMLReaderImpl<char32, IXMLBase>(new CFileReadCallBack(file)); |
hlipka | 0:41a49a73580c | 136 | } |
hlipka | 0:41a49a73580c | 137 | |
hlipka | 0:41a49a73580c | 138 | |
hlipka | 0:41a49a73580c | 139 | //! Creates an instance of an UTF-32 xml parser. |
hlipka | 0:41a49a73580c | 140 | IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback) |
hlipka | 0:41a49a73580c | 141 | { |
hlipka | 0:41a49a73580c | 142 | return new CXMLReaderImpl<char32, IXMLBase>(callback, false); |
hlipka | 0:41a49a73580c | 143 | } |
hlipka | 0:41a49a73580c | 144 | |
hlipka | 0:41a49a73580c | 145 | |
hlipka | 0:41a49a73580c | 146 | } // end namespace io |
hlipka | 0:41a49a73580c | 147 | } // end namespace irr |