OROCHI
 
Loading...
Searching...
No Matches
GxXml.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13#if GX_DEVELOP
14
15GX_CORE_NAMESPACE_BEGIN()
16
17//===========================================================================
19//===========================================================================
20#if defined(_MSC_EXTENSIONS) // expat_external.h 参照
21#define GX_XML_CDECL __cdecl
22#else //_MSC_EXTENSIONS
23#define GX_XML_CDECL
24#endif // !_MSC_EXTENSIONS
25
26typedef void (GX_XML_CDECL* GxXmlStartElementHandler) (void* userData, GX_CSTR name, GX_CSTR* pAttribute);
27typedef void (GX_XML_CDECL* GxXmlEndElementHandler) (void* userData, GX_CSTR name);
28typedef void (GX_XML_CDECL* GxXmlCharacterDataHandler) (void* userData, GX_CSTR name, s32 len);
29
30struct GxXmlMemoryHandlingSuite
31{
32 void *(*mallocFunction)(size_t size);
33 void *(*reallocFunction)(void* pointer, size_t size);
34 void (*freeFunction)(void* pointer);
35};
36
37//===========================================================================
39//===========================================================================
40class GxXmlParser : public GxClassBase
41{
42 //-----------------------------------------------------------
44 //-----------------------------------------------------------
46public:
47 // RTTI定義
48 GX_RTTI_CLASS(GxXmlParser, GxClassBase)
49 // GxClassBase継承クラス用禁止宣言
50 GX_PROHIBIT_CLASS_BASE(GxXmlParser)
51 // new, delete定義
52 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
53
54
55 static constexpr u32 STRING_LENGTH = GxFile::FILE_PATH_MAX;
56
57protected:
59 enum class STATE
60 {
61 NONE = 0,
62 START_ELEMENT,
63 CHARACTER_DATA,
64 END_ELEMENT
65 };
66
67protected:
69 class GxLocalAllocator
70 {
71 //-----------------------------------------------------------
73 //-----------------------------------------------------------
75 public:
77 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
78
79
80 //-------------------------------------------------------------
82 //-------------------------------------------------------------
84 protected:
86 GxLocalAllocator(void);
87 public:
89 GxLocalAllocator(GxLocalAllocator* pPrevious, u32 size);
91 ~GxLocalAllocator(void);
92
93 private:
95 GxLocalAllocator(const GxLocalAllocator&);
97 GX_FORCE_INLINE const GxLocalAllocator& operator=(const GxLocalAllocator&);
98
100 //-------------------------------------------------------------
102 //-------------------------------------------------------------
104 public:
106 void* allocateMemory(u32 size);
108 constexpr void freeMemory(void* /*pAddress*/) {}
109
111 //-------------------------------------------------------------
113 //-------------------------------------------------------------
115 private:
116 GxLocalAllocator* _pNext;
117 void* _pBuffer;
118 void* _pFree;
119 u32 _size;
120
122 };
123
124public:
126 class GxAttribute
127 {
128 //-----------------------------------------------------------
130 //-----------------------------------------------------------
132 public:
134 GxAttribute(void) : _name(nullptr), _value(nullptr) {}
136 ~GxAttribute(void) {}
137
138 private:
140 GxAttribute(const GxAttribute&);
142 GX_FORCE_INLINE const GxAttribute& operator=(const GxAttribute&);
143
145 //-------------------------------------------------------------
147 //-------------------------------------------------------------
149 public:
151 GX_CSTR getName(void) const;
153 void setName(GX_CSTR name);
155 GX_STR getValue(void);
157 GX_CSTR getValue(void) const;
159 void setValue(GX_CSTR value, u32 stringEncode);
160
162 //-------------------------------------------------------------
164 //-------------------------------------------------------------
166 private:
167 GX_STR _name;
168 GX_STR _value;
169
171 };
172
173 //===========================================================================
175 //===========================================================================
176 class GxElement
177 {
178 //-------------------------------------------------------------
180 //-------------------------------------------------------------
182 public:
183 static constexpr u32 ATTRIUBUTE_MAX = 6;
184 static constexpr u32 ELEMENT_NAME_LENGTH_MAX = 32;
185
187 //-------------------------------------------------------------
189 //-------------------------------------------------------------
191 public:
193 GxElement(void) : _name(nullptr), _attributeNum(0) { GX_MEMSET(_pAttribute, 0, sizeof(_pAttribute)); }
195 ~GxElement(void) {}
196
198 //-------------------------------------------------------------
200 //-------------------------------------------------------------
202 public:
204 GX_CSTR getName(void) const;
206 void setName(GX_CSTR name);
208 u32 getAttributeNum(void) const;
210 const GxAttribute* getAttribute(u32 index) const;
212 const GxAttribute* getAttribute(GX_CSTR name) const;
214 GX_CSTR getAttributeValue(GX_CSTR name) const;
216 void addAttribute(GX_CSTR name, GX_CSTR value, u32 stringEncode);
217
219 //-------------------------------------------------------------
221 //-------------------------------------------------------------
223 private:
224 GX_STR _name;
225 u32 _attributeNum;
226 GxAttribute* _pAttribute[ATTRIUBUTE_MAX];
227
229 };
230
231 //===========================================================================
233 //===========================================================================
234 class GxNode
235 {
236 //-------------------------------------------------------------
238 //-------------------------------------------------------------
240 public:
242 GxNode(void) : _pChild(nullptr)
243 , _pParent(nullptr)
244 , _pNext(nullptr)
245 , _pPrevious(nullptr)
246 , _string(nullptr)
247 {}
249 ~GxNode(void) {}
250
251 private:
253 GxNode(const GxElement&);
255 GX_FORCE_INLINE const GxNode& operator=(const GxNode&);
256
258 //-------------------------------------------------------------
260 //-------------------------------------------------------------
262 public:
264 constexpr GxNode* getChild(void) const { return _pChild; }
266 constexpr void setChild(GxNode* pChild) { _pChild = pChild; }
268 constexpr GxNode* getParent(void) const { return _pParent; }
270 constexpr void setParent(GxNode* pParent) { _pParent = pParent; }
272 constexpr GxNode* getNext(void) const { return _pNext; }
274 constexpr void setNext(GxNode* pNext) { _pNext = pNext; }
276 constexpr GxNode* getPrevious(void) const { return _pPrevious; }
278 constexpr void setPrevious(GxNode* pPrevious) { _pPrevious = pPrevious; }
280 GX_FORCE_INLINE GxElement* getElement(void) { return &_element; }
282 GX_FORCE_INLINE const GxElement* getElement(void) const { return &_element; }
284 GX_FORCE_INLINE void setElement(const GxElement& element) { _element = element; }
286 constexpr GX_CSTR getString(void) const { return _string; }
288 void setString(GX_CSTR string, u32 length);
290 GxNode* addChild(void);
292 GxNode* addNext(void);
294 const GxNode* findNode(GX_CSTR elementName, b32 isSkipTopNode = false) const;
296 const GxNode* findNodeChild(GX_CSTR elementName, b32 isSkipTopNode = false, b32 isSkipNextNode = false) const;
298 const GxNode* findNodeNext(GX_CSTR elementName, b32 isSkipTopNode = false) const;
300 const GxNode* findNode(GX_CSTR elementName, GX_CSTR attribute, GX_CSTR value, b32 isSkipTopNode = false) const;
302 const GxNode* findNodeChild(GX_CSTR elementName, GX_CSTR attribute, GX_CSTR value, b32 isSkipTopNode = false) const;
304 const GxNode* findNodeNext(GX_CSTR elementName, GX_CSTR attribute, GX_CSTR value, b32 isSkipTopNode = false) const;
306 u32 countNode(GX_CSTR elementName, GX_CSTR attribute, GX_CSTR value) const;
308 u32 countNodeChild(GX_CSTR elementName, GX_CSTR attribute, GX_CSTR value) const;
310 u32 countNodeNext(GX_CSTR elementName, GX_CSTR attribute, GX_CSTR value) const;
311
313 //-------------------------------------------------------------
315 //-------------------------------------------------------------
317 private:
318 GxNode* _pChild;
319 GxNode* _pParent;
320 GxNode* _pNext;
321 GxNode* _pPrevious;
322 GxElement _element;
323 GX_STR _string;
324
326 };
327
329 //-----------------------------------------------------------
331 //-----------------------------------------------------------
333public:
335 GxXmlParser(void);
337 ~GxXmlParser(void) override { terminate(); }
338
340 b32 initialize(GxStream& stream);
342 void terminate(void);
343
345 //-----------------------------------------------------------
347 //-----------------------------------------------------------
349public:
351 void addStartElement(GX_CSTR elementName);
353 void addAttribute(GX_CSTR attribute, GX_CSTR value);
355 void addValue(GX_CSTR value, u32 length = 0);
357 void addEndElement(void);
358
360 void setDefaultHandler(void);
362 void setUserHandler(void* pUserData, GxXmlStartElementHandler startElementHandler, GxXmlEndElementHandler endElementHandler, GxXmlCharacterDataHandler characterDataHandler);
364 void read(void);
365
366protected:
368 GX_FORCE_INLINE static void* xmlMalloc(size_t size) { return GX_ALLOCATE_MEMORY(getGxAllocatorList(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP), static_cast<u32>(size)); }
370 GX_FORCE_INLINE static void xmlFree(void* pAddress) { GX_SAFE_FREE_MEMORY(pAddress); }
372 GX_FORCE_INLINE static void* xmlRealloc(void* pAddress, size_t size) { return GX_REALLOC_MEMORY(pAddress, static_cast<u32>(size)); }
373
374private:
376 static void GX_XML_CDECL callbackStartElement(void* pUserData, GX_CSTR elementName, GX_CSTR* pAttributes);
378 static void GX_XML_CDECL callbackEndElement(void* pUserData, GX_CSTR elementName);
380 static void GX_XML_CDECL callbackCharacterData(void* pUserData, GX_CSTR data, s32 length);
381
383 //-----------------------------------------------------------
385 //-----------------------------------------------------------
387public:
389 constexpr GxNode* getRootNode(void) const { return _pRootNode; }
391 constexpr u32 getDepth(void) const { return _depth; }
392
393#if defined(GX_THREAD_LOCAL_STORAGE)
395 static constexpr void setActiveAllocator(GxLocalAllocator* pLocalAllocator) { _pActiveAllocator = pLocalAllocator; }
397 GX_FORCE_INLINE static GxLocalAllocator* getActiveAllocator(void) { return _pActiveAllocator; }
398#else //GX_THREAD_LOCAL_STORAGE
400 GX_FORCE_INLINE static const void setActiveAllocator(GxLocalAllocator* pLocalAllocator) { _pActiveAllocator[GxThread::getCurrentThread()->getIndex()] = pLocalAllocator; }
402 GX_FORCE_INLINE static GxLocalAllocator* getActiveAllocator(void) { return _pActiveAllocator[GxThread::getCurrentThread()->getIndex()]; }
403#endif // !GX_THREAD_LOCAL_STORAGE
405 constexpr void setStringEncode(u32 encode) { _stringEncode = encode; }
406
408 //-----------------------------------------------------------
410 //-----------------------------------------------------------
412protected:
413 void* _pParser;
414 void* _pUserData;
415 GxXmlStartElementHandler _pUserStartElementHandler;
416 GxXmlEndElementHandler _pUserEndElementHandler;
417 GxXmlCharacterDataHandler _pUserCharacterDataHandler;
418 GxNode* _pRootNode;
419 GxNode* _pCurrentNode;
420 GxStream* _pStream;
421 u32 _depth;
422
423private:
424 static const GxXmlMemoryHandlingSuite _xmlFunctions;
425#if defined(GX_THREAD_LOCAL_STORAGE)
426 static GX_THREAD_LOCAL_STORAGE GxLocalAllocator* _pActiveAllocator;
427#else //GX_THREAD_LOCAL_STORAGE
428 static GxLocalAllocator* _pActiveAllocator[GxThread::THREAD_MAX];
429#endif // !GX_THREAD_LOCAL_STORAGE
430
431 GxLocalAllocator* _pLocalAllocator;
432 GxLocalAllocator* _pOldAllocator;
433 u32 _stringEncode;
434
436};
437
438//===========================================================================
440//===========================================================================
441class GxXmlWriter : public GxClassBase
442{
443 //-----------------------------------------------------------
445 //-----------------------------------------------------------
447public:
448 // RTTI定義
449 GX_RTTI_CLASS(GxXmlWriter, GxClassBase)
450 // new, delete定義
451 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
452 // GxClassBase継承クラス用禁止宣言
453 GX_PROHIBIT_CLASS_BASE(GxXmlWriter)
454
455protected:
457 enum class STATE
458 {
459 NONE = 0,
460 DECLARATION,
461 START_ELEMENT,
462 VALUE,
463 END_ELEMENT
464 };
465
467 static constexpr u32 ELEMENT_ARRAY_RESERVE_SIZE = GxMath::VALUE_4K;
468
470 static GX_CSTR XML_DECLARATION_STRING;
471
473 //-----------------------------------------------------------
475 //-----------------------------------------------------------
477public:
479 GxXmlWriter(void);
481 ~GxXmlWriter(void) override { terminate(); }
482
484 b32 initialize(GxStream& stream, b32 isWriteBOM = false);
486 void terminate(void);
487
489 //-----------------------------------------------------------
491 //-----------------------------------------------------------
493public:
495 b32 writeXmlDeclaration(void);
497 b32 writeStartElement(GX_CSTR elementName);
499 b32 writeAttribute(GX_CSTR attributeName, GX_CSTR value);
501 b32 writeValue(GX_CSTR value, u32 length = 0);
503 b32 writeEndElement(void);
504
505protected:
507 b32 writeXmlBOM(void);
509 b32 writeXmlTabs(void);
511 b32 writeXmlSpace(void);
513 b32 writeXmlReturn(void);
515 b32 writeXmlString(GX_CSTR string);
517 b32 writeXmlStartElementTop(void);
519 b32 writeXmlStartElementEnd(void);
521 b32 writeXmlStartElementEndForOnlyStartElement(void);
523 b32 writeXmlEndElementTop(void);
525 b32 writeXmlEndElementEnd(void);
527 b32 writeXmlAttributeValueStart(void);
529 b32 writeXmlAttributeValueEnd(void);
531 GX_FORCE_INLINE void setWriteXmlTabs(b32 enable) { _isWriteXmlTabs = enable; }
532
534 //-----------------------------------------------------------
536 //-----------------------------------------------------------
538public:
540 constexpr void setStringEncode(u32 encode) { _stringEncode = encode; }
541
543 //-----------------------------------------------------------
545 //-----------------------------------------------------------
547private:
548 GxStreamWriter* _pStreamWriter;
549 GxArray _elementArray;
550 STATE _state;
551 u32 _depth;
552 b32 _isWriteXmlTabs;
553 u32 _stringEncode;
554
556};
557
558GX_CORE_NAMESPACE_END()
559
560#endif // GX_DEVELOP
#define GX_ALLOCATE_MEMORY(pAllocatorList, size)
Definition GxAllocator.h:536
#define GX_SAFE_FREE_MEMORY(pAddress)
Definition GxAllocator.h:594
#define GX_REALLOC_MEMORY(pAddress, size)
Definition GxAllocator.h:621
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
@ NONE
何もしない
配列クラス
Definition GxArray.h:18
オブジェクト基底クラス
Definition GxBase.h:88
static constexpr u32 VALUE_4K
4K
Definition GxMath.h:131
ストリーム基礎クラス
Definition GxStream.h:20
ストリーム書き込みクラス
Definition GxStreamWriter.h:19
static GxThread * getCurrentThread(void)
カレントスレッドを取得
Definition GxThread.cpp:505
constexpr u32 getIndex(void) const
インデックスを取得
Definition GxThread.h:251
static constexpr u32 THREAD_MAX
スレッドの最大数
Definition GxThread.h:188
32bitブーリアン
Definition GxDefine.h:173