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[]={""","'","<",">","&",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; }
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); }
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); }
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); }
char *XMLToRaw(struct XMLDBbuffer *src) { char *symbol[]={"\"","\\","<",">","&",0}; char *entity[]={""","'","<",">","&",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; }
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); }
char *RawToHTML(char *buf,int sze) { char *symbol[]={"\"","\\","<",">","&","\n",0}; char *entity[]={""","'","<",">","&","<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; }
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); }
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; }
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; }
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; }
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; }
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; }
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); }
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; }
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; }
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; }
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[]={""","'","<",">","&",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; }
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[]={""","'","<",">","&",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; }
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[]={""","'","<",">","&",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; }
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; }