summaryrefslogtreecommitdiffstats
path: root/Src/xml
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 14:54:57 +0200
committerJef <jef@targetspot.com>2024-09-24 14:54:57 +0200
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/xml
parentAdding .gitignore (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar
winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.bz2
winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.lz
winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.xz
winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.zst
winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.zip
Diffstat (limited to 'Src/xml')
-rw-r--r--Src/xml/Encodings.cpp81
-rw-r--r--Src/xml/XMLDOM.cpp101
-rw-r--r--Src/xml/XMLDOM.h27
-rw-r--r--Src/xml/XMLNode.cpp201
-rw-r--r--Src/xml/XMLNode.h45
-rw-r--r--Src/xml/XMLParameters.cpp131
-rw-r--r--Src/xml/XMLParameters.h30
-rw-r--r--Src/xml/XMLReader.cpp382
-rw-r--r--Src/xml/XMLReader.h66
-rw-r--r--Src/xml/api__xml.h6
-rw-r--r--Src/xml/encodings_c.cpp90
-rw-r--r--Src/xml/factory_xml.cpp68
-rw-r--r--Src/xml/factory_xml.h25
-rw-r--r--Src/xml/ifc_xmlreadercallback.cpp1
-rw-r--r--Src/xml/ifc_xmlreadercallback.h48
-rw-r--r--Src/xml/ifc_xmlreadercallbackT.h27
-rw-r--r--Src/xml/ifc_xmlreadercallbacki.h39
-rw-r--r--Src/xml/ifc_xmlreaderparams.cpp1
-rw-r--r--Src/xml/ifc_xmlreaderparams.h65
-rw-r--r--Src/xml/main.cpp49
-rw-r--r--Src/xml/obj_xml.h124
-rw-r--r--Src/xml/resource.h14
-rw-r--r--Src/xml/version.rc239
-rw-r--r--Src/xml/wa5_xml.h15
-rw-r--r--Src/xml/xml.rc76
-rw-r--r--Src/xml/xml.vcxproj281
-rw-r--r--Src/xml/xml.vcxproj.filters77
-rw-r--r--Src/xml/xml.xcodeproj/project.pbxproj301
28 files changed, 2410 insertions, 0 deletions
diff --git a/Src/xml/Encodings.cpp b/Src/xml/Encodings.cpp
new file mode 100644
index 000000000..92f91154d
--- /dev/null
+++ b/Src/xml/Encodings.cpp
@@ -0,0 +1,81 @@
+#include "expat.h"
+#include <wchar.h>
+#include <windows.h>
+#include "../WAT/WAT.h"
+
+struct WindowsEncodings
+{
+ const wchar_t *name;
+ UINT codePage;
+};
+
+static const WindowsEncodings encodings[] =
+{
+ {L"iso-8859-2", 28592},
+ {L"iso-8859-3", 28593},
+ {L"iso-8859-4", 28594},
+ {L"iso-8859-5", 28595},
+ {L"iso-8859-6", 28596},
+ {L"iso-8859-7", 28597},
+ {L"iso-8859-8", 28598},
+ {L"iso-8859-9", 28599},
+ {L"iso-8859-15", 28605},
+ {L"windows-1251", 1251},
+ {L"windows-1252", 1252},
+ {L"windows-1253", 1253},
+ {L"windows-1254", 1254},
+ {L"windows-1255", 1255},
+ {L"windows-1256", 1256},
+ {L"windows-1257", 1257},
+ {L"windows-1258", 1258},
+
+};
+
+void MakeMap(int *map, UINT codepage)
+{
+ unsigned char i=0;
+ unsigned char mb[2] = {0,0};
+ wchar_t temp[2] = {0};
+ do
+ {
+ mb[0]=i;
+ // if (IsDBLeadByteEx(codepage, i)) map[i]=-2; else {
+ int len = MultiByteToWideChar(codepage, 0, (char *)mb, 2, 0, 0);
+ switch(len)
+ {
+ case 0:
+ map[i]=-1;
+ break;
+ case 2:
+ {
+ MultiByteToWideChar(codepage, 0, (char *)mb, 2, temp, 2);
+ map[i]=temp[0];
+ }
+ break;
+ }
+ // }
+ } while (i++ != 255);
+}
+
+#define NUM_ENCODINGS (sizeof(encodings)/sizeof(WindowsEncodings))
+int XMLCALL UnknownEncoding(void *data, const wchar_t *name, XML_Encoding *info)
+{
+ for (int i=0;i<NUM_ENCODINGS;i++)
+ {
+ if (!_wcsicmp(name, encodings[i].name))
+ {
+ MakeMap(info->map, encodings[i].codePage);
+ info->data = 0;
+ info->convert = 0;
+ info->release = 0;
+ return XML_STATUS_OK;
+ }
+ }
+ return XML_STATUS_ERROR;
+}
+
+int XMLCALL UnknownEncoding(void* data, const char* name, XML_Encoding* info)
+{
+ auto wszName = wa::strings::wa_string(name).GetW().c_str();
+ return UnknownEncoding(data, wszName, info);
+} \ No newline at end of file
diff --git a/Src/xml/XMLDOM.cpp b/Src/xml/XMLDOM.cpp
new file mode 100644
index 000000000..431307fd4
--- /dev/null
+++ b/Src/xml/XMLDOM.cpp
@@ -0,0 +1,101 @@
+#include "XMLDOM.h"
+
+XMLDOM::XMLDOM() : curtext(0), curtext_len(0), curNode(0)
+{
+ xmlNode = new XMLNode;
+ curNode = xmlNode;
+}
+
+XMLDOM::~XMLDOM()
+{
+ if (curtext)
+ {
+ free(curtext);
+ curtext = 0;
+ curtext_len = 0;
+ }
+ delete xmlNode;
+}
+
+void XMLDOM::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
+{
+ XMLNode *newNode = new XMLNode;
+
+ int num = (int)params->getNbItems();
+ for (int i = 0;i < num;i++)
+ newNode->SetProperty(params->getItemName(i), params->getItemValue(i));
+
+ newNode->parent = curNode;
+ curNode->SetContent_Own(curtext);
+ curtext = 0;
+
+ curNode->AddNode(xmltag, newNode);
+ curNode = newNode;
+}
+
+void XMLDOM::EndTag(const wchar_t *xmlpath, const wchar_t *xmltag)
+{
+ curNode->AppendContent(curtext);
+
+ if (curtext)
+ {
+ free(curtext);
+ curtext = 0;
+ curtext_len = 0;
+ }
+
+ curNode = curNode->parent;
+}
+
+void XMLDOM::TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str)
+{
+ if (str && *str)
+ {
+ if (curtext)
+ {
+ size_t len = wcslen(str), new_len = len + curtext_len;
+ wchar_t* newcurtext = (wchar_t *)realloc(curtext, (new_len+1)*sizeof(wchar_t));
+ if (newcurtext)
+ {
+ curtext = newcurtext;
+ wcsncpy(curtext+curtext_len, str, len);
+ *(curtext+curtext_len+len) = 0;
+ curtext_len = new_len;
+ }
+ else
+ {
+ newcurtext = (wchar_t *)malloc((new_len+1)*sizeof(wchar_t));
+ if (newcurtext)
+ {
+ memcpy(newcurtext, curtext, curtext_len*sizeof(wchar_t));
+ free(curtext);
+ curtext = newcurtext;
+
+ wcsncpy(curtext+curtext_len, str, len);
+ *(curtext+curtext_len+len) = 0;
+ curtext_len = new_len;
+ }
+ }
+ }
+ else
+ {
+ curtext_len = wcslen(str);
+ curtext = (wchar_t *)malloc((curtext_len+1)*sizeof(wchar_t));
+ if (curtext)
+ memcpy(curtext, str, (curtext_len+1)*sizeof(wchar_t));
+ }
+ }
+}
+
+const XMLNode *XMLDOM::GetRoot() const
+{
+ return xmlNode;
+}
+
+#define CBCLASS XMLDOM
+START_DISPATCH;
+VCB(ONSTARTELEMENT, StartTag)
+VCB(ONENDELEMENT, EndTag)
+VCB(ONCHARDATA, TextHandler)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file
diff --git a/Src/xml/XMLDOM.h b/Src/xml/XMLDOM.h
new file mode 100644
index 000000000..df4a1abc1
--- /dev/null
+++ b/Src/xml/XMLDOM.h
@@ -0,0 +1,27 @@
+#pragma once
+#include "../xml/ifc_xmlreadercallback.h"
+#include "XMLNode.h"
+#include "../nu/Alias.h"
+
+class XMLDOM : public ifc_xmlreadercallback
+{
+public:
+ XMLDOM();
+ ~XMLDOM();
+
+ const XMLNode *GetRoot() const;
+
+private:
+ void StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params);
+ void EndTag(const wchar_t *xmlpath, const wchar_t *xmltag);
+ void TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str);
+
+private:
+ wchar_t *curtext;
+ size_t curtext_len; // number of characters in curtext, not including null terminator
+ XMLNode *xmlNode;
+ XMLNode *curNode;
+
+protected:
+ RECVS_DISPATCH;
+}; \ No newline at end of file
diff --git a/Src/xml/XMLNode.cpp b/Src/xml/XMLNode.cpp
new file mode 100644
index 000000000..65fe1a36a
--- /dev/null
+++ b/Src/xml/XMLNode.cpp
@@ -0,0 +1,201 @@
+#include "XMLNode.h"
+
+static int CompareStuff(const wchar_t *const &str1, const wchar_t *const &str2)
+{
+ return CompareStringW(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), 0, str1, -1, str2, -1)-2;
+}
+
+XMLNode::XMLNode() : content(0), content_len(0), parent(0)
+{
+}
+
+XMLNode::~XMLNode()
+{
+ for (PropMap::iterator mapItr=properties.begin();mapItr != properties.end();mapItr++)
+ {
+ free((wchar_t *)mapItr->first);
+ free(mapItr->second);
+ }
+
+ for (NodeMap::iterator mapItr=nodes.begin();mapItr != nodes.end();mapItr++)
+ {
+ NodeList * const nodeList = mapItr->second;
+ if (nodeList)
+ {
+ for (NodeList::iterator itr=nodeList->begin(); itr!= nodeList->end(); itr++)
+ {
+ delete static_cast<XMLNode *>(*itr);
+ }
+ }
+ free((wchar_t *)mapItr->first);
+ }
+
+ if (content)
+ {
+ free(content);
+ content = 0;
+ content_len = 0;
+ }
+}
+
+const XMLNode *XMLNode::Get(const wchar_t *tagName) const
+{
+ NodeMap::const_iterator itr = nodes.find(tagName);
+ if (itr == nodes.end())
+ return 0;
+ else
+ {
+ NodeList *list = itr->second;
+ return list->at(0);
+ }
+}
+
+const XMLNode::NodeList *XMLNode::GetList(const wchar_t *tagName) const
+{
+ NodeMap::const_iterator itr = nodes.find(tagName);
+ if (itr == nodes.end())
+ {
+ return 0;
+ }
+ else
+ {
+ NodeList *list = itr->second;
+ return list;
+ }
+}
+
+const bool XMLNode::Present(const wchar_t *tagName) const
+{
+ return nodes.find(tagName) != nodes.end();
+}
+
+// LEGACY implementaions!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+//void XMLNode::SetProperty(const wchar_t *prop, const wchar_t *value)
+//{
+// PropMap::MapPair &pair = properties.getItem(prop);
+// if (pair.first == prop) // replace with a copy if we made a new entry
+// pair.first = _wcsdup(prop);
+// free(pair.second);
+// pair.second = _wcsdup(value);
+//}
+void XMLNode::SetProperty(const wchar_t* prop, const wchar_t* value)
+{
+ auto it = properties.find(prop);
+ if (properties.end() == it)
+ {
+ properties.insert({ _wcsdup(prop), _wcsdup(value) });
+ }
+ else
+ {
+ if (nullptr != it->second)
+ {
+ free(it->second);
+ }
+ properties[prop] = _wcsdup(value);
+ }
+}
+
+void XMLNode::SetContent_Own(wchar_t *new_content)
+{
+ if (content)
+ {
+ free(content);
+ content = 0;
+ content_len = 0;
+ }
+
+ if (new_content && *new_content)
+ {
+ content = new_content;
+ content_len = wcslen(content);
+ }
+}
+
+void XMLNode::AppendContent(wchar_t *append)
+{
+ if (append && *append)
+ {
+ if (content)
+ {
+ size_t len = wcslen(append), new_len = len + content_len;
+ wchar_t *new_content = (wchar_t *)realloc(content, (new_len+1)*sizeof(wchar_t));
+ if (new_content)
+ {
+ content = new_content;
+ wcsncpy(content+content_len, append, len);
+ *(content+content_len+len) = 0;
+ content_len = new_len;
+ }
+ else
+ {
+ new_content = (wchar_t *)malloc((new_len+1)*sizeof(wchar_t));
+ if (new_content)
+ {
+ memcpy(new_content, content, content_len*sizeof(wchar_t));
+ free(content);
+ content = new_content;
+
+ wcsncpy(content+content_len, append, len);
+ *(content+content_len+len) = 0;
+ content_len = new_len;
+ }
+ }
+ }
+ else
+ {
+ content_len = wcslen(append);
+ content = (wchar_t *)malloc((content_len+1)*sizeof(wchar_t));
+ if (content)
+ memcpy(content, append, (content_len+1)*sizeof(wchar_t));
+ }
+ }
+}
+
+// LEGACY implementaions!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+//void XMLNode::AddNode(const wchar_t *name, XMLNode *new_node)
+//{
+// // first, add entry in nodes map
+// NodeMap::MapPair &pair = nodes.getItem(name);
+// if (pair.first == name) // replace with a copy if we made a new entry
+// pair.first = _wcsdup(name);
+//
+// // make the node list if we need it
+// if (!pair.second)
+// pair.second = new NodeList;
+//
+// pair.second->push_back(new_node);
+//}
+void XMLNode::AddNode(const wchar_t* name, XMLNode* new_node)
+{
+ auto it = nodes.find(name);
+ if (nodes.end() == it)
+ {
+ nodes.insert({ _wcsdup(name), new NodeList() });
+ }
+ else
+ {
+ if (nullptr == it->second)
+ {
+ nodes[name] = new NodeList();
+ }
+ }
+
+ nodes[name]->push_back(new_node);
+}
+
+const wchar_t *XMLNode::GetContent() const
+{
+ return content;
+}
+
+const wchar_t *XMLNode::GetProperty(const wchar_t *prop) const
+{
+ for (PropMap::const_iterator mapItr = properties.begin(); mapItr != properties.end(); mapItr++)
+ {
+ if (CompareStuff(mapItr->first, prop) == 0)
+ {
+ return mapItr->second;
+ }
+ }
+ return 0;
+} \ No newline at end of file
diff --git a/Src/xml/XMLNode.h b/Src/xml/XMLNode.h
new file mode 100644
index 000000000..33779a745
--- /dev/null
+++ b/Src/xml/XMLNode.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include <windows.h>
+#include "../nu/Alias.h"
+#include <vector>
+#include <map>
+class MapUnicodeComp
+{
+public:
+
+ // CSTR_LESS_THAN 1 // string 1 less than string 2
+ // CSTR_EQUAL 2 // string 1 equal to string 2
+ // CSTR_GREATER_THAN 3 // string 1 greater than string 2
+ bool operator()(const wchar_t* str1, const wchar_t* str2) const
+ {
+ return (CompareStringW(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), 0, str1, -1, str2, -1)-2) == CSTR_LESS_THAN;
+ }
+};
+
+class XMLNode
+{
+public:
+ typedef std::map<const wchar_t *, wchar_t*, MapUnicodeComp> PropMap;
+ typedef std::vector<XMLNode*> NodeList;
+ typedef std::map<const wchar_t *, NodeList*, MapUnicodeComp> NodeMap;
+
+ XMLNode();
+ ~XMLNode();
+ const XMLNode *Get(const wchar_t *) const;
+ const NodeList *GetList(const wchar_t *) const;
+ const bool Present(const wchar_t *) const;
+ void SetProperty(const wchar_t *prop, const wchar_t *value);
+ const wchar_t *GetProperty(const wchar_t *prop) const;
+ const wchar_t *GetContent() const;
+ void SetContent_Own(wchar_t *new_content);
+ void AppendContent(wchar_t *append);
+ void AddNode(const wchar_t *name, XMLNode *new_node);
+ XMLNode *parent;
+
+private:
+ PropMap properties;
+ wchar_t *content;
+ size_t content_len; // number of characters in curtext, not including null terminator
+ NodeMap nodes;
+}; \ No newline at end of file
diff --git a/Src/xml/XMLParameters.cpp b/Src/xml/XMLParameters.cpp
new file mode 100644
index 000000000..487cea9a5
--- /dev/null
+++ b/Src/xml/XMLParameters.cpp
@@ -0,0 +1,131 @@
+#include "XMLParameters.h"
+#include <wchar.h>
+
+#ifdef __APPLE__
+#include <Carbon/Carbon.h>
+int _wcsicmp(const wchar_t *str1, const wchar_t *str2)
+{
+ CFStringRef cfstr1 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str1, wcslen(str1)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
+ CFStringRef cfstr2 = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)str2, wcslen(str2)*sizeof(wchar_t), kCFStringEncodingUTF32, false);
+ int result = CFStringCompare(cfstr1, cfstr2, kCFCompareCaseInsensitive);
+ CFRelease(cfstr1);
+ CFRelease(cfstr2);
+ return result;
+}
+#endif
+
+XMLParameters::XMLParameters(const wchar_t **_parameters)
+: parameters(_parameters), numParameters(0), numParametersCalculated(false)
+{
+}
+
+void XMLParameters::CountTo(int x)
+{
+ if (numParametersCalculated || x < numParameters)
+ return;
+
+ while (1)
+ {
+ if (parameters[numParameters*2] == 0)
+ {
+ numParametersCalculated=true;
+ return;
+ }
+ numParameters++;
+ if (numParameters == x)
+ return;
+ }
+}
+
+void XMLParameters::Count()
+{
+ if (numParametersCalculated)
+ return;
+
+ while (1)
+ {
+ if (parameters[numParameters*2] == 0)
+ {
+ numParametersCalculated=true;
+ return;
+ }
+ numParameters++;
+ }
+}
+
+const wchar_t *XMLParameters::GetItemName(int i)
+{
+ CountTo(i);
+ if (i < numParameters)
+ return parameters[i*2];
+ else
+ return 0;
+}
+
+const wchar_t *XMLParameters::GetItemValueIndex(int i)
+{
+ CountTo(i);
+ if (i < numParameters)
+ return parameters[i*2+1];
+ else
+ return 0;
+}
+
+int XMLParameters::GetNumItems()
+{
+ Count();
+ return numParameters;
+}
+
+const wchar_t *XMLParameters::GetItemValue(const wchar_t *name)
+{
+ int i=0;
+ while(1)
+ {
+ CountTo(i+1);
+ if (i<numParameters)
+ {
+ if (!_wcsicmp(name, parameters[i*2]))
+ return parameters[i*2+1];
+ }
+ else
+ return 0;
+ i++;
+ };
+}
+
+int XMLParameters::GetItemValueInt(const wchar_t *name, int def)
+{
+ const wchar_t *val = GetItemValue(name);
+ if (val && *val)
+ return wcstol(val, 0, 10);
+ else
+ return def;
+}
+
+const wchar_t *XMLParameters::EnumItemValues(const wchar_t *name, int nb)
+{
+ int i=0;
+ while(1)
+ {
+ CountTo(i+1);
+ if (i<numParameters)
+ {
+ if (!_wcsicmp(name, parameters[i*2]) && nb--)
+ return parameters[i*2+1];
+ }
+ else
+ return 0;
+ i++;
+ };
+}
+
+#define CBCLASS XMLParameters
+START_DISPATCH;
+CB(XMLREADERPARAMS_GETITEMNAME, GetItemName)
+CB(XMLREADERPARAMS_GETITEMVALUE, GetItemValueIndex)
+CB(XMLREADERPARAMS_GETITEMVALUE2, GetItemValue)
+CB(XMLREADERPARAMS_ENUMITEMVALUES, EnumItemValues)
+CB(XMLREADERPARAMS_GETNBITEMS, GetNumItems)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file
diff --git a/Src/xml/XMLParameters.h b/Src/xml/XMLParameters.h
new file mode 100644
index 000000000..c8d4141bd
--- /dev/null
+++ b/Src/xml/XMLParameters.h
@@ -0,0 +1,30 @@
+#ifndef NULLSOFT_XML_XMLPARAMETERS_H
+#define NULLSOFT_XML_XMLPARAMETERS_H
+
+#include "ifc_xmlreaderparams.h"
+
+class XMLParameters : public ifc_xmlreaderparams
+{
+public:
+ XMLParameters(const wchar_t **_parameters);
+
+ const wchar_t *GetItemName(int i);
+ const wchar_t *GetItemValueIndex(int i);
+ const wchar_t *GetItemValue(const wchar_t *name);
+ int GetItemValueInt(const wchar_t *name, int def = 0);
+ const wchar_t *EnumItemValues(const wchar_t *name, int nb);
+ int GetNumItems();
+
+private:
+ const wchar_t **parameters;
+ int numParameters;
+ bool numParametersCalculated;
+
+ void CountTo(int x);
+ void Count();
+
+protected:
+ RECVS_DISPATCH;
+};
+
+#endif \ No newline at end of file
diff --git a/Src/xml/XMLReader.cpp b/Src/xml/XMLReader.cpp
new file mode 100644
index 000000000..fadf6670d
--- /dev/null
+++ b/Src/xml/XMLReader.cpp
@@ -0,0 +1,382 @@
+#include "XMLReader.h"
+#include "ifc_xmlreadercallback.h"
+#include "XMLParameters.h"
+#include <memory.h>
+#include "../nu/regexp.h"
+#include "../nu/strsafe.h"
+#include <wctype.h>
+#include <vector>
+#include <atlconv.h>
+
+/* TODO:
+try to remove CharUpper (but towupper doesn't deal with non-english very well)
+*/
+
+#ifdef __APPLE__
+void CharUpper(wchar_t* src)
+{
+ while (src && *src)
+ {
+ *src = (wint_t)towupper(*src);
+ src++;
+ }
+}
+
+wchar_t* _wcsdup(const wchar_t* src)
+{
+ if (!src)
+ return 0;
+ size_t len = wcslen(src) + 1;
+ if (len) // check for integer wraparound
+ {
+ wchar_t* newstr = (wchar_t*)malloc(sizeof(wchar_t) * len);
+ wcscpy(newstr, src);
+ return newstr;
+ }
+ return 0;
+}
+#endif
+
+//---------------------------------------------------------------------------------------------------
+CallbackStruct::CallbackStruct(ifc_xmlreadercallback* _callback, const wchar_t* _match, bool doUpper)
+{
+ match = _wcsdup(_match);
+ if (doUpper)
+ CharUpper(match);
+ callback = _callback;
+}
+//------------------------------------------------------
+CallbackStruct::CallbackStruct()
+: callback(0), match(0)
+{
+}
+//-------------------------------
+CallbackStruct::~CallbackStruct()
+{
+ if (match)
+ {
+ free(match);
+ match = 0;
+ }
+}
+
+/* --- */
+
+void XMLCALL DStartTag(void* data, const XML_Char* name, const XML_Char** atts) { ((XMLReader*)data)->StartTag(name, atts); }
+void XMLCALL DEndTag(void* data, const XML_Char* name) { ((XMLReader*)data)->EndTag(name); }
+void XMLCALL DTextHandler(void* data, const XML_Char* s, int len) { ((XMLReader*)data)->TextHandler(s, len); }
+
+int XMLCALL UnknownEncoding(void* data, const XML_Char* name, XML_Encoding* info);
+
+//--------------------
+XMLReader::XMLReader()
+: parser(0)
+{
+ case_sensitive = false;
+}
+//---------------------
+XMLReader::~XMLReader()
+{
+ for (size_t i = 0; i != callbacks.size(); i++)
+ {
+ delete callbacks[i];
+ callbacks[i] = 0;
+ }
+}
+//----------------------------------------------------------------------------------------
+void XMLReader::RegisterCallback(const wchar_t* matchstr, ifc_xmlreadercallback* callback)
+{
+ callbacks.push_back(new CallbackStruct(callback, matchstr, !case_sensitive));
+}
+//-----------------------------------------------------------------
+void XMLReader::UnregisterCallback(ifc_xmlreadercallback* callback)
+{
+ for (size_t i = 0; i != callbacks.size(); i++)
+ {
+ if (callbacks[i] && callbacks[i]->callback == callback)
+ {
+ delete callbacks[i];
+ callbacks[i] = 0; // we set it to 0 so this can be called during a callback
+ }
+ }
+}
+//-------------------
+int XMLReader::Open()
+{
+ parser = XML_ParserCreate(0); // create the expat parser
+ if (!parser)
+ return OBJ_XML_FAILURE;
+
+ XML_SetUserData(parser, this); // give our object pointer as context
+ XML_SetElementHandler(parser, DStartTag, DEndTag); // set the tag callbacks
+ XML_SetCharacterDataHandler(parser, DTextHandler); // set the text callbacks
+ XML_SetUnknownEncodingHandler(parser, UnknownEncoding, 0); // setup the character set encoding stuff
+
+ return OBJ_XML_SUCCESS;
+}
+//----------------------------
+int XMLReader::OpenNamespace()
+{
+ parser = XML_ParserCreateNS(0, L'#'); // create the expat parser, using # to separate namespace URI from element name
+ if (!parser)
+ return OBJ_XML_FAILURE;
+
+ XML_SetUserData(parser, this); // give our object pointer as context
+ XML_SetElementHandler(parser, DStartTag, DEndTag); // set the tag callbacks
+ XML_SetCharacterDataHandler(parser, DTextHandler); // set the text callbacks
+ XML_SetUnknownEncodingHandler(parser, UnknownEncoding, 0); // setup the character set encoding stuff
+
+ return OBJ_XML_SUCCESS;
+}
+//--------------------------------------------------
+void XMLReader::OldFeed(void* data, size_t dataSize)
+{
+ Feed(data, dataSize);
+}
+//----------------------------------------------
+int XMLReader::Feed(void* data, size_t dataSize)
+{
+ XML_Status error;
+ if (data && dataSize)
+ {
+ while (dataSize >= 0x7FFFFFFFU) // handle really really big data sizes (hopefully this won't happen)
+ {
+ XML_Parse(parser, reinterpret_cast<const char*>(data), 0x7FFFFFFF, 0);
+ dataSize -= 0x7FFFFFFFU;
+ }
+ error = XML_Parse(parser, reinterpret_cast<const char*>(data), static_cast<int>(dataSize), 0);
+ }
+ else
+ error = XML_Parse(parser, 0, 0, 1); // passing this sequence tells expat that we're done
+
+ if (error == XML_STATUS_ERROR)
+ {
+ // TODO: set a flag to prevent further parsing until a Reset occurs
+ XML_Error errorCode = XML_GetErrorCode(parser);
+ int line = XML_GetCurrentLineNumber(parser);
+ // TODO: int column = XML_GetCurrentColumnNumber(parser);
+ wa::strings::wa_string szError(XML_ErrorString(errorCode));
+
+ for (CallbackStruct* l_callback : callbacks)
+ {
+ if (l_callback != NULL)
+ l_callback->callback->xmlReaderOnError(line, errorCode, szError.GetW().c_str());
+ }
+
+ return OBJ_XML_FAILURE;
+ }
+
+ return OBJ_XML_SUCCESS;
+}
+//---------------------
+void XMLReader::Close()
+{
+ if (parser)
+ XML_ParserFree(parser);
+ parser = 0;
+}
+//-----------------------------------
+const wchar_t* XMLReader::BuildPath()
+{
+ return pathString.c_str();
+}
+//----------------------------------------------------
+const wchar_t* XMLReader::AddPath(const wchar_t* node)
+{
+ currentNode.assign(node);
+
+ if (pathString.length())
+ {
+ pathString.append(L"\f");
+ }
+
+ pathString.append(node);
+
+ if (!case_sensitive)
+ {
+ std::transform(
+ pathString.begin(), pathString.end(),
+ pathString.begin(),
+ towupper);
+ }
+
+ return pathString.c_str();
+}
+//-------------------------------------------------
+const wchar_t* XMLReader::AddPath(const char* node)
+{
+ wa::strings::wa_string wszNode(node);
+ return AddPath(wszNode.GetW().c_str());
+}
+//-------------------------------------------------------
+const wchar_t* XMLReader::RemovePath(const wchar_t* node)
+{
+ size_t pathSize = pathString.length();
+ size_t removeLength = wcslen(node);
+ removeLength = pathSize > removeLength ? removeLength + 1 : removeLength;
+ pathString = pathString.substr(0, pathSize - removeLength);
+
+ if (pathString.length())
+ {
+ const wchar_t* last_node = wcsrchr(pathString.c_str(), '\f');
+ if (last_node)
+ {
+ currentNode.assign(last_node + 1);
+ }
+ else
+ {
+ currentNode.assign(pathString);
+ }
+ }
+ else
+ {
+ currentNode = L"";
+ }
+
+ return pathString.c_str();
+}
+//----------------------------------------------------
+const wchar_t* XMLReader::RemovePath(const char* node)
+{
+ wa::strings::wa_string wszNode(node);
+ return RemovePath(wszNode.GetW().c_str());
+}
+//-------------------------------------------------------------------------
+void XMLCALL XMLReader::StartTag(const wchar_t* name, const wchar_t** atts)
+{
+ const wchar_t* xmlpath = AddPath(name);
+
+ XMLParameters xmlParameters(atts);
+ for (size_t i = 0; i != callbacks.size(); i++)
+ {
+ if (callbacks[i] && Match(callbacks[i]->match, xmlpath))
+ callbacks[i]->callback->xmlReaderOnStartElementCallback(xmlpath, name, static_cast<ifc_xmlreaderparams*>(&xmlParameters));
+ }
+}
+//-------------------------------------------------------------------
+void XMLCALL XMLReader::StartTag(const char* name, const char** atts)
+{
+ wa::strings::wa_string wszName(name);
+ size_t nAttrCount = 0;
+ const char** a = atts;
+
+ while (*a)
+ {
+ nAttrCount++;
+ a++;
+ }
+ wchar_t** wszAtts = new wchar_t* [nAttrCount + 1];
+
+ if (nAttrCount)
+ {
+ size_t n = 0;
+ while (*atts)
+ {
+ const char* pszAttr = *atts;
+ size_t nAttrLen = strlen(pszAttr);
+ wchar_t* wc = new wchar_t[nAttrLen + 1];
+ mbstowcs_s(NULL, wc, nAttrLen + 1, pszAttr, nAttrLen);
+ wszAtts[n++] = wc;
+ atts++;
+ }
+
+ }
+ wszAtts[nAttrCount] = 0;
+
+ StartTag(wszName.GetW().c_str(), const_cast<const wchar_t**>(wszAtts));
+}
+//-------------------------------------------------
+void XMLCALL XMLReader::EndTag(const wchar_t* name)
+{
+ endPathString = BuildPath();
+
+ RemovePath(name);
+
+ for (size_t i = 0; i != callbacks.size(); i++)
+ {
+ if (callbacks[i] && Match(callbacks[i]->match, endPathString.c_str()))
+ callbacks[i]->callback->xmlReaderOnEndElementCallback(endPathString.c_str(), name);
+ }
+}
+//----------------------------------------------
+void XMLCALL XMLReader::EndTag(const char* name)
+{
+ wa::strings::wa_string wszName(name);
+ return EndTag(wszName.GetW().c_str());
+}
+//------------------------------------------------------------
+void XMLCALL XMLReader::TextHandler(const wchar_t* s, int len)
+{
+ if (len)
+ {
+ textCache.assign(s, len);
+
+ const wchar_t* xmlpath = BuildPath();
+
+ for (size_t i = 0; i != callbacks.size(); i++)
+ {
+ if (callbacks[i] && Match(callbacks[i]->match, xmlpath))
+ callbacks[i]->callback->xmlReaderOnCharacterDataCallback(xmlpath, currentNode.c_str(), textCache.c_str());
+ }
+ }
+}
+//---------------------------------------------------------
+void XMLCALL XMLReader::TextHandler(const char* s, int len)
+{
+ wa::strings::wa_string wszText(s);
+ return TextHandler(wszText.GetW().c_str(), len);
+}
+//---------------------------
+void XMLReader::PushContext()
+{
+ context.push_back(parser);
+ parser = XML_ExternalEntityParserCreate(parser, L"\0", NULL);
+}
+//--------------------------
+void XMLReader::PopContext()
+{
+ if (parser)
+ XML_ParserFree(parser);
+ parser = context.back();
+ context.pop_back();
+}
+//---------------------
+void XMLReader::Reset()
+{
+ if (parser)
+ {
+ XML_ParserReset(parser, 0);
+ XML_SetUserData(parser, this); // give our object pointer as context
+ XML_SetElementHandler(parser, DStartTag, DEndTag); // set the tag callbacks
+ XML_SetCharacterDataHandler(parser, DTextHandler); // set the text callbacks
+ }
+}
+//--------------------------------------------------
+void XMLReader::SetEncoding(const wchar_t* encoding)
+{
+ wa::strings::wa_string szEncoding(encoding);
+ XML_SetEncoding(parser, szEncoding.GetW().c_str());
+}
+//-------------------------------
+int XMLReader::SetCaseSensitive()
+{
+ case_sensitive = true;
+ return OBJ_XML_SUCCESS;
+}
+
+#define CBCLASS XMLReader
+START_DISPATCH;
+VCB(OBJ_XML_REGISTERCALLBACK, RegisterCallback)
+VCB(OBJ_XML_UNREGISTERCALLBACK, UnregisterCallback)
+CB(OBJ_XML_OPEN, Open)
+CB(OBJ_XML_OPEN2, OpenNamespace)
+VCB(OBJ_XML_OLDFEED, OldFeed)
+CB(OBJ_XML_FEED, Feed)
+VCB(OBJ_XML_CLOSE, Close)
+VCB(OBJ_XML_INTERRUPT, PushContext)
+VCB(OBJ_XML_RESUME, PopContext)
+VCB(OBJ_XML_RESET, Reset)
+VCB(OBJ_XML_SETENCODING, SetEncoding)
+CB(OBJ_XML_SETCASESENSITIVE, SetCaseSensitive)
+END_DISPATCH;
+#undef CBCLASS
diff --git a/Src/xml/XMLReader.h b/Src/xml/XMLReader.h
new file mode 100644
index 000000000..7bb9109fc
--- /dev/null
+++ b/Src/xml/XMLReader.h
@@ -0,0 +1,66 @@
+#ifndef NULLSOFT_XML_XMLREADER_H
+#define NULLSOFT_XML_XMLREADER_H
+
+#include "obj_xml.h"
+#include <vector>
+#include "expat.h"
+#include "../WAT/WAT.h"
+
+struct CallbackStruct
+{
+ CallbackStruct(ifc_xmlreadercallback* _callback, const wchar_t* _match, bool doUpper);
+ CallbackStruct();
+ ~CallbackStruct();
+ ifc_xmlreadercallback* callback;
+ wchar_t* match;
+};
+
+class XMLReader : public obj_xml
+{
+public:
+ XMLReader();
+ ~XMLReader();
+ void RegisterCallback(const wchar_t* matchstr, ifc_xmlreadercallback* callback);
+ void UnregisterCallback(ifc_xmlreadercallback* callback);
+ int Open();
+ int OpenNamespace();
+ void OldFeed(void* data, size_t dataSize);
+ int Feed(void* data, size_t dataSize);
+ void Close();
+ void PushContext();
+ void PopContext();
+ void Reset();
+ void SetEncoding(const wchar_t* encoding);
+ int SetCaseSensitive();
+
+protected:
+ RECVS_DISPATCH;
+
+public:
+ void XMLCALL StartTag(const wchar_t* name, const wchar_t** atts);
+ void XMLCALL EndTag(const wchar_t* name);
+ void XMLCALL TextHandler(const wchar_t* s, int len);
+
+ void XMLCALL StartTag(const char* name, const char** atts);
+ void XMLCALL EndTag(const char* name);
+ void XMLCALL TextHandler(const char* s, int len);
+
+private:
+ const wchar_t* BuildPath();
+ const wchar_t* AddPath(const wchar_t* node);
+ const wchar_t* AddPath(const char* node);
+ const wchar_t* RemovePath(const wchar_t* node);
+ const wchar_t* RemovePath(const char* node);
+ std::wstring pathString;//, pathUpper;
+ std::wstring endPathString;//, endPathUpper;
+ std::wstring currentNode;
+
+private:
+ std::vector<CallbackStruct*> callbacks;
+ std::vector<XML_Parser> context;
+ XML_Parser parser;
+ bool case_sensitive;
+ std::wstring textCache;
+
+};
+#endif \ No newline at end of file
diff --git a/Src/xml/api__xml.h b/Src/xml/api__xml.h
new file mode 100644
index 000000000..911fb48ec
--- /dev/null
+++ b/Src/xml/api__xml.h
@@ -0,0 +1,6 @@
+#ifndef NULLSOFT_XML_AP_IH
+#define NULLSOFT_XML_AP_IH
+
+#include <api/service/api_service.h>
+
+#endif // !NULLSOFT_XML_AP_IH \ No newline at end of file
diff --git a/Src/xml/encodings_c.cpp b/Src/xml/encodings_c.cpp
new file mode 100644
index 000000000..caf0ed195
--- /dev/null
+++ b/Src/xml/encodings_c.cpp
@@ -0,0 +1,90 @@
+#include "expat/expat.h"
+#include <CoreFoundation/CoreFoundation.h>
+#include <wchar.h>
+// TODO: make this work
+
+struct AppleEncodings
+{
+ const wchar_t *name;
+ CFStringEncoding codePage;
+};
+
+static const AppleEncodings encodings[] =
+{
+ {L"iso-8859-2", kCFStringEncodingISOLatin2},
+ {L"iso-8859-3", kCFStringEncodingISOLatin3},
+ {L"iso-8859-4", kCFStringEncodingISOLatin4},
+ {L"iso-8859-5", kCFStringEncodingISOLatinCyrillic},
+ {L"iso-8859-6", kCFStringEncodingISOLatinArabic},
+ {L"iso-8859-7", kCFStringEncodingISOLatinGreek},
+ {L"iso-8859-8", kCFStringEncodingISOLatinHebrew},
+ {L"iso-8859-9", kCFStringEncodingISOLatin5},
+ {L"iso-8859-10", kCFStringEncodingISOLatin6},
+ {L"iso-8859-11", kCFStringEncodingISOLatinThai},
+ {L"iso-8859-13", kCFStringEncodingISOLatin7},
+ {L"iso-8859-14", kCFStringEncodingISOLatin8},
+ {L"iso-8859-15", kCFStringEncodingISOLatin9},
+ {L"windows-1251", kCFStringEncodingWindowsCyrillic},
+ {L"windows-1252", kCFStringEncodingWindowsLatin1},
+ {L"windows-1253", kCFStringEncodingWindowsGreek},
+ {L"windows-1254", kCFStringEncodingWindowsLatin5},
+ {L"windows-1255", kCFStringEncodingWindowsHebrew},
+ {L"windows-1256", kCFStringEncodingWindowsArabic},
+ {L"windows-1257", kCFStringEncodingWindowsBalticRim},
+ {L"windows-1258", kCFStringEncodingWindowsVietnamese},
+
+};
+
+static void MakeMap(int *map, CFStringEncoding encoding)
+{
+ unsigned char i=0;
+ unsigned char mb[2] = {0,0};
+ do
+ {
+ mb[0]=i;
+ // if (IsDBLeadByteEx(codepage, i)) map[i]=-2; else {
+ CFStringRef cfstr = CFStringCreateWithBytes(kCFAllocatorDefault, (UInt8 *)mb, 1, encoding, false);
+ if (!cfstr || CFStringGetBytes(cfstr, CFRangeMake(0,1), kCFStringEncodingUTF32, 0, false, (UInt8 *)(map+i), sizeof(*map), 0))
+ {
+ map[i]=-1;
+ }
+ // }
+ } while (i++ != 255);
+}
+
+static bool wcsmatch(const wchar_t *a, const wchar_t *b)
+{
+ if (!a || !b)
+ return false; // wtf
+
+ while (*a || *b)
+ {
+ if (!*a)
+ return false;
+ if (!*b)
+ return false;
+
+ if (towlower(*a) != towlower(*b))
+ return false;
+ a++;
+ b++;
+ }
+
+ return true;
+}
+#define NUM_ENCODINGS (sizeof(encodings)/sizeof(AppleEncodings))
+int XMLCALL UnknownEncoding(void *data, const XML_Char *name, XML_Encoding *info)
+{
+ for (int i=0;i<NUM_ENCODINGS;i++)
+ {
+ if (!wcsmatch(name, encodings[i].name))
+ {
+ MakeMap(info->map, encodings[i].codePage);
+ info->data = 0;
+ info->convert = 0;
+ info->release = 0;
+ return XML_STATUS_OK;
+ }
+ }
+ return XML_STATUS_ERROR;
+}
diff --git a/Src/xml/factory_xml.cpp b/Src/xml/factory_xml.cpp
new file mode 100644
index 000000000..1e653320c
--- /dev/null
+++ b/Src/xml/factory_xml.cpp
@@ -0,0 +1,68 @@
+#include "api__xml.h"
+#include "factory_xml.h"
+#include "XMLReader.h"
+
+static const char serviceName[] = "XML Parser";
+
+FOURCC XMLFactory::GetServiceType()
+{
+ return WaSvc::OBJECT;
+}
+
+const char *XMLFactory::GetServiceName()
+{
+ return serviceName;
+}
+
+GUID XMLFactory::GetGUID()
+{
+ return obj_xmlGUID;
+}
+
+void *XMLFactory::GetInterface(int global_lock)
+{
+ obj_xml *ifc=new XMLReader;
+// if (global_lock)
+// WASABI_API_SVC->service_lock(this, (void *)ifc);
+ return ifc;
+}
+
+int XMLFactory::SupportNonLockingInterface()
+{
+ return 1;
+}
+
+int XMLFactory::ReleaseInterface(void *ifc)
+{
+ //WASABI_API_SVC->service_unlock(ifc);
+ obj_xml *xml = static_cast<obj_xml *>(ifc);
+ XMLReader *xmlreader = static_cast<XMLReader *>(xml);
+ delete xmlreader;
+ return 1;
+}
+
+const char *XMLFactory::GetTestString()
+{
+ return 0;
+}
+
+int XMLFactory::ServiceNotify(int msg, int param1, int param2)
+{
+ return 1;
+}
+
+#ifdef CBCLASS
+#undef CBCLASS
+#endif
+
+#define CBCLASS XMLFactory
+START_DISPATCH;
+CB(WASERVICEFACTORY_GETSERVICETYPE, GetServiceType)
+CB(WASERVICEFACTORY_GETSERVICENAME, GetServiceName)
+CB(WASERVICEFACTORY_GETGUID, GetGUID)
+CB(WASERVICEFACTORY_GETINTERFACE, GetInterface)
+CB(WASERVICEFACTORY_SUPPORTNONLOCKINGGETINTERFACE, SupportNonLockingInterface)
+CB(WASERVICEFACTORY_RELEASEINTERFACE, ReleaseInterface)
+CB(WASERVICEFACTORY_GETTESTSTRING, GetTestString)
+CB(WASERVICEFACTORY_SERVICENOTIFY, ServiceNotify)
+END_DISPATCH;
diff --git a/Src/xml/factory_xml.h b/Src/xml/factory_xml.h
new file mode 100644
index 000000000..760e8623e
--- /dev/null
+++ b/Src/xml/factory_xml.h
@@ -0,0 +1,25 @@
+#ifndef NULLSOFT_FACTORY_XML_H
+#define NULLSOFT_FACTORY_XML_H
+
+#include "api__xml.h"
+#include <api/service/waservicefactory.h>
+#include <api/service/services.h>
+
+class XMLFactory : public waServiceFactory
+{
+public:
+ FOURCC GetServiceType();
+ const char *GetServiceName();
+ GUID GetGUID();
+ void *GetInterface(int global_lock);
+ int SupportNonLockingInterface();
+ int ReleaseInterface(void *ifc);
+ const char *GetTestString();
+ int ServiceNotify(int msg, int param1, int param2);
+
+protected:
+ RECVS_DISPATCH;
+};
+
+
+#endif \ No newline at end of file
diff --git a/Src/xml/ifc_xmlreadercallback.cpp b/Src/xml/ifc_xmlreadercallback.cpp
new file mode 100644
index 000000000..439805da2
--- /dev/null
+++ b/Src/xml/ifc_xmlreadercallback.cpp
@@ -0,0 +1 @@
+#include "ifc_xmlreadercallback.h" \ No newline at end of file
diff --git a/Src/xml/ifc_xmlreadercallback.h b/Src/xml/ifc_xmlreadercallback.h
new file mode 100644
index 000000000..e13fbdd95
--- /dev/null
+++ b/Src/xml/ifc_xmlreadercallback.h
@@ -0,0 +1,48 @@
+#ifndef NULLSOFT_XML_IFC_XMLREADERCALLBACK_H
+#define NULLSOFT_XML_IFC_XMLREADERCALLBACK_H
+
+#include <bfc/dispatch.h>
+#include "ifc_xmlreaderparams.h"
+
+class NOVTABLE ifc_xmlreadercallback : public Dispatchable
+{
+protected:
+ ifc_xmlreadercallback() {}
+ ~ifc_xmlreadercallback() {}
+
+public:
+ void xmlReaderOnStartElementCallback( const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params );
+ void xmlReaderOnEndElementCallback( const wchar_t *xmlpath, const wchar_t *xmltag );
+ void xmlReaderOnCharacterDataCallback( const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str );
+ void xmlReaderOnError( int linenum, int errcode, const wchar_t *errstr );
+
+ DISPATCH_CODES
+ {
+ ONSTARTELEMENT = 100,
+ ONENDELEMENT = 200,
+ ONCHARDATA = 300,
+ ONERROR = 1200,
+ };
+};
+
+inline void ifc_xmlreadercallback::xmlReaderOnStartElementCallback( const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params )
+{
+ _voidcall( ONSTARTELEMENT, xmlpath, xmltag, params );
+}
+
+inline void ifc_xmlreadercallback::xmlReaderOnEndElementCallback( const wchar_t *xmlpath, const wchar_t *xmltag )
+{
+ _voidcall( ONENDELEMENT, xmlpath, xmltag );
+}
+
+inline void ifc_xmlreadercallback::xmlReaderOnCharacterDataCallback( const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str )
+{
+ _voidcall( ONCHARDATA, xmlpath, xmltag, str );
+}
+
+inline void ifc_xmlreadercallback::xmlReaderOnError( int linenum, int errcode, const wchar_t *errstr )
+{
+ _voidcall( ONERROR, linenum, errcode, errstr );
+}
+
+#endif
diff --git a/Src/xml/ifc_xmlreadercallbackT.h b/Src/xml/ifc_xmlreadercallbackT.h
new file mode 100644
index 000000000..82faf4ac7
--- /dev/null
+++ b/Src/xml/ifc_xmlreadercallbackT.h
@@ -0,0 +1,27 @@
+#pragma once
+#include "ifc_xmlreadercallback.h"
+
+template <class T>
+class ifc_xmlreadercallbackT : public ifc_xmlreadercallback
+{
+protected:
+ ifc_xmlreadercallbackT() {}
+ ~ifc_xmlreadercallbackT() {}
+
+public:
+ virtual void xmlReaderOnStartElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params){}
+ virtual void xmlReaderOnEndElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag){}
+ virtual void xmlReaderOnCharacterDataCallback(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str){}
+ virtual void xmlReaderOnError( int linenum, int errcode, const wchar_t *errstr) {}
+
+#define CBCLASS T
+#define CBCLASST ifc_xmlreadercallbackT<T>
+ START_DISPATCH_INLINE;
+ VCBT(ONSTARTELEMENT, xmlReaderOnStartElementCallback);
+ VCBT(ONENDELEMENT, xmlReaderOnEndElementCallback);
+ VCBT(ONCHARDATA, xmlReaderOnCharacterDataCallback);
+ VCBT(ONERROR, xmlReaderOnError);
+ END_DISPATCH;
+#undef CBCLASS
+#undef CBCLASST
+};
diff --git a/Src/xml/ifc_xmlreadercallbacki.h b/Src/xml/ifc_xmlreadercallbacki.h
new file mode 100644
index 000000000..3c5bcc3a1
--- /dev/null
+++ b/Src/xml/ifc_xmlreadercallbacki.h
@@ -0,0 +1,39 @@
+#ifndef __WASABI_API_XMLREADERCALLBACKI_H
+#define __WASABI_API_XMLREADERCALLBACKI_H
+
+#include "ifc_xmlreadercallback.h"
+
+class ifc_xmlreadercallbackI : public ifc_xmlreadercallback
+{
+protected:
+ ifc_xmlreadercallbackI() {}
+ ~ifc_xmlreadercallbackI() {}
+
+public:
+ virtual void xmlReaderOnStartElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params){}
+ virtual void xmlReaderOnEndElementCallback(const wchar_t *xmlpath, const wchar_t *xmltag){}
+ virtual void xmlReaderOnCharacterDataCallback(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str){}
+ virtual void xmlReaderOnError( int linenum, int errcode, const wchar_t *errstr) {}
+ /*
+ const wchar_t *xmlGetFileName();
+ int xmlGetFileLine();
+ void *xmlGetParserHandle();
+ */
+ #undef CBCLASS
+#define CBCLASS ifc_xmlreadercallbackI
+ START_DISPATCH_INLINE;
+ VCB(ONSTARTELEMENT, xmlReaderOnStartElementCallback);
+ VCB(ONENDELEMENT, xmlReaderOnEndElementCallback);
+ VCB(ONCHARDATA, xmlReaderOnCharacterDataCallback);
+ VCB(ONERROR, xmlReaderOnError);
+ /*
+ CB(GETFILENAME, xmlGetFileName);
+ CB(GETFILELINE, xmlGetFileLine);
+ CB(GETHANDLE, xmlGetParserHandle);
+ */
+ END_DISPATCH;
+#undef CBCLASS
+};
+
+
+#endif
diff --git a/Src/xml/ifc_xmlreaderparams.cpp b/Src/xml/ifc_xmlreaderparams.cpp
new file mode 100644
index 000000000..5b7ae488e
--- /dev/null
+++ b/Src/xml/ifc_xmlreaderparams.cpp
@@ -0,0 +1 @@
+#include "ifc_xmlreaderparams.h" \ No newline at end of file
diff --git a/Src/xml/ifc_xmlreaderparams.h b/Src/xml/ifc_xmlreaderparams.h
new file mode 100644
index 000000000..cb10434d2
--- /dev/null
+++ b/Src/xml/ifc_xmlreaderparams.h
@@ -0,0 +1,65 @@
+#ifndef NULLSOFT_XML_IFC_XMLREADERPARAMS_H
+#define NULLSOFT_XML_IFC_XMLREADERPARAMS_H
+
+#include <bfc/dispatch.h>
+#include <bfc/platform/types.h>
+// ----------------------------------------------------------------------------
+
+class NOVTABLE ifc_xmlreaderparams : public Dispatchable
+{
+ protected:
+ ifc_xmlreaderparams() {}
+ virtual ~ifc_xmlreaderparams() {}
+ public:
+ const wchar_t *getItemName(size_t i);
+ const wchar_t *getItemValue(size_t i);
+ const wchar_t *getItemValue(const wchar_t *name);
+ const wchar_t *enumItemValues(const wchar_t *name, size_t nb);
+ int getItemValueInt(const wchar_t *name, int def = 0);
+ size_t getNbItems();
+
+ protected:
+ DISPATCH_CODES
+ {
+ XMLREADERPARAMS_GETITEMNAME = 100,
+ XMLREADERPARAMS_GETITEMVALUE = 200,
+ XMLREADERPARAMS_GETITEMVALUE2 = 201,
+ XMLREADERPARAMS_ENUMITEMVALUES = 202,
+ XMLREADERPARAMS_GETITEMVALUEINT = 300,
+ XMLREADERPARAMS_GETNBITEMS = 400,
+ };
+};
+
+// ----------------------------------------------------------------------------
+
+inline const wchar_t *ifc_xmlreaderparams::getItemName(size_t i)
+{
+ return _call(XMLREADERPARAMS_GETITEMNAME, (const wchar_t *)0, i);
+}
+
+inline const wchar_t *ifc_xmlreaderparams::getItemValue(size_t i)
+{
+ return _call(XMLREADERPARAMS_GETITEMVALUE, (const wchar_t *)0, i);
+}
+
+inline const wchar_t *ifc_xmlreaderparams::getItemValue(const wchar_t *name)
+{
+ return _call(XMLREADERPARAMS_GETITEMVALUE2, (const wchar_t *)0, name);
+}
+
+inline const wchar_t *ifc_xmlreaderparams::enumItemValues(const wchar_t *name, size_t nb)
+{
+ return _call(XMLREADERPARAMS_ENUMITEMVALUES, (const wchar_t *)0, name, nb);
+ }
+
+inline int ifc_xmlreaderparams::getItemValueInt(const wchar_t *name, int def)
+{
+ return _call(XMLREADERPARAMS_GETITEMVALUEINT, (int)0, name, def);
+}
+
+inline size_t ifc_xmlreaderparams::getNbItems()
+{
+ return _call(XMLREADERPARAMS_GETNBITEMS, (size_t)0);
+}
+
+#endif \ No newline at end of file
diff --git a/Src/xml/main.cpp b/Src/xml/main.cpp
new file mode 100644
index 000000000..d3106eeb8
--- /dev/null
+++ b/Src/xml/main.cpp
@@ -0,0 +1,49 @@
+#include "api__xml.h"
+#include "wa5_xml.h"
+#include "factory_xml.h"
+#include <bfc/platform/export.h>
+
+#ifndef _DEBUG
+BOOL WINAPI _DllMainCRTStartup(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
+{
+ DisableThreadLibraryCalls(hInst);
+ return TRUE;
+}
+#endif
+
+WA5_XML wa5_xml;
+XMLFactory *xmlFactory=0;
+
+api_service *WASABI_API_SVC = 0;
+
+void WA5_XML::RegisterServices(api_service *service)
+{
+ xmlFactory = new XMLFactory;
+ WASABI_API_SVC = service;
+ WASABI_API_SVC->service_register(xmlFactory);
+}
+
+int WA5_XML::RegisterServicesSafeModeOk()
+{
+ return 1;
+}
+
+void WA5_XML::DeregisterServices(api_service *service)
+{
+ service->service_deregister(xmlFactory);
+ delete xmlFactory;
+ xmlFactory=0;
+}
+
+extern "C" DLLEXPORT ifc_wa5component *GetWinamp5SystemComponent()
+{
+ return &wa5_xml;
+}
+
+#define CBCLASS WA5_XML
+START_DISPATCH;
+VCB(API_WA5COMPONENT_REGISTERSERVICES, RegisterServices)
+CB(15, RegisterServicesSafeModeOk)
+VCB(API_WA5COMPONENT_DEREEGISTERSERVICES, DeregisterServices)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file
diff --git a/Src/xml/obj_xml.h b/Src/xml/obj_xml.h
new file mode 100644
index 000000000..73c78085e
--- /dev/null
+++ b/Src/xml/obj_xml.h
@@ -0,0 +1,124 @@
+#ifndef NULLSOFT_XML_OBJ_XML_H
+#define NULLSOFT_XML_OBJ_XML_H
+
+#include <bfc/dispatch.h>
+#include <bfc/platform/types.h>
+
+class ifc_xmlreadercallback;
+
+enum
+{
+OBJ_XML_SUCCESS=0,
+OBJ_XML_FAILURE=1,
+OBJ_XML_NOTIMPLEMENTED=2,
+
+/* these two are for backwards compatability. we'll get rid of them eventually so don't use these values */
+API_XML_SUCCESS=0,
+API_XML_FAILURE=1,
+};
+class NOVTABLE obj_xml : public Dispatchable
+{
+public:
+ void xmlreader_registerCallback(const wchar_t *matchstr, ifc_xmlreadercallback *callback);
+ void xmlreader_unregisterCallback(ifc_xmlreadercallback *callback);
+ int xmlreader_open();
+ int xmlreader_open_namespace();
+ void xmlreader_oldfeed(const void *data, size_t dataSize); // no error return value, for backwards compat
+ int xmlreader_feed(const void *data, size_t dataSize); // call with 0, 0 to flush fed data. use at the end of a file
+ void xmlreader_close();
+ void xmlreader_interrupt(); // causes parsing of the already-fed data to stop, and picks up with any new data you feed
+ void xmlreader_resume(); // call resume when you're ready to go back to the already-fed data
+ void xmlreader_reset(); // call to allow an existing obj_xml object to parse a new file. keeps your existing callbacks
+ void xmlreader_setEncoding(const wchar_t *encoding); // call to manually set encoding (maybe from HTTP headers)
+
+ /** by default, callback matches are not case sensitive.
+ ** also, the xmlpath value sent to callbacks is convertered to UPPERCASE
+ ** although this behaviour might not make sense, it is the default for compatability reasons.
+ ** call this function to make matches case sensitive and to make the object pass you the xmlpath "as-is"
+ **/
+ int xmlreader_setCaseSensitive(); // makes the callback matching case sensitive. call this before registering callbacks.
+ DISPATCH_CODES
+ {
+ OBJ_XML_REGISTERCALLBACK = 0,
+ OBJ_XML_UNREGISTERCALLBACK = 10,
+ OBJ_XML_OPEN = 20,
+ OBJ_XML_OPEN2 = 21,
+ OBJ_XML_OLDFEED =30,
+ OBJ_XML_FEED = 31,
+ OBJ_XML_CLOSE = 40,
+ // OBJ_XML_CLONE = 50,
+ OBJ_XML_INTERRUPT = 60,
+ OBJ_XML_RESUME = 70,
+ OBJ_XML_RESET = 80,
+ OBJ_XML_SETENCODING = 90,
+ OBJ_XML_SETCASESENSITIVE=100,
+ };
+};
+
+inline void obj_xml::xmlreader_registerCallback(const wchar_t *matchstr, ifc_xmlreadercallback *callback)
+{
+ _voidcall(OBJ_XML_REGISTERCALLBACK, matchstr, callback);
+}
+
+inline void obj_xml::xmlreader_unregisterCallback(ifc_xmlreadercallback *callback)
+{
+ _voidcall(OBJ_XML_UNREGISTERCALLBACK, callback);
+}
+
+inline int obj_xml::xmlreader_open()
+{
+ return _call(OBJ_XML_OPEN, (int)OBJ_XML_FAILURE);
+}
+
+inline int obj_xml::xmlreader_open_namespace()
+{
+ return _call(OBJ_XML_OPEN2, (int)OBJ_XML_FAILURE);
+}
+
+inline void obj_xml::xmlreader_oldfeed(const void *data, size_t dataSize)
+{
+ _voidcall(OBJ_XML_OLDFEED, data, dataSize);
+}
+
+inline int obj_xml::xmlreader_feed(const void *data, size_t dataSize)
+{
+ return _call(OBJ_XML_FEED, (int)OBJ_XML_FAILURE, data, dataSize);
+}
+
+inline void obj_xml::xmlreader_close()
+{
+ _voidcall(OBJ_XML_CLOSE);
+}
+
+inline void obj_xml::xmlreader_interrupt()
+{
+ _voidcall(OBJ_XML_INTERRUPT);
+}
+
+inline void obj_xml::xmlreader_resume()
+{
+ _voidcall(OBJ_XML_RESUME);
+}
+
+inline void obj_xml::xmlreader_reset()
+{
+ _voidcall(OBJ_XML_RESET);
+}
+
+inline void obj_xml::xmlreader_setEncoding(const wchar_t *encoding)
+{
+ _voidcall(OBJ_XML_SETENCODING, encoding);
+}
+
+inline int obj_xml::xmlreader_setCaseSensitive()
+{
+ return _call(OBJ_XML_SETCASESENSITIVE, (int)OBJ_XML_NOTIMPLEMENTED);
+}
+
+// {3DB2A390-BE91-41f3-BEC6-B736EC7792CA}
+static const GUID obj_xmlGUID =
+{ 0x3db2a390, 0xbe91, 0x41f3, { 0xbe, 0xc6, 0xb7, 0x36, 0xec, 0x77, 0x92, 0xca } };
+
+extern obj_xml *xmlApi;
+
+#endif
diff --git a/Src/xml/resource.h b/Src/xml/resource.h
new file mode 100644
index 000000000..a99a7b13d
--- /dev/null
+++ b/Src/xml/resource.h
@@ -0,0 +1,14 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by xml.rc
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 101
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/Src/xml/version.rc2 b/Src/xml/version.rc2
new file mode 100644
index 000000000..ee12bf4b2
--- /dev/null
+++ b/Src/xml/version.rc2
@@ -0,0 +1,39 @@
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+#include "../Winamp/buildType.h"
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION WINAMP_PRODUCTVER
+ PRODUCTVERSION WINAMP_PRODUCTVER
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", "Winamp SA"
+ VALUE "FileDescription", "Winamp 5.x System Component"
+ VALUE "FileVersion", STR_WINAMP_PRODUCTVER
+ VALUE "InternalName", "xml.w5s"
+ VALUE "LegalCopyright", "Copyright © 2005-2023 Winamp SA"
+ VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA"
+ VALUE "OriginalFilename", "xml.w5s"
+ VALUE "ProductName", "Winamp XML Service"
+ VALUE "ProductVersion", STR_WINAMP_PRODUCTVER
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/Src/xml/wa5_xml.h b/Src/xml/wa5_xml.h
new file mode 100644
index 000000000..f2e2b00f9
--- /dev/null
+++ b/Src/xml/wa5_xml.h
@@ -0,0 +1,15 @@
+#ifndef __WASABI_WA5_XML_H
+#define __WASABI_WA5_XML_H
+
+#include "../Agave/Component/ifc_wa5component.h"
+
+class WA5_XML : public ifc_wa5component
+{
+public:
+ void RegisterServices(api_service *service);
+ int RegisterServicesSafeModeOk();
+ void DeregisterServices(api_service *service);
+protected:
+ RECVS_DISPATCH;
+};
+#endif \ No newline at end of file
diff --git a/Src/xml/xml.rc b/Src/xml/xml.rc
new file mode 100644
index 000000000..fcff77115
--- /dev/null
+++ b/Src/xml/xml.rc
@@ -0,0 +1,76 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.K.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "#include ""version.rc2""\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // English (U.K.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#include "version.rc2"
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/Src/xml/xml.vcxproj b/Src/xml/xml.vcxproj
new file mode 100644
index 000000000..50b25b80b
--- /dev/null
+++ b/Src/xml/xml.vcxproj
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{4FA2D01A-8932-45BA-9C54-E8247DD2CCAB}</ProjectGuid>
+ <RootNamespace>xml</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <TargetExt>.w5s</TargetExt>
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <TargetExt>.w5s</TargetExt>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <TargetExt>.w5s</TargetExt>
+ <IncludePath>$(IncludePath)</IncludePath>
+ <LibraryPath>$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
+ <IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
+ <TargetExt>.w5s</TargetExt>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg">
+ <VcpkgEnabled>true</VcpkgEnabled>
+ <VcpkgManifestInstall>true</VcpkgManifestInstall>
+ <VcpkgAutoLink>true</VcpkgAutoLink>
+ <VcpkgEnableManifest>false</VcpkgEnableManifest>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <VcpkgUseStatic>false</VcpkgUseStatic>
+ <VcpkgInstalledDir>
+ </VcpkgInstalledDir>
+ <VcpkgConfiguration>Debug</VcpkgConfiguration>
+ <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <VcpkgUseStatic>false</VcpkgUseStatic>
+ <VcpkgInstalledDir>
+ </VcpkgInstalledDir>
+ <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <VcpkgUseStatic>false</VcpkgUseStatic>
+ <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
+ </PropertyGroup>
+ <PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
+ <VcpkgConfiguration>Debug</VcpkgConfiguration>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;XML_EXPORTS;XML_STATIC;XML_NS;XML_UNICODE_WCHAR_T;_WIN32_WINNT=0x0601;WINVER=0x0601;_WIN32_IE=0x0A00;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>false</MinimalRebuild>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(ProjectDir)x86_Debug\$(ProjectName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\
+xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;XML_EXPORTS;XML_STATIC;XML_NS;XML_UNICODE_WCHAR_T;_WIN32_WINNT=0x0601;WINVER=0x0601;_WIN32_IE=0x0A00;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>false</MinimalRebuild>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(ProjectDir)x64_Debug\$(ProjectName).lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\
+xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;XML_EXPORTS;XML_NS;XML_STATIC;XML_UNICODE_WCHAR_T;_WIN32_WINNT=0x0601;WINVER=0x0601;_WIN32_IE=0x0A00;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(ProjectDir)x86_Release\$(ProjectName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <ProfileGuidedDatabase>$(ProjectDir)x86_Release\$(TargetName).pgd</ProfileGuidedDatabase>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <Optimization>MinSpace</Optimization>
+ <FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>..\Wasabi;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;XML_EXPORTS;XML_UNICODE_WCHAR_T;XML_NS;XML_STATIC;_WIN32_WINNT=0x0601;WINVER=0x0601;_WIN32_IE=0x0A00;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
+ <ForceConformanceInForLoopScope>true</ForceConformanceInForLoopScope>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>None</DebugInformationFormat>
+ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+ <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
+ </ClCompile>
+ <Link>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <ImportLibrary>$(ProjectDir)x64_Release\$(ProjectName).lib</ImportLibrary>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <ManifestFile>$(ProjectDir)x64_Release\$(TargetName)$(TargetExt).intermediate.manifest</ManifestFile>
+ <ProfileGuidedDatabase>$(ProjectDir)x64_Release\$(TargetName).pgd</ProfileGuidedDatabase>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ <PostBuildEvent>
+ <Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
+ <Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\WAT\WAT.vcxproj">
+ <Project>{c5714908-a71f-4644-bd95-aad8ee7914da}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\nu\regexp.h" />
+ <ClInclude Include="api__xml.h" />
+ <ClInclude Include="factory_xml.h" />
+ <ClInclude Include="ifc_xmlreadercallback.h" />
+ <ClInclude Include="ifc_xmlreaderparams.h" />
+ <ClInclude Include="obj_xml.h" />
+ <ClInclude Include="resource.h" />
+ <ClInclude Include="wa5_xml.h" />
+ <ClInclude Include="XMLParameters.h" />
+ <ClInclude Include="XMLReader.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\nu\regexp.cpp" />
+ <ClCompile Include="Encodings.cpp" />
+ <ClCompile Include="factory_xml.cpp" />
+ <ClCompile Include="ifc_xmlreadercallback.cpp" />
+ <ClCompile Include="ifc_xmlreaderparams.cpp" />
+ <ClCompile Include="main.cpp" />
+ <ClCompile Include="XMLParameters.cpp" />
+ <ClCompile Include="XMLReader.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="xml.rc" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/Src/xml/xml.vcxproj.filters b/Src/xml/xml.vcxproj.filters
new file mode 100644
index 000000000..89bd0d4b6
--- /dev/null
+++ b/Src/xml/xml.vcxproj.filters
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="Encodings.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="factory_xml.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="ifc_xmlreadercallback.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="ifc_xmlreaderparams.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="main.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\nu\regexp.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="XMLParameters.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="XMLReader.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="XMLReader.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="XMLParameters.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="wa5_xml.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="resource.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\nu\regexp.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="obj_xml.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ifc_xmlreaderparams.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ifc_xmlreadercallback.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="factory_xml.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="api__xml.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{6b2cf528-788c-4cfc-9b8f-17f6a7c2b57f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{39bf1e59-ed6d-4054-b1bc-c9cc76e9a83c}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Ressource Files">
+ <UniqueIdentifier>{b4e62fe6-4604-4ebe-8485-6ffa445cf867}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="xml.rc">
+ <Filter>Ressource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/Src/xml/xml.xcodeproj/project.pbxproj b/Src/xml/xml.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..ef3d86c9a
--- /dev/null
+++ b/Src/xml/xml.xcodeproj/project.pbxproj
@@ -0,0 +1,301 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0C224BF60BEF0DAE00CD61A6 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C224BF50BEF0DAE00CD61A6 /* CoreFoundation.framework */; };
+ 0C22BBBF0BBB5A4A00FCAE78 /* api_xmlreadercallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BBBE0BBB5A4A00FCAE78 /* api_xmlreadercallback.cpp */; };
+ 0C22BBCF0BBB5A7100FCAE78 /* api_xmlreadercallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C22BBCE0BBB5A7100FCAE78 /* api_xmlreadercallback.h */; };
+ 0C22BBD40BBB5A7C00FCAE78 /* api_xmlreadercallbacki.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C22BBD00BBB5A7C00FCAE78 /* api_xmlreadercallbacki.h */; };
+ 0C22BBD50BBB5A7C00FCAE78 /* api_xmlreadercallbacki.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BBD10BBB5A7C00FCAE78 /* api_xmlreadercallbacki.cpp */; };
+ 0C22BBD60BBB5A7C00FCAE78 /* api_xmlreaderparams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BBD20BBB5A7C00FCAE78 /* api_xmlreaderparams.cpp */; };
+ 0C22BBD70BBB5A7C00FCAE78 /* api_xmlreaderparams.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C22BBD30BBB5A7C00FCAE78 /* api_xmlreaderparams.h */; };
+ 0C22BBDB0BBB5A9200FCAE78 /* factory_xml.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C22BBD90BBB5A9200FCAE78 /* factory_xml.h */; };
+ 0C22BBDC0BBB5A9200FCAE78 /* factory_xml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BBDA0BBB5A9200FCAE78 /* factory_xml.cpp */; };
+ 0C22BBE20BBB5AAA00FCAE78 /* wa5_xml.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C22BBE10BBB5AAA00FCAE78 /* wa5_xml.h */; };
+ 0C22BBE40BBB5AAF00FCAE78 /* XMLParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BBE30BBB5AAF00FCAE78 /* XMLParameters.cpp */; };
+ 0C22BC1A0BBB5DB400FCAE78 /* XMLReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BC190BBB5DB400FCAE78 /* XMLReader.cpp */; };
+ 0C22BC8D0BBB60C200FCAE78 /* xmlrole.c in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BC8A0BBB60C200FCAE78 /* xmlrole.c */; };
+ 0C22BC8E0BBB60C200FCAE78 /* xmltok.c in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BC8B0BBB60C200FCAE78 /* xmltok.c */; };
+ 0C22BC8F0BBB60C200FCAE78 /* xmlparse.c in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BC8C0BBB60C200FCAE78 /* xmlparse.c */; };
+ 0C22BCAB0BBB615800FCAE78 /* PtrList.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C22BCA90BBB615800FCAE78 /* PtrList.h */; };
+ 0C22BCAC0BBB615800FCAE78 /* PtrList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BCAA0BBB615800FCAE78 /* PtrList.cpp */; };
+ 0C22BCBF0BBB619400FCAE78 /* regexp.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C22BCBD0BBB619400FCAE78 /* regexp.h */; };
+ 0C22BCC00BBB619400FCAE78 /* regexp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BCBE0BBB619400FCAE78 /* regexp.cpp */; };
+ 0C22BCE70BBB634A00FCAE78 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BCE60BBB634A00FCAE78 /* main.cpp */; };
+ 0C22BD010BBB63C100FCAE78 /* encodings_c.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C22BD000BBB63C100FCAE78 /* encodings_c.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 0C224BF50BEF0DAE00CD61A6 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+ 0C22BBBE0BBB5A4A00FCAE78 /* api_xmlreadercallback.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = api_xmlreadercallback.cpp; sourceTree = "<group>"; };
+ 0C22BBCE0BBB5A7100FCAE78 /* api_xmlreadercallback.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = api_xmlreadercallback.h; sourceTree = "<group>"; };
+ 0C22BBD00BBB5A7C00FCAE78 /* api_xmlreadercallbacki.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = api_xmlreadercallbacki.h; sourceTree = "<group>"; };
+ 0C22BBD10BBB5A7C00FCAE78 /* api_xmlreadercallbacki.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = api_xmlreadercallbacki.cpp; sourceTree = "<group>"; };
+ 0C22BBD20BBB5A7C00FCAE78 /* api_xmlreaderparams.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = api_xmlreaderparams.cpp; sourceTree = "<group>"; };
+ 0C22BBD30BBB5A7C00FCAE78 /* api_xmlreaderparams.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = api_xmlreaderparams.h; sourceTree = "<group>"; };
+ 0C22BBD90BBB5A9200FCAE78 /* factory_xml.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = factory_xml.h; sourceTree = "<group>"; };
+ 0C22BBDA0BBB5A9200FCAE78 /* factory_xml.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = factory_xml.cpp; sourceTree = "<group>"; };
+ 0C22BBE10BBB5AAA00FCAE78 /* wa5_xml.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = wa5_xml.h; sourceTree = "<group>"; };
+ 0C22BBE30BBB5AAF00FCAE78 /* XMLParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMLParameters.cpp; sourceTree = "<group>"; };
+ 0C22BC190BBB5DB400FCAE78 /* XMLReader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = XMLReader.cpp; sourceTree = "<group>"; };
+ 0C22BC8A0BBB60C200FCAE78 /* xmlrole.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = xmlrole.c; path = expat/xmlrole.c; sourceTree = "<group>"; };
+ 0C22BC8B0BBB60C200FCAE78 /* xmltok.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = xmltok.c; path = expat/xmltok.c; sourceTree = "<group>"; };
+ 0C22BC8C0BBB60C200FCAE78 /* xmlparse.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = xmlparse.c; path = expat/xmlparse.c; sourceTree = "<group>"; };
+ 0C22BCA90BBB615800FCAE78 /* PtrList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PtrList.h; path = ../nu/PtrList.h; sourceTree = SOURCE_ROOT; };
+ 0C22BCAA0BBB615800FCAE78 /* PtrList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = PtrList.cpp; path = ../nu/PtrList.cpp; sourceTree = SOURCE_ROOT; };
+ 0C22BCBD0BBB619400FCAE78 /* regexp.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = regexp.h; path = ../nu/regexp.h; sourceTree = SOURCE_ROOT; };
+ 0C22BCBE0BBB619400FCAE78 /* regexp.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = regexp.cpp; path = ../nu/regexp.cpp; sourceTree = SOURCE_ROOT; };
+ 0C22BCE60BBB634A00FCAE78 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
+ 0C22BD000BBB63C100FCAE78 /* encodings_c.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = encodings_c.cpp; sourceTree = "<group>"; };
+ D2AAC0630554660B00DB518D /* xml.w5s */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = xml.w5s; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ D289988505E68E00004EDB86 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0C224BF60BEF0DAE00CD61A6 /* CoreFoundation.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 08FB7794FE84155DC02AAC07 /* xml */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ );
+ name = xml;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 0C224BF50BEF0DAE00CD61A6 /* CoreFoundation.framework */,
+ 0C22BCA80BBB614800FCAE78 /* NU */,
+ 0C22BC890BBB60B200FCAE78 /* expat */,
+ 0C22BBBE0BBB5A4A00FCAE78 /* api_xmlreadercallback.cpp */,
+ 0C22BBCE0BBB5A7100FCAE78 /* api_xmlreadercallback.h */,
+ 0C22BBD00BBB5A7C00FCAE78 /* api_xmlreadercallbacki.h */,
+ 0C22BBD10BBB5A7C00FCAE78 /* api_xmlreadercallbacki.cpp */,
+ 0C22BBD20BBB5A7C00FCAE78 /* api_xmlreaderparams.cpp */,
+ 0C22BBD30BBB5A7C00FCAE78 /* api_xmlreaderparams.h */,
+ 0C22BBD90BBB5A9200FCAE78 /* factory_xml.h */,
+ 0C22BBDA0BBB5A9200FCAE78 /* factory_xml.cpp */,
+ 0C22BBE10BBB5AAA00FCAE78 /* wa5_xml.h */,
+ 0C22BBE30BBB5AAF00FCAE78 /* XMLParameters.cpp */,
+ 0C22BC190BBB5DB400FCAE78 /* XMLReader.cpp */,
+ 0C22BCE60BBB634A00FCAE78 /* main.cpp */,
+ 0C22BD000BBB63C100FCAE78 /* encodings_c.cpp */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 0C22BC890BBB60B200FCAE78 /* expat */ = {
+ isa = PBXGroup;
+ children = (
+ 0C22BC8A0BBB60C200FCAE78 /* xmlrole.c */,
+ 0C22BC8B0BBB60C200FCAE78 /* xmltok.c */,
+ 0C22BC8C0BBB60C200FCAE78 /* xmlparse.c */,
+ );
+ name = expat;
+ sourceTree = "<group>";
+ };
+ 0C22BCA80BBB614800FCAE78 /* NU */ = {
+ isa = PBXGroup;
+ children = (
+ 0C22BCBD0BBB619400FCAE78 /* regexp.h */,
+ 0C22BCBE0BBB619400FCAE78 /* regexp.cpp */,
+ 0C22BCA90BBB615800FCAE78 /* PtrList.h */,
+ 0C22BCAA0BBB615800FCAE78 /* PtrList.cpp */,
+ );
+ name = NU;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D2AAC0630554660B00DB518D /* xml.w5s */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ D2AAC0600554660B00DB518D /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0C22BBCF0BBB5A7100FCAE78 /* api_xmlreadercallback.h in Headers */,
+ 0C22BBD40BBB5A7C00FCAE78 /* api_xmlreadercallbacki.h in Headers */,
+ 0C22BBD70BBB5A7C00FCAE78 /* api_xmlreaderparams.h in Headers */,
+ 0C22BBDB0BBB5A9200FCAE78 /* factory_xml.h in Headers */,
+ 0C22BBE20BBB5AAA00FCAE78 /* wa5_xml.h in Headers */,
+ 0C22BCAB0BBB615800FCAE78 /* PtrList.h in Headers */,
+ 0C22BCBF0BBB619400FCAE78 /* regexp.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ D2AAC0620554660B00DB518D /* xml */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "xml" */;
+ buildPhases = (
+ D2AAC0600554660B00DB518D /* Headers */,
+ D2AAC0610554660B00DB518D /* Sources */,
+ D289988505E68E00004EDB86 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = xml;
+ productName = xml;
+ productReference = D2AAC0630554660B00DB518D /* xml.w5s */;
+ productType = "com.apple.product-type.library.dynamic";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "xml" */;
+ compatibilityVersion = "Xcode 2.4";
+ hasScannedForEncodings = 1;
+ mainGroup = 08FB7794FE84155DC02AAC07 /* xml */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ D2AAC0620554660B00DB518D /* xml */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ D2AAC0610554660B00DB518D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0C22BBBF0BBB5A4A00FCAE78 /* api_xmlreadercallback.cpp in Sources */,
+ 0C22BBD50BBB5A7C00FCAE78 /* api_xmlreadercallbacki.cpp in Sources */,
+ 0C22BBD60BBB5A7C00FCAE78 /* api_xmlreaderparams.cpp in Sources */,
+ 0C22BBDC0BBB5A9200FCAE78 /* factory_xml.cpp in Sources */,
+ 0C22BBE40BBB5AAF00FCAE78 /* XMLParameters.cpp in Sources */,
+ 0C22BC1A0BBB5DB400FCAE78 /* XMLReader.cpp in Sources */,
+ 0C22BC8D0BBB60C200FCAE78 /* xmlrole.c in Sources */,
+ 0C22BC8E0BBB60C200FCAE78 /* xmltok.c in Sources */,
+ 0C22BC8F0BBB60C200FCAE78 /* xmlparse.c in Sources */,
+ 0C22BCAC0BBB615800FCAE78 /* PtrList.cpp in Sources */,
+ 0C22BCC00BBB619400FCAE78 /* regexp.cpp in Sources */,
+ 0C22BCE70BBB634A00FCAE78 /* main.cpp in Sources */,
+ 0C22BD010BBB63C100FCAE78 /* encodings_c.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB914B08733D8E0010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ EXECUTABLE_EXTENSION = w5s;
+ EXECUTABLE_PREFIX = "";
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ INSTALL_PATH = /usr/local/lib;
+ PRODUCT_NAME = xml;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ 1DEB914C08733D8E0010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ i386,
+ ppc,
+ ppc64,
+ x86_64,
+ );
+ EXECUTABLE_EXTENSION = w5s;
+ EXECUTABLE_PREFIX = "";
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = G5;
+ INSTALL_PATH = /usr/local/lib;
+ PRODUCT_NAME = xml;
+ };
+ name = Release;
+ };
+ 1DEB914F08733D8E0010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ GCC_PREFIX_HEADER = expat/macconfig.h;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ XML_UNICODE_WCHAR_T,
+ HAVE_MEMMOVE,
+ );
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = ../Wasabi;
+ PREBINDING = NO;
+ SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+ };
+ name = Debug;
+ };
+ 1DEB915008733D8E0010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ GCC_PREFIX_HEADER = expat/macconfig.h;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ XML_UNICODE_WCHAR_T,
+ HAVE_MEMMOVE,
+ );
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = ../Wasabi;
+ PREBINDING = NO;
+ SDKROOT = /Developer/SDKs/MacOSX10.5.sdk;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "xml" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB914B08733D8E0010E9CD /* Debug */,
+ 1DEB914C08733D8E0010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "xml" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB914F08733D8E0010E9CD /* Debug */,
+ 1DEB915008733D8E0010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}