27 #if defined (INCLUDE_NON_WEB3D_FORMATS)
34 #include <libFreeWRL.h>
36 #include "../vrml_parser/Structs.h"
37 #include "../main/headers.h"
38 #include "../vrml_parser/CParseGeneral.h"
39 #include "../scenegraph/Vector.h"
40 #include "../vrml_parser/CFieldDecls.h"
41 #include "../world_script/JScript.h"
42 #include "../world_script/CScripts.h"
43 #include "../world_script/fieldSet.h"
44 #include "../vrml_parser/CParseParser.h"
45 #include "../vrml_parser/CParseLexer.h"
46 #include "../vrml_parser/CParse.h"
47 #include "../input/EAIHeaders.h"
48 #include "../input/EAIHelpers.h"
51 #include "ColladaParser.h"
54 #define INCREMENT_PARENTINDEXC \
55 if (p->parentIndex < (PARENTSTACKSIZE-2)) { \
57 p->colladaParentStack[p->parentIndex] = NULL; \
58 } else ConsoleMessage ("ColladaParser, line %d stack overflow",LINE);
60 #include <libxml/parser.h>
61 typedef xmlSAXHandler* XML_Parser;
64 #define XML_GetCurrentLineNumber(aaa) -1L
65 #define XML_ParserFree(aaa) FREE_IF_NZ(aaa)
66 #define XML_SetUserData(aaa,bbb)
67 #define XML_STATUS_ERROR -1
68 #define XML_GetErrorCode(aaa)
69 #define XML_ErrorString(aaa) "errors not currently being reported by libxml port"
72 static int XML_ParseFile(xmlSAXHandler *me,
const char *myinput,
int myinputlen,
int recovery) {
75 if (xmlSAXUserParseMemory(me, ¬Used, myinput,myinputlen) == 0)
return 0;
76 return XML_STATUS_ERROR;
81 #define XML_CreateParserLevel(aaa) \
82 aaa = MALLOC(xmlSAXHandler *, sizeof (xmlSAXHandler)); \
83 bzero (aaa,sizeof(xmlSAXHandler));
86 #define XML_SetElementHandler(aaa,bbb,ccc) \
87 aaa->startElement = bbb; \
88 aaa->endElement = ccc;
91 #define XML_SetDefaultHandler(aaa,bbb)
92 #define XML_SetCdataSectionHandler(aaa,bbb,ccc) \
93 aaa->cdataBlock = endCDATA;
104 typedef struct pColladaParser{
105 XML_Parser colladaParser[PROTOINSTANCE_MAX_LEVELS];
106 XML_Parser currentColladaParser;
108 int ColladaParserRecurseLevel;
110 struct X3D_Node *colladaParentStack[PARENTSTACKSIZE];
114 void *ColladaParser_constructor(){
115 void *v = MALLOCV(
sizeof(
struct pColladaParser));
116 memset(v,0,
sizeof(
struct pColladaParser));
119 void ColladaParser_init(
struct tColladaParser *t){
122 t->prv = ColladaParser_constructor();
124 ppColladaParser p = (ppColladaParser)t->prv;
126 p->currentColladaParser = NULL;
128 p->ColladaParserRecurseLevel = 0;
136 static void XMLCALL startCDATA (
void *userData) {
138 if (tg->X3DParser.CDATA_Text_curlen != 0) {
144 tg->X3DParser.CDATA_Text_curlen = 0;
147 #ifdef COLLADAPARSERVERBOSE
148 printf (
"startCDATA -parentIndex %d parserMode %s\n",parentIndex,parserModeStrings[getMode(ud,TOP)]);
150 ((ppColladaParser)(gglobal()->ColladaParser.prv))->inCDATA = TRUE;
153 static void XMLCALL endCDATA (
void *userData,
const xmlChar *value,
int len) {
154 #ifdef COLLADAPARSERVERBOSE
155 printf (
"endCDATA, cur index %d\n",CDATA_Text_curlen);
156 printf (
"endCDATA -parentIndex %d parserMode %s\n",parentIndex,parserModeStrings[getMode(ud,TOP)]);
158 ((ppColladaParser)(gglobal()->ColladaParser.prv))->inCDATA = FALSE;
162 #ifdef COLLADAPARSERVERBOSE
163 printf (
"returning from EndCData\n");
169 static void XMLCALL handleCDATA (
void *userData,
const char *
string,
int len) {
177 static void XMLCALL ColladaStartElement(
void *unused,
const xmlChar *name,
const xmlChar **atts) {
179 #ifdef COLLADAVERBOSE
180 {
int i,j;
for (j=0; j< indentLevel; j++) printf (
" ");
181 printf (
"startElement: %s : level %d\n",name,indentLevel);
182 for (i = 0; atts[i]; i += 2) {
183 for (j=0; j< indentLevel; j++) printf (
" ");
184 printf(
" field:%s=%s\n", atts[i], atts[i + 1]);
189 ((ppColladaParser)(gglobal()->ColladaParser.prv))->indentLevel++;
192 static void XMLCALL ColladaEndElement(
void *unused,
const xmlChar *name) {
193 ((ppColladaParser)(gglobal()->ColladaParser.prv))->indentLevel--;
195 #ifdef COLLADAVERBOSE
196 {
int i;
for (i=0; i< indentLevel; i++) printf (
" ");
197 printf (
"endElement: %s : level %d\n",name,indentLevel);
204 static XML_Parser initializeColladaParser () {
205 ppColladaParser p = (ppColladaParser)gglobal()->ColladaParser.prv;
206 p->ColladaParserRecurseLevel++;
208 if (p->ColladaParserRecurseLevel >= PROTOINSTANCE_MAX_LEVELS) {
209 ConsoleMessage (
"XML_PARSER init: XML file PROTO nested too deep\n");
210 p->ColladaParserRecurseLevel--;
212 XML_CreateParserLevel(p->colladaParser[p->ColladaParserRecurseLevel]);
213 XML_SetElementHandler(p->colladaParser[p->ColladaParserRecurseLevel], ColladaStartElement, ColladaEndElement);
214 XML_SetCdataSectionHandler (p->colladaParser[p->ColladaParserRecurseLevel], startCDATA, endCDATA);
215 XML_SetDefaultHandler (p->colladaParser[p->ColladaParserRecurseLevel],handleCDATA);
216 XML_SetUserData(p->colladaParser[p->ColladaParserRecurseLevel], &p->parentIndex);
220 return p->colladaParser[p->ColladaParserRecurseLevel];
223 static void shutdownColladaParser () {
225 ppColladaParser p = (ppColladaParser)tg->ColladaParser.prv;
227 XML_ParserFree(p->colladaParser[p->ColladaParserRecurseLevel]);
228 p->ColladaParserRecurseLevel--;
231 if (p->ColladaParserRecurseLevel == INT_ID_UNDEFINED) {
237 if (p->ColladaParserRecurseLevel < INT_ID_UNDEFINED) {
238 ConsoleMessage (
"XML_PARSER close underflow");
239 p->ColladaParserRecurseLevel = INT_ID_UNDEFINED;
243 FREE_IF_NZ(tg->X3DParser.CDATA_Text);
244 if (p->ColladaParserRecurseLevel > INT_ID_UNDEFINED)
245 p->currentColladaParser = p->colladaParser[p->ColladaParserRecurseLevel];
250 int ColladaParse (
struct X3D_Group* myParent,
const char *inputstring) {
251 ppColladaParser p = (ppColladaParser)gglobal()->ColladaParser.prv;
252 p->currentColladaParser = initializeColladaParser();
257 INCREMENT_PARENTINDEXC
258 p->colladaParentStack[p->parentIndex] = X3D_NODE(myParent);
260 if (XML_ParseFile(p->currentColladaParser, inputstring, (
int) strlen(inputstring), TRUE) == XML_STATUS_ERROR) {
262 "%s at line %" XML_FMT_INT_MOD
"u\n",
263 XML_ErrorString(XML_GetErrorCode(currentColladaParser)),
264 XML_GetCurrentLineNumber(currentColladaParser));
265 shutdownColladaParser();
268 shutdownColladaParser();
271 #endif //INCLUDE_NON_WEB3D_FORMATS