예제 #1
0
int decodesfname(struct XMLDBtable *ptr,struct XMLDBtable *tree,
                    void *data) {
  int i,j;
  struct config *config;
  struct XMLDBelement *e;
  char zero[1]={0};

  char *symbol[]={"\"","\\","<",">","&",0};
  char *entity[]={"&quot;","&apos;","&lt;","&gt;","&amp;",0};
  struct Entitydata *entptr;

  entptr=EntityMake();
  if (entptr==NULL) return -1;
  EntityAddEntityStringArray(entptr,entity);
  EntityAddSymbolStringArray(entptr,symbol);

  config=(struct config *)data;

  for (i=0;i<ptr->num;i++) {
    e=ptr->element[i];
    if (strcmp(e->name,"remail")==0) {
      if (config->sfname.remail.buf !=NULL) 
          XMLDBFreeBuffer(config->sfname.remail.buf);

      config->sfname.remail.type=0;
      for (j=0;j<e->atnum;j++) {
	if ((e->atval[j] !=NULL) && (strcmp(e->atval[j],"file")==0)) 
        config->sfname.remail.type=1;
      }
      if (config->sfname.remail.type==1) { 
        config->sfname.remail.buf=XMLDBCopyBuffer(e->data);
        XMLDBAddBuffer(config->sfname.remail.buf,zero,1);
      } else config->sfname.remail.buf=EntityDecodeBuffer(entptr,e->data);
      if (config->sfname.remail.buf==NULL) break;
    }

    if (strcmp(e->name,"remail.mail")==0) {
      if (config->sfname.remailmail.buf !=NULL) 
          XMLDBFreeBuffer(config->sfname.remailmail.buf);

      config->sfname.remailmail.type=0;
      for (j=0;j<e->atnum;j++) {
	if ((e->atval[j] !=NULL) && (strcmp(e->atval[j],"file")==0)) 
        config->sfname.remailmail.type=1;
      }
      if (config->sfname.remailmail.type==1) { 
        config->sfname.remailmail.buf=XMLDBCopyBuffer(e->data);
        XMLDBAddBuffer(config->sfname.remailmail.buf,zero,1);
      } else config->sfname.remailmail.buf=EntityDecodeBuffer(entptr,e->data);
      if (config->sfname.remailmail.buf==NULL) break;
    }


  }
  free(entptr);
  if (i<ptr->num) return -1;
  return 0;
}
예제 #2
0
void XMLdocFreeElement(struct XMLdocelement *ptr) {
  int i;
  if (ptr==NULL) return;
  if (ptr->name !=NULL) free(ptr->name);
  if (ptr->path !=NULL) free(ptr->path);
  if (ptr->tagdb !=NULL) TagDBFreeTable(ptr->tagdb);
  if (ptr->action !=NULL) XMLDBFreeBuffer(ptr->action);
  if (ptr->defval !=NULL) XMLDBFreeBuffer(ptr->defval);
  if (ptr->mod.ptr !=NULL) {
    for (i=0;i<ptr->mod.num;i++) {
      XMLdocFreeMod(ptr->mod.ptr[i]);
    }
    free(ptr->mod.ptr);
  }
  free(ptr);
}
예제 #3
0
void DoReplace(char **replace,char *name,struct XMLDBbuffer *buf,
               struct XMLDBbuffer *mod,char *sep,int type) {
  struct XMLDBbuffer *tbuf;
  char *txt;
  if (buf==NULL) return;
  if (buf->sze==0) return;

  if (mod==NULL) tbuf=XMLDBCopyBuffer(buf); 
  else tbuf=ApplyModifier(mod,name,buf);
	  
  if (type==2) txt=XMLToRaw(tbuf);
  else if (type==1) txt=XMLToURL(tbuf);
  else txt=XMLToHTML(tbuf);

  if (*replace==NULL) *replace=txt;
  else {
    char *tmp;
    if (sep !=NULL) {
      tmp=realloc(*replace,strlen(*replace)+strlen(sep)+strlen(txt)+1);
      strcat(tmp,sep);
    } else tmp=realloc(*replace,strlen(*replace)+strlen(txt)+1);
    strcat(tmp,txt);
    free(txt);
    *replace=tmp;
  }
  XMLDBFreeBuffer(tbuf);
}
예제 #4
0
void XMLdocFreeMod(struct XMLdocmod *ptr) {
  if (ptr==NULL) return;
  if (ptr->name !=NULL) free(ptr->name);
  if (ptr->path !=NULL) free(ptr->path);
  if (ptr->tagdb !=NULL) TagDBFreeTable(ptr->tagdb);
  if (ptr->action !=NULL) XMLDBFreeBuffer(ptr->action);
  free(ptr);
}
예제 #5
0
char *XMLToRaw(struct XMLDBbuffer *src) {
  char *symbol[]={"\"","\\","<",">","&",0};
  char *entity[]={"&quot;","&apos;","&lt;","&gt;","&amp;",0};
  struct Entitydata *ent=NULL;
  char *txt=NULL;
  struct XMLDBbuffer *tmp=NULL;
  struct XMLDBbuffer *dst=NULL;
  ent=EntityMake();
  EntityAddEntityStringArray(ent,entity);
  EntityAddSymbolStringArray(ent,symbol);
  tmp=EntityDecodeBuffer(ent,src);
  dst=EntityDecodeBuffer(ent,tmp);
  txt=getDBstring(dst);
  XMLDBFreeBuffer(tmp);
  XMLDBFreeBuffer(dst);
  free(ent);
  return txt;
}
예제 #6
0
파일: tagdb.c 프로젝트: ajribeiro/VT_RST3
void TagDBFreeTable(struct TagDBtable *ptr) {
  int i;
  struct TagDBtag *t=NULL;
  if (ptr==NULL) return;
  
  for (i=0;i<ptr->num;i++) {
    if ((ptr->tag !=NULL) && (ptr->tag[i] !=NULL)) {
      t=ptr->tag[i];
      if (t->name !=NULL) free(t->name);
      if (t->start.encode !=NULL) XMLDBFreeBuffer(t->start.encode);
      if (t->end.encode !=NULL) XMLDBFreeBuffer(t->end.encode);
      if (t->start.decode !=NULL) XMLDBFreeBuffer(t->start.decode);
      if (t->end.decode !=NULL) XMLDBFreeBuffer(t->end.decode);
    }
  }
  if (ptr->tag !=NULL) free(ptr->tag);
  free(ptr);
}
예제 #7
0
char *RawToHTML(char *buf,int sze) {
  char *symbol[]={"\"","\\","<",">","&","\n",0};
  char *entity[]={"&quot;","&apos;","&lt;","&gt;","&amp;","<br>",0};
  char *dtxt=NULL;
  struct Entitydata *ent=NULL;
  struct XMLDBbuffer *src=NULL;
  struct XMLDBbuffer *dst=NULL;
  ent=EntityMake();
  EntityAddEntityStringArray(ent,entity);
  EntityAddSymbolStringArray(ent,symbol);
  src=XMLDBMakeBuffer(sze);
  XMLDBAddBuffer(src,buf,sze);
  dst=EntityEncodeBuffer(ent,src);
  dtxt=getDBstring(dst);
  XMLDBFreeBuffer(src);
  XMLDBFreeBuffer(dst);
  free(ent);
  return dtxt;
}
예제 #8
0
파일: entity.c 프로젝트: asreimer/VTRST3.5
void EntityFree(struct Entitydata *ptr) {
  int i;
  if (ptr==NULL) return;
  if (ptr->entity.buf !=NULL) {
    for (i=0;i<ptr->entity.num;i++) 
      if (ptr->entity.buf[i] !=NULL) XMLDBFreeBuffer(ptr->entity.buf[i]);
    free(ptr->entity.buf);
  }
  if (ptr->entity.state !=NULL) free(ptr->entity.state);

  if (ptr->symbol.buf !=NULL) {
    for (i=0;i<ptr->symbol.num;i++) 
      if (ptr->symbol.buf[i] !=NULL) XMLDBFreeBuffer(ptr->symbol.buf[i]);
    free(ptr->symbol.buf);
  }
 if (ptr->symbol.state !=NULL) free(ptr->symbol.state);

  if (ptr->buf !=NULL) free(ptr->buf);
  free(ptr);
}
예제 #9
0
파일: entity.c 프로젝트: asreimer/VTRST3.5
int EntityAddSymbolString(struct Entitydata *ptr,char *str) {
  struct XMLDBbuffer *tmp=NULL;
  int s=0; 
  if (str !=NULL) {
    tmp=XMLDBMakeBuffer(100);
    if (tmp==NULL) return -1;
    s=XMLDBAddBuffer(tmp,str,strlen(str));
  }
  if (s==0) s=EntityAddSymbol(ptr,tmp);
  if (tmp !=NULL) XMLDBFreeBuffer(tmp);
  return s;
}
예제 #10
0
struct XMLDBbuffer *ApplyModifier(struct XMLDBbuffer *mod,char *name,
                                  struct XMLDBbuffer *txt) {
  struct XMLDBbuffer *dst; 
  struct XMLDBbuffer *nxml;
  char *vraw,*vurl,*vhtml;
  char *nraw,*nurl,*nhtml;
  
  struct Entitydata *ent=NULL;
  ent=EntityMake();

  vraw=XMLToRaw(txt);
  vurl=XMLToURL(txt);
  vhtml=XMLToHTML(txt);
 
  nraw=name;
  nurl=CGIMakeURLString(name,strlen(name));
  nhtml=RawToHTML(name,strlen(name));
  nxml=RawToXML(name,strlen(name));
 
  EntityAddEntityString(ent,"&vraw;");
  EntityAddSymbolString(ent,vraw);
  EntityAddEntityString(ent,"&nraw;");
  EntityAddSymbolString(ent,nraw);

  EntityAddEntityString(ent,"&vurl;");
  EntityAddSymbolString(ent,vurl);
  EntityAddEntityString(ent,"&nurl;");
  EntityAddSymbolString(ent,nurl);

  EntityAddEntityString(ent,"&vhtml;");
  EntityAddSymbolString(ent,vhtml);
  EntityAddEntityString(ent,"&nhtml;");
  EntityAddSymbolString(ent,nhtml);

  EntityAddEntityString(ent,"&vxml;");
  EntityAddSymbol(ent,txt);
  EntityAddEntityString(ent,"&nxml;");
  EntityAddSymbol(ent,nxml);


  dst=EntityDecodeBuffer(ent,mod);
  
  free(vraw);
  free(vurl);
  free(vhtml);
  free(nurl);
  free(nhtml);
  XMLDBFreeBuffer(nxml);
  free(ent);
  return dst;
}
예제 #11
0
파일: entity.c 프로젝트: asreimer/VTRST3.5
int EntityAddSymbolStringArray(struct Entitydata *ptr,char **str) {
  struct XMLDBbuffer *tmp=NULL;
  int s=0,n=0;

  for (n=0;str[n] !=NULL;n++) {
    
    tmp=XMLDBMakeBuffer(100);
    if (tmp==NULL) return -1;
    s=XMLDBAddBuffer(tmp,str[n],strlen(str[n]));
    if (s==0) s=EntityAddSymbol(ptr,tmp);
    XMLDBFreeBuffer(tmp);
    if (s !=0) break;
  }
  
  return s;
}
예제 #12
0
파일: entity.c 프로젝트: asreimer/VTRST3.5
struct XMLDBbuffer *EntityEncodeBuffer(struct Entitydata *ptr,
                                       struct XMLDBbuffer *src) {
  int s=0;
  struct XMLDBbuffer *dst=NULL;
  if (src==NULL) return NULL;
  dst=XMLDBMakeBuffer(src->stp);
  if (dst==NULL) return NULL;
  EntitySetText(ptr,EntityBuffer,dst);
  s=EntityEncode(src->buf,src->sze,ptr);
  if (s==0) s=EntityEncode(NULL,0,ptr);
  if (s !=0) {
    XMLDBFreeBuffer(dst);
    return NULL;
  }
  return dst;
}
예제 #13
0
char *getDBstring(struct XMLDBbuffer *ptr) {
  int s=0;
  char *str=NULL;
  char zero[1];
  struct XMLDBbuffer *decode=NULL;  

  zero[0]=0;
  decode=XMLDBCopyBuffer(ptr);
  if (decode==NULL) return NULL;
  s=XMLDBAddBuffer(decode,zero,1);
  if (s !=0) {
    XMLDBFreeBuffer(decode);
    return NULL;
  }
  str=decode->buf;
  free(decode);
  return str;
}
예제 #14
0
파일: element.c 프로젝트: ajribeiro/VT_RST3
void XMLDBFreeElement(struct XMLDBelement *ptr) {
  int i;

  if (ptr==NULL) return;
  if (ptr->data !=NULL) XMLDBFreeBuffer(ptr->data);
  if (ptr->name !=NULL) free(ptr->name);

  if (ptr->atnum>0) {
    for (i=0;i<ptr->atnum;i++) {
      if ((ptr->atname !=NULL) && (ptr->atname[i] !=NULL)) 
          free(ptr->atname[i]);
      if ((ptr->atval !=NULL) && (ptr->atval[i] !=NULL)) free(ptr->atval[i]);
    }
    if (ptr->atname !=NULL) free(ptr->atname);
    if (ptr->atval !=NULL) free(ptr->atval);
  }
  free(ptr);

}
예제 #15
0
void XMLdocFree(struct XMLdocdata *ptr) {
  int i;
  if (ptr==NULL) return;
  if (ptr->ent !=NULL) EntityFree(ptr->ent);
  if (ptr->tag !=NULL) TagDBFree(ptr->tag);
  if (ptr->tagdb !=NULL) TagDBFreeTable(ptr->tagdb);
  

  /* free up the rest of this stuff */
  if (ptr->root !=NULL) XMLDBFreeBuffer(ptr->root);
  if (ptr->xml.ptr !=NULL) {
    for (i=0;i<ptr->xml.num;i++) {
      XMLdocFreeElement(ptr->xml.ptr[i]);
    }
    free(ptr->xml.ptr);
  }
  free(ptr);
  return;
}
예제 #16
0
파일: xmldoc.c 프로젝트: ajribeiro/VT_RST3
int cmp(char *name,struct XMLDBbuffer *ptr,void *data) {
  
  /* Search for a string in an XMLDB buffer structure */

  char zero[1];
  char *dst;
  int s=0;
  struct XMLDBbuffer *src=NULL;

  zero[0]=0;
  dst=(char *)data;
 
  src=XMLDBCopyBuffer(ptr);
  if (src==NULL) return -1;
  XMLDBAddBuffer(src,zero,1);
  if (strcmp(src->buf,dst)==0) s=1;
  XMLDBFreeBuffer(src); 
  return s;
  
}
예제 #17
0
파일: element.c 프로젝트: ajribeiro/VT_RST3
struct XMLDBelement *XMLDBMakeElement(char *name,char end,int atnum, 
                                     char **atname,char **atval,int stp) {
  int s=0,i=0;
  struct XMLDBelement *ptr;

  ptr=malloc(sizeof(struct XMLDBelement));
  if (ptr==NULL) return NULL;
 
  ptr->name=malloc(strlen(name)+1);  
  if (ptr->name==NULL) {
    free(ptr);
    return NULL;
  }

  strcpy(ptr->name,name);
  ptr->data=NULL;
  ptr->atnum=atnum;
  ptr->atname=NULL;
  ptr->atval=NULL;
  ptr->end=end;


  if (atnum !=0) {
    ptr->atname=malloc(sizeof(char *)*atnum);
    if (ptr->atname==NULL) s=-1;
    if (s==0) ptr->atval=malloc(sizeof(char *)*atnum);
    if (ptr->atval==NULL) s=-1;

    if (s==0) for (i=0;i<atnum;i++) {
      ptr->atname[i]=NULL;
      ptr->atval[i]=NULL;
 
      if (atname[i] !=NULL) {
	ptr->atname[i]=malloc(strlen(atname[i])+1);
        if (ptr->atname[i]==NULL) break;
        strcpy(ptr->atname[i],atname[i]);
      }

      if (atval[i] !=NULL) {
	ptr->atval[i]=malloc(strlen(atval[i])+1);
        if (ptr->atval[i]==NULL) break;
        strcpy(ptr->atval[i],atval[i]);
      }
      
    }
    if (i<atnum) s=-1;
    ptr->atnum=atnum;
  }

  

  if (s==0) ptr->data=XMLDBMakeBuffer(stp);
  if (ptr->data==NULL) s=-1;

  if (s !=0) {
    for (i=0;i<atnum;i++) {
      if ((ptr->atname !=NULL) && (ptr->atname[i] !=NULL)) 
        free(ptr->atname[i]);
      if ((ptr->atval !=NULL) && (ptr->atval[i] !=NULL)) 
        free(ptr->atval[i]);
    }
    if (ptr->atname !=NULL) free(ptr->atname);
    if (ptr->atval !=NULL) free(ptr->atval);
    if (ptr->data !=NULL) XMLDBFreeBuffer(ptr->data);
    free(ptr->name);
    free(ptr);
    return NULL;
  }
 
  return ptr;
}
예제 #18
0
int xmldocbuild(struct XMLDBtable *ptr,struct XMLDBtable *tree,void *data) {

  int i,j;
  struct xmldoc *xmldoc;
  struct XMLDBelement *e;
  char zero[1]={0};

  char *symbol[]={"\"","\\","<",">","&",0};
  char *entity[]={"&quot;","&apos;","&lt;","&gt;","&amp;",0};
  struct Entitydata *entptr;

  entptr=EntityMake();
  if (entptr==NULL) return -1;
  EntityAddEntityStringArray(entptr,entity);
  EntityAddSymbolStringArray(entptr,symbol);

  xmldoc=(struct xmldoc *)data;

  for (i=0;i<ptr->num;i++) {
    e=ptr->element[i];
  
     if (strcmp(e->name,"tree")==0) {
      XMLdocGetConfigSection(e->data,"tree","tree",decodetree,xmldoc);
     } else if (strcmp(e->name,"match")==0) {
      XMLdocGetConfigSection(e->data,"match","match",decodematch,xmldoc);
    } else if (strcmp(e->name,"script")==0) {
      if (xmldoc->sc.buf !=NULL) 
      XMLDBFreeBuffer(xmldoc->sc.buf);
      xmldoc->sc.type=0;
      for (j=0;j<e->atnum;j++) {
	if ((e->atval[j] !=NULL) && (strcmp(e->atval[j],"file")==0)) 
        xmldoc->sc.type=1;
      }
      if (xmldoc->sc.type==1) { 
        xmldoc->sc.buf=XMLDBCopyBuffer(e->data);
        XMLDBAddBuffer(xmldoc->sc.buf,zero,1);
      } else xmldoc->sc.buf=EntityDecodeBuffer(entptr,e->data);
      if (xmldoc->sc.buf==NULL) break;
    } else if (strcmp(e->name,"map")==0) {
      XMLdocGetConfigSection(e->data,"map","map/entry",decodemap,xmldoc);
    } else if (strcmp(e->name,"external")==0) {
      int xtp=0;
      for (j=0;j<e->atnum;j++) {
         if ((e->atval[j] !=NULL) && (strcmp(e->atval[j],"file")==0)) xtp=1;
      }  

      if (xtp==0)
         XMLdocGetConfigSection(e->data,"external","external/entry",
                                decodeexternal,xmldoc);
       else {
         char *fname=NULL;
         FILE *fp;
         fname=getDBstring(e->data);
         
         if (fname==NULL) break;
         fp=fopen(fname,"r");
         if (fp !=NULL) { 
           loadexternal(fp,xmldoc);
           fclose(fp);
         }
       }
    } else if (strcmp(e->name,"xmldoc")==0) {
      int xtp=0;
      if (xmldoc->doc !=NULL) XMLdocFree(xmldoc->doc);
      xmldoc->doc=XMLdocMake();

      for (j=0;j<e->atnum;j++) {
         if ((e->atval[j] !=NULL) && (strcmp(e->atval[j],"file")==0)) xtp=1;
      }  

      if (xtp==0)
         XMLdocGetConfigSection(e->data,"xmldoc","xmldoc",XMLdocBuild,
                             xmldoc->doc);
       else {
         char *fname=NULL;
         FILE *fp;
         fname=getDBstring(e->data);
         
         if (fname==NULL) break;
         fp=fopen(fname,"r");
         if (fp !=NULL) { 
           loadXMLdoc(fp,xmldoc->doc);
           fclose(fp);
         }
       }
    }
  
  }
  free(entptr);
  return 0;
}
예제 #19
0
int decodeexternal(struct XMLDBtable *ptr,struct XMLDBtable *tree,void *data) {

  int i,s=0,n;
  struct xmldoc *xmldoc;
  struct XMLDBelement *e;
  struct XMLDBbuffer *dbuf=NULL;
  char *search=NULL;
  char *replace=NULL;

  char *symbol[]={"\"","\\","<",">","&",0};
  char *entity[]={"&quot;","&apos;","&lt;","&gt;","&amp;",0};
  struct Entitydata *entptr;

  entptr=EntityMake();
  if (entptr==NULL) return -1;
  EntityAddEntityStringArray(entptr,entity);
  EntityAddSymbolStringArray(entptr,symbol);


  xmldoc=(struct xmldoc *)data;

  for (i=0;i<ptr->num;i++) {
    e=ptr->element[i];
    if (strcmp(e->name,"search")==0) {
      if (search !=NULL) free(search);
      search=getDBstring(e->data);
      if (search==NULL) break;
    } else if (strcmp(e->name,"replace")==0) {
      if (replace !=NULL) free(replace);
      dbuf=EntityDecodeBuffer(entptr,e->data);
      if (dbuf !=NULL) {
	replace=getDBstring(dbuf);
        XMLDBFreeBuffer(dbuf);
      }
      if (replace==NULL) break;
     }
  }
  if (i<ptr->num) s=-1;  

  if ((s==0) && (search !=NULL)) {
    n=xmldoc->external.search.num; 
    if (s==0) {
      if (xmldoc->external.search.txt==NULL) 
        xmldoc->external.search.txt=malloc(sizeof(char *));
      else xmldoc->external.search.txt=realloc(xmldoc->external.search.txt,
                                     sizeof(char *)*(n+1));
      if (xmldoc->external.search.txt==NULL) s=-1;
      if (s==0) xmldoc->external.search.txt[n]=NULL;
    }


    if (s==0) {
      if (xmldoc->external.replace.txt==NULL) 
         xmldoc->external.replace.txt=malloc(sizeof(char *));
      else xmldoc->external.replace.txt=realloc(xmldoc->external.replace.txt,
                                     sizeof(char *)*(n+1));
      if (xmldoc->external.replace.txt==NULL) s=-1;
      if (s==0) xmldoc->external.replace.txt[n]=NULL;
    }

    if (s==0) {
      xmldoc->external.search.txt[n]=search;
      xmldoc->external.replace.txt[n]=replace;
      xmldoc->external.search.num++;
      xmldoc->external.replace.num++;
      
    }
  }
  free(entptr);
  if (s !=0) {
    if (search !=NULL) free(search);
    if (replace !=NULL) free(replace);
    return -1;
  }
  return 0;
}
예제 #20
0
파일: xmldoc.c 프로젝트: ajribeiro/VT_RST3
int main(int argc,char *argv[]) {
  int s=0,m,n;
  FILE *fp;
  FILE *xmlfp;
  unsigned char help=0;
  unsigned char option=0;
  unsigned char ilf=0; 
  char *pathstr=NULL;
  char *scstr=NULL;
  int sctype=0;

  struct XMLDBbuffer *scbuf=NULL;  

  struct XMLdata *xmldata=NULL;
  struct XMLDBdata *xmldbdata=NULL;
  struct XMLDBtree *tree=NULL;

  char *symbol[]={"\"","\\","<",">","&",0};
  char *entity[]={"&quot;","&apos;","&lt;","&gt;","&amp;",0};
  struct Entitydata *entptr;

  struct OptionText *ignore=NULL;
  struct OptionText *remove=NULL;


  char lbuf[255];
  char zero[1]={0};

  entptr=EntityMake();
 
  EntityAddEntityStringArray(entptr,entity);
  EntityAddSymbolStringArray(entptr,symbol);
 
  OptionAdd(&opt,"-help",'x',&help);
  OptionAdd(&opt,"-option",'x',&option);

  OptionAdd(&opt,"ilf",'x',&ilf);

  OptionAdd(&opt,"i",'a',&ignore);
  OptionAdd(&opt,"r",'a',&remove);

  OptionAdd(&opt,"path",'t',&pathstr);
  OptionAdd(&opt,"script",'t',&scstr);
  OptionAdd(&opt,"sctype",'i',&sctype);

  arg=OptionProcess(1,argc,argv,&opt,NULL);   

  if (help==1) {
    OptionPrintInfo(stdout,hlpstr);
    exit(0);
  } 

  if (option==1) {
    OptionDump(stdout,&opt);
    exit(0);
  }
 

  if ((argc-arg)<3) {
    fprintf(stderr,"xmldoc pwd cfgfile xmldata\n");
    exit(-1);
  }
 
  xmlfp=fopen(argv[arg+2],"r");
  if (xmlfp==NULL) {
    fprintf(stderr,"file not found.\n");
    exit(-1);
  }

  chdir(argv[arg]);

  fp=fopen(argv[arg+1],"r");
  loadconfig(fp,&xmldoc);
  fclose(fp);

 
  if (argc>3) xmldoc.compare.data=argv[arg+3];
  else xmldoc.compare.data=NULL;

  xmldoc.compare.check=cmp;  

  xmldoc.map.iflg=-1;

  if (pathstr !=NULL) {
    free(xmldoc.tree.path);
    xmldoc.tree.path=pathstr;   
  }

  if (scstr !=NULL) {
    xmldoc.sc.type=sctype;
    scbuf=XMLDBMakeBuffer(64);
    XMLDBAddBuffer(scbuf,scstr,strlen(scstr));
    XMLDBFreeBuffer(xmldoc.sc.buf);

    if (sctype==1) {
      xmldoc.sc.buf=XMLDBCopyBuffer(scbuf);
      XMLDBAddBuffer(xmldoc.sc.buf,zero,1);
    } else xmldoc.sc.buf=EntityDecodeBuffer(entptr,scbuf);
    XMLDBFreeBuffer(scbuf);
  }
  
  xmldata=XMLMake();
  xmldbdata=XMLDBMake(xmldata);
  tree=XMLDBMakeTree();

  XMLDBBuildTree(xmldoc.tree.path,xmldoc.tree.delim,tree);
  XMLDBSetTree(xmldbdata,tree);
    
  /* Set the renderer to XMLrender */

  XMLDBSetText(xmldbdata,render,&xmldoc);

  XMLSetStart(xmldata,XMLDBStart,xmldbdata);
  XMLSetEnd(xmldata,XMLDBEnd,xmldbdata); 
  XMLSetComment(xmldata,redirect,xmldata);  

  xmldoc.script=ScriptMake();
  ScriptSetText(xmldoc.script,mapxml,&xmldoc);

  XMLdocSetText(xmldoc.doc,stream_output,stdout);

  if (remove !=NULL) {

    xmldoc.map.remove.num=remove->num;
    xmldoc.map.remove.txt=remove->txt;
  }

  if (ignore !=NULL) {
    xmldoc.map.ignore.num=ignore->num;
    xmldoc.map.ignore.txt=ignore->txt;
  }


  while(fgets(lbuf,255,xmlfp) !=NULL) {
    if (ilf) {
      m=0;
      for (n=0;(lbuf[n] !=0) && (n<256);n++) {
        if (lbuf[n]=='\n') continue;
        lbuf[m]=lbuf[n];
        m++;
      }    
      lbuf[m]=0;
    }
    s=XMLDecode(xmldata,lbuf,strlen(lbuf));
    if (s !=0) break;
  }

  XMLFree(xmldata);
  XMLDBFree(xmldbdata);
  XMLDBFreeTree(tree);
  ScriptFree(xmldoc.script);
  fclose(xmlfp); 
  fflush(stdout);  
  return 0;

}
예제 #21
0
파일: tagdb.c 프로젝트: ajribeiro/VT_RST3
int TagDBStart(char *name,char end,int atnum,char **atname,char **atval,
                char *buf,int sze,void *data) {
  int i;
 
  struct TagDBdata *ptr=NULL;
  struct TagDBtable *tagdb=NULL;
  struct TagDBtag *t=NULL;
  
  ptr=(struct TagDBdata *) data;

  if (ptr->text.func==NULL) return 0;

  tagdb=ptr->tagdb;

  if (tagdb !=NULL) {
    for (i=0;i<tagdb->num;i++) {
      t=tagdb->tag[i];
      if (strcmp(name,t->name)==0) break;
    }
    if (i<tagdb->num) {
      /* buffer attributes */
  
      struct XMLDBbuffer *abuf=NULL;
      struct XMLDBbuffer *tbuf=NULL;
      struct Entitydata *entptr;

      entptr=EntityMake();
      if (entptr==NULL) return -1;
      EntityAddEntityString(entptr,"&attr;");
    
      abuf=XMLDBMakeBuffer(100);
    
      for (i=0;i<atnum;i++) {
        if (i !=0) XMLDBAddBuffer(abuf," ",1);
        XMLDBAddBuffer(abuf,atname[i],strlen(atname[i]));
        if (atval[i] !=0) {
          XMLDBAddBuffer(abuf,"=\"",2);
          XMLDBAddBuffer(abuf,atval[i],strlen(atval[i]));
          XMLDBAddBuffer(abuf,"\"",1);
        }
      
      }
      if (end !=0) XMLDBAddBuffer(abuf,&end,1);
      EntityAddSymbol(entptr,abuf);

      tbuf=EntityDecodeBuffer(entptr,t->start.decode); 
     
      if (tbuf==NULL) return -1;

      (ptr->text.func)(tbuf->buf,
                      tbuf->sze,ptr->text.data);
      XMLDBFreeBuffer(tbuf);
      XMLDBFreeBuffer(abuf);
      EntityFree(entptr);
      return 0;
    }
  }
  (ptr->text.func)("<",1,ptr->text.data);
  (ptr->text.func)(name,strlen(name),ptr->text.data);
 
  for (i=0;i<atnum;i++) {
   
    (ptr->text.func)(" ",1,ptr->text.data);
    (ptr->text.func)(atname[i],strlen(atname[i]),ptr->text.data);
    if (atval[i] !=0) {
      (ptr->text.func)("=\"",2,ptr->text.data);
      (ptr->text.func)(atval[i],strlen(atval[i]),ptr->text.data);
      (ptr->text.func)("\"",1,ptr->text.data);
    }
  }


  if (end !=0) (ptr->text.func)(&end,1,ptr->text.data);
  (ptr->text.func)(">",1,ptr->text.data);
  return 0;
}