]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - plugins/mapxml/xmlparse.cpp
uncrustify! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / plugins / mapxml / xmlparse.cpp
index f9093a5f01aee44214417fae947afd49743fe23f..0f86b177dd9d40c991623555a0e95a9883bfe3ea 100644 (file)
 
 #include "plugin.h"
 
-void Patch_XMLParse(patchMesh_t *pPatch, xmlNodePtr surface)
-{
-  char *str, *content;
-  int i, j;
-
-  for(xmlNodePtr current = surface->children; current != NULL; current = current->next)
-  {
-    if(current->type != XML_ELEMENT_NODE) continue;
-    if(!strcmp((char *)current->name, "matrix"))
-    {
-      str = (char *)xmlGetProp(current, (xmlChar *)"width");
-      pPatch->width = atoi(str);
-      xmlFree(str);
-      str = (char *)xmlGetProp(current, (xmlChar *)"height");
-      pPatch->height = atoi(str);
-      xmlFree(str);
-
-      content = Q_StrDup((char *)current->children->content);
-
-      str = strtok(content, " \n\r\t\v\0");
-      for(i=0; i<pPatch->width; i++)
-      {
-        for(j=0; j<pPatch->height; j++)
-        {
-          pPatch->ctrl[i][j].xyz[0] = atof(str);
-          str = strtok(NULL, " \n\r\t\v\0");
-          pPatch->ctrl[i][j].xyz[1] = atof(str);
-          str = strtok(NULL, " \n\r\t\v\0");
-          pPatch->ctrl[i][j].xyz[2] = atof(str);
-          str = strtok(NULL, " \n\r\t\v\0");
-          pPatch->ctrl[i][j].st[0] = atof(str);
-          str = strtok(NULL, " \n\r\t\v\0");
-          pPatch->ctrl[i][j].st[1] = atof(str);
-          str = strtok(NULL, " \n\r\t\v\0");
-        }
-      }
-
-      delete [] content;
-    }
-    else if(!strcmp((char *)current->name, "shader")) {
-      pPatch->pShader = QERApp_Shader_ForName((char*)current->children->content);
-      pPatch->d_texture = pPatch->pShader->getTexture();
-    }
-  }
+void Patch_XMLParse( patchMesh_t *pPatch, xmlNodePtr surface ){
+       char *str, *content;
+       int i, j;
+
+       for ( xmlNodePtr current = surface->children; current != NULL; current = current->next )
+       {
+               if ( current->type != XML_ELEMENT_NODE ) {
+                       continue;
+               }
+               if ( !strcmp( (char *)current->name, "matrix" ) ) {
+                       str = (char *)xmlGetProp( current, (xmlChar *)"width" );
+                       pPatch->width = atoi( str );
+                       xmlFree( str );
+                       str = (char *)xmlGetProp( current, (xmlChar *)"height" );
+                       pPatch->height = atoi( str );
+                       xmlFree( str );
+
+                       content = Q_StrDup( (char *)current->children->content );
+
+                       str = strtok( content, " \n\r\t\v\0" );
+                       for ( i = 0; i < pPatch->width; i++ )
+                       {
+                               for ( j = 0; j < pPatch->height; j++ )
+                               {
+                                       pPatch->ctrl[i][j].xyz[0] = atof( str );
+                                       str = strtok( NULL, " \n\r\t\v\0" );
+                                       pPatch->ctrl[i][j].xyz[1] = atof( str );
+                                       str = strtok( NULL, " \n\r\t\v\0" );
+                                       pPatch->ctrl[i][j].xyz[2] = atof( str );
+                                       str = strtok( NULL, " \n\r\t\v\0" );
+                                       pPatch->ctrl[i][j].st[0] = atof( str );
+                                       str = strtok( NULL, " \n\r\t\v\0" );
+                                       pPatch->ctrl[i][j].st[1] = atof( str );
+                                       str = strtok( NULL, " \n\r\t\v\0" );
+                               }
+                       }
+
+                       delete [] content;
+               }
+               else if ( !strcmp( (char *)current->name, "shader" ) ) {
+                       pPatch->pShader = QERApp_Shader_ForName( (char*)current->children->content );
+                       pPatch->d_texture = pPatch->pShader->getTexture();
+               }
+       }
 }
 
-void Face_XMLParse (face_t *face, xmlNodePtr surface)
-{
-  char *str, *content;
-  int i, j;
-
-  for(xmlNodePtr current = surface->children; current != NULL; current = current->next)
-  {
-    if(current->type != XML_ELEMENT_NODE) continue;
-    if(!strcmp((char *)current->name, "planepts"))
-    {
-      content = Q_StrDup((char *)current->children->content);
-
-      str = strtok(content, " \n\r\t\v\0");
-      for (i=0 ; i<3 ; i++)
-           {
-                   for (j=0 ; j<3 ; j++)
-                   {
-                           face->planepts[i][j] = atof(str);
-          str = strtok(NULL, " \n\r\t\v\0");
-                   }
-      }
-
-      delete [] content;
-    }
-    else if(!strcmp((char *)current->name, "texdef"))
-    {
-      content = Q_StrDup((char *)current->children->content);
-  
-      str = strtok(content, " \n\r\t\v\0");
-      face->texdef.shift[0] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->texdef.shift[1] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->texdef.rotate = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->texdef.scale[0] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->texdef.scale[1] = atof(str);
-
-      delete [] content;
-    }
-    else if(!strcmp((char *)current->name, "bpmatrix"))
-    {
-      content = Q_StrDup((char *)current->children->content);
-  
-      str = strtok(content, " \n\r\t\v\0");
-      face->brushprimit_texdef.coords[0][0] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->brushprimit_texdef.coords[0][1] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->brushprimit_texdef.coords[0][2] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->brushprimit_texdef.coords[1][0] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->brushprimit_texdef.coords[1][1] = atof(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->brushprimit_texdef.coords[1][2] = atof(str);
-
-      delete [] content;
-    }
-    else if(!strcmp((char *)current->name, "flags"))
-    {
-      content = Q_StrDup((char *)current->children->content);
-
-      str = strtok(content, " \n\r\t\v\0");
-      face->texdef.contents = atoi(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->texdef.flags = atoi(str);
-      str = strtok(NULL, " \n\r\t\v\0");
-      face->texdef.value = atoi(str);
-
-      delete [] content;
-    }
-    else if(!strcmp((char *)current->name, "shader"))
-    {
-      face->texdef.SetName((char *)current->children->content);
-    }
-  }
+void Face_XMLParse( face_t *face, xmlNodePtr surface ){
+       char *str, *content;
+       int i, j;
+
+       for ( xmlNodePtr current = surface->children; current != NULL; current = current->next )
+       {
+               if ( current->type != XML_ELEMENT_NODE ) {
+                       continue;
+               }
+               if ( !strcmp( (char *)current->name, "planepts" ) ) {
+                       content = Q_StrDup( (char *)current->children->content );
+
+                       str = strtok( content, " \n\r\t\v\0" );
+                       for ( i = 0 ; i < 3 ; i++ )
+                       {
+                               for ( j = 0 ; j < 3 ; j++ )
+                               {
+                                       face->planepts[i][j] = atof( str );
+                                       str = strtok( NULL, " \n\r\t\v\0" );
+                               }
+                       }
+
+                       delete [] content;
+               }
+               else if ( !strcmp( (char *)current->name, "texdef" ) ) {
+                       content = Q_StrDup( (char *)current->children->content );
+
+                       str = strtok( content, " \n\r\t\v\0" );
+                       face->texdef.shift[0] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->texdef.shift[1] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->texdef.rotate = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->texdef.scale[0] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->texdef.scale[1] = atof( str );
+
+                       delete [] content;
+               }
+               else if ( !strcmp( (char *)current->name, "bpmatrix" ) ) {
+                       content = Q_StrDup( (char *)current->children->content );
+
+                       str = strtok( content, " \n\r\t\v\0" );
+                       face->brushprimit_texdef.coords[0][0] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->brushprimit_texdef.coords[0][1] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->brushprimit_texdef.coords[0][2] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->brushprimit_texdef.coords[1][0] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->brushprimit_texdef.coords[1][1] = atof( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->brushprimit_texdef.coords[1][2] = atof( str );
+
+                       delete [] content;
+               }
+               else if ( !strcmp( (char *)current->name, "flags" ) ) {
+                       content = Q_StrDup( (char *)current->children->content );
+
+                       str = strtok( content, " \n\r\t\v\0" );
+                       face->texdef.contents = atoi( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->texdef.flags = atoi( str );
+                       str = strtok( NULL, " \n\r\t\v\0" );
+                       face->texdef.value = atoi( str );
+
+                       delete [] content;
+               }
+               else if ( !strcmp( (char *)current->name, "shader" ) ) {
+                       face->texdef.SetName( (char *)current->children->content );
+               }
+       }
 }
 
-void Brush_XMLParse (brush_t *pBrush, xmlNodePtr primitive)
-{
-  face_t    *f;
-
-  for(xmlNodePtr current = primitive->children; current != NULL; current = current->next)
-  {
-    if(current->type != XML_ELEMENT_NODE) continue;
-    f = pBrush->brush_faces;
-    pBrush->brush_faces = Face_Alloc();
-    Face_XMLParse(pBrush->brush_faces, current);
-    pBrush->brush_faces->next = f;
-  }
+void Brush_XMLParse( brush_t *pBrush, xmlNodePtr primitive ){
+       face_t    *f;
+
+       for ( xmlNodePtr current = primitive->children; current != NULL; current = current->next )
+       {
+               if ( current->type != XML_ELEMENT_NODE ) {
+                       continue;
+               }
+               f = pBrush->brush_faces;
+               pBrush->brush_faces = Face_Alloc();
+               Face_XMLParse( pBrush->brush_faces, current );
+               pBrush->brush_faces->next = f;
+       }
 }
 
-void Entity_XMLParse(entity_t *pEntity, xmlNodePtr entity)
-{
-  brush_t *pBrush;
-
-  for(xmlNodePtr current = entity->children; current != NULL; current = current->next)
-  {
-    if(current->type != XML_ELEMENT_NODE) continue;
-    if(!strcmp((char *)current->name, "epair"))
-    {
-      char *key = (char *)xmlGetProp(current, (xmlChar *)"key");
-      char *value = (char *)xmlGetProp(current, (xmlChar *)"value");
-      SetKeyValue(pEntity, key, value);
-      xmlFree(key);
-      xmlFree(value);
-    }
-    else if(strcmp((char *)current->name, "brush") == 0)
-    {
-      pBrush = Brush_Alloc();
-      Brush_XMLParse(pBrush, current);
-      ((CPtrArray*)pEntity->pData)->Add(pBrush);
-    }
-    else if(strcmp((char *)current->name, "patch") == 0)
-    {
-      pBrush = Brush_Alloc();
-      pBrush->patchBrush = true;
-      pBrush->pPatch = Patch_Alloc();
-      pBrush->pPatch->pSymbiot = pBrush;
-      Patch_XMLParse(pBrush->pPatch, current);
-      ((CPtrArray*)pEntity->pData)->Add(pBrush);
-    }
-  }
+void Entity_XMLParse( entity_t *pEntity, xmlNodePtr entity ){
+       brush_t *pBrush;
+
+       for ( xmlNodePtr current = entity->children; current != NULL; current = current->next )
+       {
+               if ( current->type != XML_ELEMENT_NODE ) {
+                       continue;
+               }
+               if ( !strcmp( (char *)current->name, "epair" ) ) {
+                       char *key = (char *)xmlGetProp( current, (xmlChar *)"key" );
+                       char *value = (char *)xmlGetProp( current, (xmlChar *)"value" );
+                       SetKeyValue( pEntity, key, value );
+                       xmlFree( key );
+                       xmlFree( value );
+               }
+               else if ( strcmp( (char *)current->name, "brush" ) == 0 ) {
+                       pBrush = Brush_Alloc();
+                       Brush_XMLParse( pBrush, current );
+                       ( (CPtrArray*)pEntity->pData )->Add( pBrush );
+               }
+               else if ( strcmp( (char *)current->name, "patch" ) == 0 ) {
+                       pBrush = Brush_Alloc();
+                       pBrush->patchBrush = true;
+                       pBrush->pPatch = Patch_Alloc();
+                       pBrush->pPatch->pSymbiot = pBrush;
+                       Patch_XMLParse( pBrush->pPatch, current );
+                       ( (CPtrArray*)pEntity->pData )->Add( pBrush );
+               }
+       }
 }
 
-void Map_XMLRead(CPtrArray *map, xmlNodePtr map_node)
-{
-  entity_t *pEntity;
-  xmlNodePtr current;
-
-  for(current = map_node->children; current != NULL; current = current->next)
-  {
-    if(current->type != XML_ELEMENT_NODE) continue;
-    pEntity = Entity_Alloc();
-    pEntity->pData = new CPtrArray;
-    Entity_XMLParse(pEntity, current);
-    map->Add(pEntity);
-  }
+void Map_XMLRead( CPtrArray *map, xmlNodePtr map_node ){
+       entity_t *pEntity;
+       xmlNodePtr current;
+
+       for ( current = map_node->children; current != NULL; current = current->next )
+       {
+               if ( current->type != XML_ELEMENT_NODE ) {
+                       continue;
+               }
+               pEntity = Entity_Alloc();
+               pEntity->pData = new CPtrArray;
+               Entity_XMLParse( pEntity, current );
+               map->Add( pEntity );
+       }
 }
 
 // SPoG
 // temporarily copied from qe3.cpp
 // duplicate code starts here (note: g_strAppPath swapped for g_FuncTable.m_pfnGetQERPath())
 
-void HandleXMLError( void* ctxt, const char* text, ... )
-{
-  va_list argptr;
-  static char buf[32768];
+void HandleXMLError( void* ctxt, const char* text, ... ){
+       va_list argptr;
+       static char buf[32768];
 
-  va_start (argptr,text);
-  vsprintf (buf, text, argptr);
-  Sys_FPrintf (SYS_ERR, "XML %s\n", buf);
-  va_end (argptr);
+       va_start( argptr,text );
+       vsprintf( buf, text, argptr );
+       Sys_FPrintf( SYS_ERR, "XML %s\n", buf );
+       va_end( argptr );
 }
 
 #define DTD_BUFFER_LENGTH 1024
-xmlDocPtr ParseXMLStream(IDataStream *stream, bool validate = false)
-{
-  xmlDocPtr doc = NULL;
-  bool wellFormed = false, valid = false;
-  int res, size = 1024;
-  char chars[1024];
-  xmlParserCtxtPtr ctxt;
-
-  // SPoG
-  // HACK: use AppPath to resolve DTD location
-  // do a buffer-safe string copy and concatenate
-  int i;
-  char* w;
-  const char* r;
-  char buf[DTD_BUFFER_LENGTH];
-
-  w = buf;
-  i = 0;
-  // copy
-  //assert(g_FuncTable.m_pfnGetQERPath() != NULL);
-  for(r = g_FuncTable.m_pfnGetQERPath(); i<DTD_BUFFER_LENGTH && *r != '\0'; i++, r++)  w[i] = *r;
-  // concatenate
-  for(r = "dtds/"; i<DTD_BUFFER_LENGTH && *r != '\0'; i++, r++)  w[i] = *r;
-  // terminate
-  w[i] = '\0';
-
-  if(i == DTD_BUFFER_LENGTH)
-  {
-    HandleXMLError(NULL, "ERROR: buffer overflow: DTD path length too large\n");
-    return NULL;
-  }
-
-  //if(validate)
-  //  xmlDoValidityCheckingDefaultValue = 1;
-  //else
-    xmlDoValidityCheckingDefaultValue = 0;
-
-  xmlSetGenericErrorFunc(NULL, HandleXMLError);
-
-  res = stream->Read(chars, 4);
-  if (res > 0)
-  {
-    ctxt = xmlCreatePushParserCtxt(NULL, NULL, chars, res, buf);
-
-    while ((res = stream->Read(chars, size)) > 0)
-    {
-      xmlParseChunk(ctxt, chars, res, 0);
-    }
-    xmlParseChunk(ctxt, chars, 0, 1);
-    doc = ctxt->myDoc;
-
-    wellFormed = (ctxt->wellFormed == 1);
-    valid = (ctxt->valid == 1);
-
-    xmlFreeParserCtxt(ctxt);
-  }
-
-  if(wellFormed && (!validate || (validate && valid)))
-    return doc;
-
-  if(doc != NULL)
-    xmlFreeDoc(doc);
-
-  return NULL;
+xmlDocPtr ParseXMLStream( IDataStream *stream, bool validate = false ){
+       xmlDocPtr doc = NULL;
+       bool wellFormed = false, valid = false;
+       int res, size = 1024;
+       char chars[1024];
+       xmlParserCtxtPtr ctxt;
+
+       // SPoG
+       // HACK: use AppPath to resolve DTD location
+       // do a buffer-safe string copy and concatenate
+       int i;
+       char* w;
+       const char* r;
+       char buf[DTD_BUFFER_LENGTH];
+
+       w = buf;
+       i = 0;
+       // copy
+       //assert(g_FuncTable.m_pfnGetQERPath() != NULL);
+       for ( r = g_FuncTable.m_pfnGetQERPath(); i < DTD_BUFFER_LENGTH && *r != '\0'; i++, r++ ) w[i] = *r;
+       // concatenate
+       for ( r = "dtds/"; i < DTD_BUFFER_LENGTH && *r != '\0'; i++, r++ ) w[i] = *r;
+       // terminate
+       w[i] = '\0';
+
+       if ( i == DTD_BUFFER_LENGTH ) {
+               HandleXMLError( NULL, "ERROR: buffer overflow: DTD path length too large\n" );
+               return NULL;
+       }
+
+       //if(validate)
+       //  xmlDoValidityCheckingDefaultValue = 1;
+       //else
+       xmlDoValidityCheckingDefaultValue = 0;
+
+       xmlSetGenericErrorFunc( NULL, HandleXMLError );
+
+       res = stream->Read( chars, 4 );
+       if ( res > 0 ) {
+               ctxt = xmlCreatePushParserCtxt( NULL, NULL, chars, res, buf );
+
+               while ( ( res = stream->Read( chars, size ) ) > 0 )
+               {
+                       xmlParseChunk( ctxt, chars, res, 0 );
+               }
+               xmlParseChunk( ctxt, chars, 0, 1 );
+               doc = ctxt->myDoc;
+
+               wellFormed = ( ctxt->wellFormed == 1 );
+               valid = ( ctxt->valid == 1 );
+
+               xmlFreeParserCtxt( ctxt );
+       }
+
+       if ( wellFormed && ( !validate || ( validate && valid ) ) ) {
+               return doc;
+       }
+
+       if ( doc != NULL ) {
+               xmlFreeDoc( doc );
+       }
+
+       return NULL;
 }
 
 // duplicate code ends here
 
-void Map_Read (IDataStream *in, CPtrArray *map)
-{
-  xmlDocPtr doc;
-
-  doc = ParseXMLStream(in, false ); // quick hack while dtd validation is broken
-
-  if(doc != NULL)
-  {
-    xmlNodePtr node=doc->children;
-    while(node != NULL && node->type != XML_ELEMENT_NODE) node=node->next;
-    if(node != NULL)
-      Map_XMLRead(map, node);
-  }
-  xmlFreeDoc(doc);
+void Map_Read( IDataStream *in, CPtrArray *map ){
+       xmlDocPtr doc;
+
+       doc = ParseXMLStream( in, false ); // quick hack while dtd validation is broken
+
+       if ( doc != NULL ) {
+               xmlNodePtr node = doc->children;
+               while ( node != NULL && node->type != XML_ELEMENT_NODE ) node = node->next;
+               if ( node != NULL ) {
+                       Map_XMLRead( map, node );
+               }
+       }
+
+       xmlFreeDoc( doc );
 }