A port of the irrlicht XML parser library.

Committer:
hlipka
Date:
Wed Nov 17 20:19:41 2010 +0000
Revision:
0:41a49a73580c
initial version

Who changed what in which revision?

UserRevisionLine numberNew 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