Trisurf Monte Carlo simulator
Samo Penic
2016-02-24 a011d2d078cf65c97d70b31435b90c294ce6aec4
src/restore.c
@@ -8,6 +8,9 @@
#include <snapshot.h>
#include <zlib.h>
#include "vesicle.h"
#include "vertex.h"
#include "triangle.h"
ts_bool parseDump(char *dumpfname) {
   xmlDocPtr doc;
   xmlNodePtr cur;
@@ -32,7 +35,7 @@
   cur = cur->xmlChildrenNode;
   while (cur != NULL) {
      if ((!xmlStrcmp(cur->name, (const xmlChar *)"trisurf"))){
         *vesicle=parseTrisurfTag(doc, cur);
         vesicle=parseTrisurfTag(doc, cur);
      }
       
   cur = cur->next;
@@ -41,11 +44,15 @@
   xmlFreeDoc(doc);
   fprintf(stderr,"Restoration completed\n");
   exit(0);
   vesicle_free(vesicle);
   return TS_SUCCESS;
}
ts_vesicle *parseTrisurfTag(xmlDocPtr doc, xmlNodePtr cur){
   fprintf(stderr,"Parsing trisurf tag\n");
   xmlNodePtr child;
#ifdef COMPRESS
   /* base64decode */
   size_t cLen;
   /*size_t tLen;
@@ -77,6 +84,7 @@
   fprintf(stderr,"%s\n",subtree);
   
   free(subtree);
#endif
   /*parse xml subtree */
   xmlChar *nvtx, *npoly, *nfono;
   nvtx = xmlGetProp(cur, (xmlChar *)"nvtx");
@@ -88,5 +96,101 @@
   xmlFree(nvtx);
   xmlFree(npoly);
   xmlFree(nfono);
   child = cur->xmlChildrenNode;
   while (child != NULL) {
      if ((!xmlStrcmp(child->name, (const xmlChar *)"vtxn"))){
         parseTrisurfVtxn(vesicle->vlist, doc, child);
      }
      if ((!xmlStrcmp(child->name, (const xmlChar *)"tria"))){
         parseTrisurfTria(vesicle, doc, child);
      }
       if ((!xmlStrcmp(child->name, (const xmlChar *)"tristar"))){
         parseTrisurfTristar(vesicle, doc, child);
      }
   child = child->next;
   }
   return vesicle;
}
/* Low level tags parsers */
ts_bool parseTrisurfVtxn(ts_vertex_list *vlist, xmlDocPtr doc, xmlNodePtr cur){
   xmlChar *chari;
   xmlChar *neighs;
   char *n;
   char *token;
   ts_uint neighi;
   ts_uint i;
   chari = xmlGetProp(cur, (xmlChar *)"idx");
   i=atoi((char *)chari);
   xmlFree(chari);
   ts_vertex *vtx=vlist->vtx[i];
   neighs = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
   //fprintf(stderr,"Found neigh for vtx %u that seems to have index %u with neighs=%s\n",i,vtx->idx,neighs);
   n=(char *)neighs;
   token=strtok(n," ");
   while(token!=NULL){
      neighi=atoi(token);
      //fprintf(stderr,"%u", neighi);
      vtx_add_neighbour(vtx,vlist->vtx[neighi]);
      token=strtok(NULL," ");
   }
   xmlFree(neighs);
   return TS_SUCCESS;
}
ts_bool parseTrisurfTria(ts_vesicle *vesicle, xmlDocPtr doc, xmlNodePtr cur){
   xmlChar *triangles;
   char *tria;
   char *vtx[3];
   ts_uint i;
   triangles = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
   tria=(char *)triangles;
   for(i=0;i<3;i++)   vtx[i]=strtok(tria," ");
   while(vtx[2]!=NULL){
      triangle_add(vesicle->tlist, vesicle->vlist->vtx[atoi(vtx[0])],vesicle->vlist->vtx[atoi(vtx[1])],vesicle->vlist->vtx[atoi(vtx[2])]);
      for(i=0;i<3;i++)   vtx[i]=strtok(NULL," ");
   }
   xmlFree(triangles);
   return TS_SUCCESS;
}
ts_bool parseTrisurfTristar(ts_vesicle *vesicle, xmlDocPtr doc, xmlNodePtr cur){
   xmlChar *chari;
   xmlChar *tristar;
   char *t;
   char *token;
   ts_uint neighi;
   ts_uint i;
   chari = xmlGetProp(cur, (xmlChar *)"idx");
   i=atoi((char *)chari);
   xmlFree(chari);
   ts_vertex *vtx=vesicle->vlist->vtx[i];
   tristar = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
//   fprintf(stderr,"Found tristar for vtx %u that seems to have index %u with tristar=%s\n",i,vtx->idx,tristar);
   t=(char *)tristar;
   token=strtok(t," ");
   while(token!=NULL){
      neighi=atoi(token);
      //fprintf(stderr,"%u", neighi);
      vertex_add_tristar(vtx,vesicle->tlist->tria[neighi]);
      token=strtok(NULL," ");
   }
   xmlFree(tristar);
   return TS_SUCCESS;
}