📄 xml.cpp
字号:
if (TargetMode == 2)
; // Nothing :)
else
if (TargetMode == 3)
fwrite(L">",1,1,fp);
else
fprintf(fp,">",b.operator char*());
}
}
if (ShowAll)
{
for(int i = 0 ; i < iC ; i++)
{
if (TotalComments && (NextComment < TotalComments))
{
while ((NextComment < TotalComments) && root->GetComments()[NextComment]->GetEP() <= i)
{
// print that comment now
char* t = root->GetComments()[NextComment]->operator char *();
Z<char> b(strlen(t) + deep + 200);
for(int i = 0 ; i < (deep + 1) ; i++)
// strcat(b,"\t");
strcat(b,DelimiterChar);
strcat(b,"<!--");
strcat(b,t);
strcat(b,"-->\r\n");
if (TargetMode == 1)
{
spi = sprintf(sp,"%s",b.operator char*());
sp += spi;
}
else
if (TargetMode == 2)
{
#ifdef _WIN32
#ifndef WINCE
// Create a comment
Z<char> VName(20);
sprintf(VName,"C%u",NextComment);
RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
}
else
if (TargetMode == 3)
Write16String(fp,b.operator char*());
else // 0
fprintf(fp,"%s",b.operator char*());
NextComment++;
}
}
if (TotalContents && (NextContent < TotalContents))
{
while ((NextContent < TotalContents) && root->GetContents()[NextContent]->GetEP() <= i)
{
// print that content now
//char* t = root->GetContents()[NextContent]->operator char *();
size_t vx = root->GetContents()[NextContent]->GetValue(0);
Z<char> b(vx + deep + 200);
if (root->xfformat.ElementsNoBreak == false)
{
for(int i = 0 ; i < (deep + 1) ; i++)
//strcat(b,"\t");
strcat(b,DelimiterChar);
//strcat(b,t);
}
root->GetContents()[NextContent]->GetValue(b.operator char*() + strlen(b),SaveMode);
if (root->xfformat.ElementsNoBreak == false)
strcat(b,"\r\n");
if (TargetMode == 1)
{
spi = sprintf(sp,"%s",b.operator char*());
sp += spi;
}
else
if (TargetMode == 2)
{
#ifdef _WIN32
#ifndef WINCE
// Create a content
Z<char> VName(20);
sprintf(VName,"D%u",NextContent);
root->GetContents()[NextContent]->GetValue(b,SaveMode);
RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)b.operator char *(),(int)(strlen(b) + 1));
#endif
#endif
}
else
if (TargetMode == 3)
Write16String(fp,b.operator char*());
else // 0
fprintf(fp,"%s",b.operator char*());
NextContent++;
}
if (TotalCDatas && (NextCData < TotalCDatas))
{
while ((NextCData < TotalCDatas) && root->GetCDatas()[NextCData]->GetEP() <= i)
{
// print that CData now
char* t = root->GetCDatas()[NextCData]->operator char *();
Z<char> b(strlen(t) + deep + 200);
for(int i = 0 ; i < (deep + 1) ; i++)
// strcat(b,"\t");
strcat(b,DelimiterChar);
strcat(b,"<![CDATA[");
strcat(b,t);
strcat(b,"]]>\r\n");
if (TargetMode == 1)
{
spi = sprintf(sp,"%s",b.operator char*());
sp += spi;
}
else
if (TargetMode == 2)
{
#ifdef _WIN32
#ifndef WINCE
// Create a cdata
Z<char> VName(20);
sprintf(VName,"D%u",NextCData);
RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
}
else
if (TargetMode == 3)
Write16String(fp,b.operator char*());
else // 0
fprintf(fp,"%s",b.operator char*());
NextCData++;
}
}
}
#ifdef _WIN32
if (TargetMode == 2)
printc((FILE*)pKey2,root->GetChildren()[i],deep + 1,ShowAll,SaveMode,TargetMode);
else
#endif
{
printc(fp,root->GetChildren()[i],deep + 1,ShowAll,SaveMode,TargetMode);
if (TargetMode == 1)
sp = (char*)fp + strlen((char*)fp);
}
}
}
// Check if there are still comments
if (TotalComments && (NextComment < TotalComments))
{
while (NextComment < TotalComments)
{
// print that comment now
char* t = root->GetComments()[NextComment]->operator char *();
Z<char> b(strlen(t) + deep + 200);
for(int i = 0 ; i < (deep + 1) ; i++)
//strcat(b,"\t");
strcat(b,DelimiterChar);
strcat(b,"<!--");
strcat(b,t);
strcat(b,"-->\r\n");
if (TargetMode == 1)
{
spi = sprintf(sp,"%s",b.operator char*());
sp += spi;
}
else
if (TargetMode == 2)
{
#ifdef _WIN32
#ifndef WINCE
// Create a comment
Z<char> VName(20);
sprintf(VName,"C%u",NextComment);
RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
}
else
if (TargetMode == 3)
Write16String(fp,b.operator char*());
else // 0
fprintf(fp,"%s",b.operator char*());
NextComment++;
}
}
// Check if there are still cdatas
if (TotalCDatas && (NextCData < TotalCDatas))
{
while (NextCData < TotalCDatas)
{
// print that CData now
char* t = root->GetCDatas()[NextCData]->operator char *();
size_t ix = strlen(t);
Z<char> b(strlen(t) + deep + 200);
for(int i = 0 ; i < (deep + 1) ; i++)
//strcat(b,"\t");
strcat(b,DelimiterChar);
strcat(b,"<![CDATA[");
strcat(b,t);
strcat(b,"]]>\r\n");
if (TargetMode == 1)
{
spi = sprintf(sp,"%s",b.operator char*());
sp += spi;
}
else
if (TargetMode == 2)
{
#ifdef _WIN32
#ifndef WINCE
// Create a cdata
Z<char> VName(20);
sprintf(VName,"D%u",NextCData);
RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
}
else
if (TargetMode == 3)
Write16String(fp,b.operator char*());
else // 0
fprintf(fp,"%s",b.operator char*());
NextCData++;
}
}
// Check if there are still Contents
if (TotalContents && (NextContent < TotalContents))
{
while (NextContent < TotalContents)
{
// print that content now
//char* t = root->GetContents()[NextContent]->operator char *();
size_t vx = root->GetContents()[NextContent]->GetValue(0);
Z<char> b(vx + deep + 200);
if (root->xfformat.ElementsNoBreak == false)
{
for(int i = 0 ; i < (deep + 1) ; i++)
//strcat(b,"\t");
strcat(b,DelimiterChar);
}
//strcat(b,t);
root->GetContents()[NextContent]->GetValue(b.operator char*() + strlen(b),SaveMode);
if (root->xfformat.ElementsNoBreak == false)
strcat(b,"\r\n");
if (TargetMode == 1)
{
spi = sprintf(sp,"%s",b.operator char*());
sp += spi;
}
else
if (TargetMode == 2)
{
#ifdef _WIN32
#ifndef WINCE
// Create a content
Z<char> VName(20);
sprintf(VName,"D%u",NextContent);
root->GetContents()[NextContent]->GetValue(b,SaveMode);
RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)b.operator char *(),(int)(strlen(b) + 1));
#endif
#endif
}
else
if (TargetMode == 3)
Write16String(fp,b.operator char*());
else // 0
fprintf(fp,"%s",b.operator char*());
NextContent++;
}
}
// ending
strcpy(b,"");
if (root->xfformat.ElementsNoBreak == false || iC || TotalCDatas || TotalComments || TotalContents != 1)
{
for(int i = 0 ; i < deep ; i++)
//strcat(b,"\t");
strcat(b,DelimiterChar);
}
strcat(b,"</");
root->GetElementName(b.operator char*() + strlen(b));
strcat(b,">\r\n");
if (TargetMode == 1)
{
spi = sprintf(sp,"%s",b.operator char*());
sp += spi;
}
else
if (TargetMode == 2)
{
// Nothing
#ifdef _WIN32
RegCloseKey(pKey2);
#endif
}
else
if (TargetMode == 3)
Write16String(fp,b.operator char*());
else // 0
fprintf(fp,"%s",b.operator char*());
}
void XMLElement :: SetExportFormatting(XMLEXPORTFORMAT* xf)
{
if (xf)
memcpy(&xfformat,xf,sizeof(XMLEXPORTFORMAT));
if (xfformat.nId > 50)
xfformat.nId = 50;
for(unsigned int i = 0 ; i < GetChildrenNum() ; i++)
GetChildren()[i]->SetExportFormatting(xf);
}
void XMLElement :: Export(FILE* fp,int ShowAll,XML_SAVE_MODE SaveMode,XML_TARGET_MODE TargetMode,XMLHeader* hdr,class XMLTransform* eclass,class XMLTransformData* edata)
{
// Export this element
ReloadAllElements();
if (eclass == 0)
{
if (hdr)
hdr->Export(fp,0,TargetMode,eclass,edata);
printc(fp,this,0,ShowAll,SaveMode,TargetMode);
if (hdr)
hdr->Export(fp,1,TargetMode,eclass,edata);
}
else
{
//* save to another fp, then encrypt with eclass to this fp
size_t S = MemoryUsage();
Z<char> ram(S);
XML_TARGET_MODE NewTargetMode = XML_TARGET_MODE_MEMORY;
if (hdr)
hdr->Export((FILE*)ram.operator char *(),0,NewTargetMode,eclass,edata);
printc((FILE*)ram.operator char *(),this,0,ShowAll,SaveMode,NewTargetMode);
if (hdr)
hdr->Export((FILE*)ram.operator char *(),1,NewTargetMode,eclass,edata);
Z<char> yy(S + 100);
// convert
//eclass->Prepare(edata);
S = strlen(ram);
size_t nS = eclass->Encrypt(ram.operator char *(),S,0,yy.operator char *(),S + 100,0);
// Write
if (TargetMode == 0)
fwrite(yy.operator char* (),1,nS,fp);
else
if (TargetMode == 1)
memcpy((char*)fp,yy.operator char *(),nS);
/* char* tf = ".\\a.tmp";
FILE* fpn = fopen(tf,"wb");
if (!fpn)
return;
// save
if (hdr)
hdr->Export(fp,0,TargetMode,eclass,edata);
printc(fpn,this,0,ShowAll,SaveMode,TargetMode);
if (hdr)
hdr->Export(fp,1,TargetMode,eclass,edata);
int S = ftell(fpn);
fclose(fpn);
// read a.tmp again
Z<char>* y = XML :: ReadToZ(tf);
XML :: Kill(tf);
Z<char> yy(S + 100);
// convert
eclass->Prepare(edata);
int nS = eclass->Encrypt((*y).operator char *(),S,0,yy.operator char *(),S + 100,0);
fwrite(yy.operator char* (),1,nS,fp);
delete y;
*/
}
}
int _USERENTRY XMLElementfcmp(const void * a, const void * b)
{
XMLElement* x1 = *(XMLElement**)a;
XMLElement* x2 = *(XMLElement**)b;
// compare names
size_t z1 = x1->GetElementName(0);
size_t z2 = x2->GetElementName(0);
Z<char> s1(z1 + 10);
Z<char> s2(z2 + 10);
x1->GetElementName(s1);
x2->GetElementName(s2);
return strcmpi(s1,s2);
}
int _USERENTRY XMLVariablefcmp(const void * a, const void * b)
{
XMLVariable* x1 = *(XMLVariable**)a;
XMLVariable* x2 = *(XMLVariable**)b;
// compare names
size_t z1 = x1->GetName(0);
size_t z2 = x2->GetName(0);
Z<char> s1(z1 + 10);
Z<char> s2(z2 + 10);
x1->GetName(s1);
x2->GetName(s2);
return strcmpi(s1,s2);
}
void XMLElement :: SortElements(int (_USERENTRY *fcmp)(const void *, const void *))
{
// to all elements
XMLElement** x = GetChildren();
int y = GetChildrenNum();
if (!fcmp)
qsort(x,y,sizeof(XMLElement*),XMLElementfcmp);
else
qsort(x,y,sizeof(XMLElement*),fcmp);
}
void XMLElement :: SortVariables(int (_USERENTRY *fcmp)(const void *, const void *))
{
// to all Variables
XMLVariable** x = GetVariables();
int y = GetVariableNum();
if (!fcmp)
qsort(x,y,sizeof(XMLVariable*),XMLVariablefcmp);
else
qsort(x,y,sizeof(XMLVariable*),fcmp);
}
// Memory usage funcs
size_t XML :: MemoryUsage()
{
return GetRootElement()->MemoryUsage() + GetHeader()->MemoryUsage();
}
void XML :: CompressMemory()
{
GetRootElement()->CompressMemory();
GetHeader()->CompressMemory();
}
bool XML :: IntegrityTest()
{
return (GetHeader()->IntegrityTest() && GetRootElement()->IntegrityTest());
}
int XML :: Compare(XML*x)
{
// 2 XML = equals if headers & root elements compare ok
int a1 = (GetRootElement()->Compare(x->GetRootElement()));
int a2 = (GetHeader()->Compare(x->GetHeader()));
return !(a1 == 0 && a2 == 0);
}
size_t XMLHeader :: MemoryUsage()
{
size_t m = 0;
// Our size
m += sizeof(*this);
// Comments
for(unsigned int i = 0 ; i < commentsnum ; i++)
{
m += GetComments()[i]->MemoryUsage();
}
// number of comment pointers
m += TotalCommentPointersAvailable*4;
// Text
if (hdr)
m += strlen(hdr);
return m;
}
void XMLHeader :: CompressMemory()
{
// Remove wasted space by comments
int P = commentsnum;
if (P == 0)
P = 1;
XMLComment** oldp = new XMLComment*[P];
if (commentsnum)
memcpy(oldp,comments,commentsnum*sizeof(XMLComment*));
TotalCommentPointersAvailable = P;
delete[] comments;
comments = oldp;
}
bool XMLHeader :: IntegrityTest()
{
if (!hdr)
return false;
#ifdef _WIN32
#ifndef WINCE
if (IsBadStringPtrA(hdr,-1))
return false;
// Comments pointer
if (IsBadReadPtr(comments,sizeof(XMLComment*)*commentsnum))
return false;
#endif
#endif
// Check comment
for(unsigned int i = 0 ; i < commentsnum ; i++)
{
#ifdef _WIN32
#ifndef WINCE
if (IsBadReadPtr(GetComments()[i],sizeof(XMLComment*)))
return false;
#endif
#endif
if (!GetComments()[i]->IntegrityTest())
return false;
}
return true;
}
int XMLHeader :: Compare(XMLHeader* x)
{
// 2 Headers compare ok <=> Same text, same # comments, comments compare ok
if (strcmp(hdr,x->hdr) != 0)
return 1; // fail header
unsigned int Y = GetCommentsNum();
if (Y != x->GetCommentsNum())
return 1;// differnet comment num
for(unsigned int i = 0 ; i < Y ; i++)
{
if (GetComments()[i]->Compare(x->GetComments()[i]) == 1)
return 1; // different comment
}
return 0; // OK!
}
size_t XMLComment :: MemoryUsage()
{
size_t m = 0;
// Our size
m += sizeof(*this);
// Comment size
if (c)
m += strlen(c);
return m;
}
void XMLComment :: CompressMemory()
{
}
bool XMLComment :: IntegrityTest()
{
// check parent,c
if (!c)
return false;
#ifdef _WIN32
#ifndef WINCE
if (IsBadStringPtrA(c,-1))
return false;
#endif
#endif
if (parent)
{
// Check pointer
#ifdef _WIN32
#ifndef WINCE
if (IsBadReadPtr(parent,sizeof(XMLElement*)))
return false;
#endif
#endif
}
return true;
}
int XMLComment :: Compare(XMLComment* x)
{
// Compare OK <=> Same Text
if (strcmp(c,x->c) != 0)
return 1;
return 0;
}
XMLComment* XMLComment :: Duplicate()
{
// returns a copy of myself
return new XMLComment(parent,ep,c);
}
size_t XMLContent :: MemoryUsage()
{
size_t m = 0;
// Our size
m += sizeof(*this);
// Comment size
if (c)
m += strlen(c);
return m;
}
void XMLContent :: CompressMemory()
{
}
bool XMLContent :: IntegrityTest()
{
// check parent,c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -