|
SNAP Library 2.0, User Reference
2013-05-13 16:33:57
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
#include <xml.h>
Public Member Functions | |
| void | SkipWs () |
| TXmlLx (const PSIn &_SIn, const TXmlSpacing &_Spacing=xspIntact) | |
| TXmlLx & | operator= (const TXmlLx &) |
| TXmlLxSym | GetSym () |
| TStr | GetSymStr () const |
| void | EThrow (const TStr &MsgStr) const |
| TStr | GetFPosStr () const |
| void | ClrArgV () |
| void | AddArg (const TStr &ArgNm, const TStr &ArgVal) |
| bool | IsArgNm (const TStr &ArgNm) const |
| int | GetArgs () const |
| void | GetArg (const int &ArgN, TStr &ArgNm, TStr &ArgVal) const |
| TStr | GetArgVal (const TStr &ArgNm, const TStr &DfVal=TStr()) const |
| bool | IsEntityNm (const TStr &EntityNm, TStr &EntityVal) const |
| void | PutEntityVal (const TStr &Nm, const TStr &Val) |
| bool | IsPEntityNm (const TStr &EntityNm, TStr &EntityVal) const |
| void | PutPEntityVal (const TStr &Nm, const TStr &Val) |
Static Public Member Functions | |
| static char | GetArgValQCh (const TStr &ArgVal) |
| static TStr | GetXmlLxSymStr (const TXmlLxSym &XmlLxSym) |
| static bool | IsTagNm (const TStr &Str) |
| static TStr | GetXmlStrFromPlainMem (const TMem &PlainMem) |
| static TStr | GetXmlStrFromPlainStr (const TChA &PlainChA) |
| static TStr | GetPlainStrFromXmlStr (const TStr &XmlStr) |
| static TStr | GetUsAsciiStrFromXmlStr (const TStr &EntRefStr) |
| static TStr | GetChRefFromYuEntRef (const TStr &YuEntRefStr) |
Public Attributes | |
| TXmlLxSym | Sym |
| TChA | TxtChA |
| TStr | TagNm |
| TStrKdV | ArgNmValKdV |
Private Member Functions | |
| uchar | GetCh () |
| void | PutCh (const uchar &_Ch) |
| void | PutStr (const TStr &Str) |
| void | ToNrSpacing () |
| void | GetWs (const bool &IsRq) |
| TStr | GetReference () |
| void | GetEq () |
| TStr | GetName () |
| TStr | GetName (const TStr &RqNm) |
| void | GetComment () |
| TStr | GetAttValue () |
| TStr | GetVersionNum () |
| TStr | GetEncName () |
| TStr | GetStalVal () |
| void | GetXmlDecl () |
| void | GetPI () |
| TStr | GetSystemLiteral () |
| TStr | GetPubidLiteral () |
| TStr | GetPEReference () |
| void | GetExternalId () |
| void | GetNData () |
| void | GetDocTypeDecl () |
| void | GetElement () |
| void | GetAttList () |
| TStr | GetEntityValue () |
| void | GetEntity () |
| void | GetNotation () |
| void | GetCDSect () |
Private Attributes | |
| PSIn | SIn |
| TSIn & | RSIn |
| TChA | ChStack |
| uchar | PrevCh |
| uchar | Ch |
| int | LnN |
| int | LnChN |
| int | ChN |
| TXmlSpacing | Spacing |
| TStrStrH | EntityNmToValH |
| TStrStrH | PEntityNmToValH |
Static Private Attributes | |
| static TXmlChDef | ChDef |
| TXmlLx::TXmlLx | ( | const PSIn & | _SIn, |
| const TXmlSpacing & | _Spacing = xspIntact |
||
| ) | [inline] |
| void TXmlLx::AddArg | ( | const TStr & | ArgNm, |
| const TStr & | ArgVal | ||
| ) | [inline] |
Definition at line 161 of file xml.h.
{
ArgNmValKdV.Add(TStrKd(ArgNm, ArgVal));}
| void TXmlLx::ClrArgV | ( | ) | [inline] |
Definition at line 160 of file xml.h.
{ArgNmValKdV.Clr();}
| void TXmlLx::EThrow | ( | const TStr & | MsgStr | ) | const |
Definition at line 885 of file xml.cpp.
{
TChA FPosChA;
FPosChA+=" [File:"; FPosChA+=SIn->GetSNm();
FPosChA+=" Line:"; FPosChA+=TInt::GetStr(LnN);
FPosChA+=" Char:"; FPosChA+=TInt::GetStr(LnChN);
FPosChA+="]";
TStr FullMsgStr=MsgStr+FPosChA;
TExcept::Throw(FullMsgStr);
}
| void TXmlLx::GetArg | ( | const int & | ArgN, |
| TStr & | ArgNm, | ||
| TStr & | ArgVal | ||
| ) | const [inline] |
Definition at line 166 of file xml.h.
{
ArgNm=ArgNmValKdV[ArgN].Key; ArgVal=ArgNmValKdV[ArgN].Dat;}
| int TXmlLx::GetArgs | ( | ) | const [inline] |
Definition at line 165 of file xml.h.
{return ArgNmValKdV.Len();}
| TStr TXmlLx::GetArgVal | ( | const TStr & | ArgNm, |
| const TStr & | DfVal = TStr() |
||
| ) | const [inline] |
Definition at line 168 of file xml.h.
{
int ArgN=ArgNmValKdV.SearchForw(TStrKd(ArgNm));
if (ArgN==-1){return DfVal;} else {return ArgNmValKdV[ArgN].Dat;}}
| static char TXmlLx::GetArgValQCh | ( | const TStr & | ArgVal | ) | [inline, static] |
| void TXmlLx::GetAttList | ( | ) | [private] |
| TStr TXmlLx::GetAttValue | ( | ) | [private] |
Definition at line 457 of file xml.cpp.
{
// [10] AttValue ::= '"' ([^<&"] | Reference)* '"'
// | "'" ([^<&'] | Reference)* "'"
uchar QCh=Ch;
if ((QCh!='"')&&(QCh!='\'')){EThrow("Invalid attribute-value start.");}
TChA ValChA; GetCh();
forever {
if ((Ch=='<')||(!ChDef.IsChar(Ch))){
EThrow("Invalid attribute-value character.");}
if (Ch==QCh){GetCh(); break;} // final quote
else if (Ch=='&'){GetCh(); ValChA+=GetReference();} // reference
else {ValChA+=Ch; GetCh();} // usual char
}
return ValChA;
}
| void TXmlLx::GetCDSect | ( | ) | [private] |
Definition at line 733 of file xml.cpp.
{
// [18] CDSect ::= CDStart CData CDEnd
// [19] CDStart ::= '<![CDATA{{['}}
// [20] CData ::= (Char* - (Char* ']]>' Char*))
// [21] CDEnd ::= ']]>'
if (Ch=='['){GetCh();}
else {EThrow("Invalid start of CDATA section.");}
TxtChA.Clr();
forever {
if (!ChDef.IsChar(Ch)){EThrow("Invalid CDATA character.");}
if ((Ch=='>')&&(TxtChA.Len()>=2)&&
(TxtChA.LastLastCh()==']') && (TxtChA.LastCh()==']')){
GetCh(); TxtChA.Pop(); TxtChA.Pop(); break;
} else {
TxtChA+=Ch; GetCh();
}
}
}
| uchar TXmlLx::GetCh | ( | ) | [private] |
| TStr TXmlLx::GetChRefFromYuEntRef | ( | const TStr & | YuEntRefStr | ) | [static] |
Definition at line 1072 of file xml.cpp.
{
TStr ChRefStr=YuEntRefStr;
ChRefStr.ChangeStrAll("&ch;", "è");
ChRefStr.ChangeStrAll("&Ch;", "È");
ChRefStr.ChangeStrAll("&sh;", "š");
ChRefStr.ChangeStrAll("&Sh;", "Š");
ChRefStr.ChangeStrAll("&zh;", "ž");
ChRefStr.ChangeStrAll("&Zh;", "Ž");
ChRefStr.ChangeStrAll("&cs", "c");
ChRefStr.ChangeStrAll("&Cs;", "C");
ChRefStr.ChangeStrAll("&dz;", "dz");
ChRefStr.ChangeStrAll("&Dz;", "Dz");
return ChRefStr;
}
| void TXmlLx::GetComment | ( | ) | [private] |
Definition at line 436 of file xml.cpp.
{
// [15] Comment ::= {{'<!-}}-' ((Char - '-') | ('-' (Char - '-')))* '-->'
if (GetCh()!='-'){EThrow("Invalid comment start.");}
TxtChA.Clr();
forever {
GetCh();
if (!ChDef.IsChar(Ch)){EThrow("Invalid comment character.");}
if (Ch=='-'){
if (GetCh()=='-'){
if (GetCh()=='>'){GetCh(); break;} // final bracket
else {EThrow("Invalid comment end.");}
} else {
if (!ChDef.IsChar(Ch)){EThrow("Invalid comment character.");}
TxtChA+='-'; TxtChA+=Ch; // special case if single '-'
}
} else {
TxtChA+=Ch; // usual char
}
}
}
| void TXmlLx::GetDocTypeDecl | ( | ) | [private] |
Definition at line 627 of file xml.cpp.
{
// [28] doctypedecl ::= {{'<!DOCTYPE'}} S Name (S ExternalID)? S?
// ('[' (markupdecl | PEReference | S)* ']' S?)? '>'
GetWs(true);
TStr DocTypeDeclNm=GetName();
GetWs(false);
if (Ch=='>'){GetCh(); return;}
if (Ch!='['){GetExternalId();}
GetWs(false);
if (Ch=='['){
GetCh();
// [28] (markupdecl | PEReference | S)*
GetWs(false);
while (Ch!=']'){
if (ChDef.IsWs(Ch)){GetWs(true);}
else if (Ch=='%'){GetPEReference();}
else {
GetSym();
}
}
GetCh();
}
GetWs(false);
// '>'
if (Ch=='>'){GetCh();}
else {EThrow("Invalid end-of-tag in document-type-declaration.");}
TagNm=DocTypeDeclNm;
}
| void TXmlLx::GetElement | ( | ) | [private] |
| TStr TXmlLx::GetEncName | ( | ) | [private] |
Definition at line 493 of file xml.cpp.
{
// [80] EncodingDecl ::= {{S 'encoding' Eq}} ('"' EncName '"' | "'" EncName "'" )
// [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
char QCh=Ch;
if ((Ch!='\'')&&(Ch!='"')){EThrow("Quote character (' or \") expected.");}
TChA EncNmChA;
GetCh();
if ((('a'<=Ch)&&(Ch<='z'))||(('A'<=Ch)&&(Ch<='Z'))){EncNmChA+=Ch;}
else {EThrow("Invalid encoding-name character.");}
GetCh();
while (Ch!=QCh){
if ((('a'<=Ch)&&(Ch<='z'))||(('A'<=Ch)&&(Ch<='Z'))||
(('0'<=Ch)&&(Ch<='9'))||(Ch=='.')||(Ch=='_')||(Ch=='-')){EncNmChA+=Ch;}
else {EThrow("Invalid version-number character.");}
GetCh();
}
GetCh();
return EncNmChA;
}
| void TXmlLx::GetEntity | ( | ) | [private] |
Definition at line 690 of file xml.cpp.
{
// [70] EntityDecl ::= GEDecl | PEDecl
// [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
// [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
GetWs(true); TStr EntityNm;
if (Ch=='%'){
GetCh(); GetWs(true); EntityNm=GetName(); GetWs(true);
// [74] PEDef ::= EntityValue | ExternalID
if ((Ch=='\"')||(Ch=='\'')){
TStr EntityVal=GetEntityValue();
PutPEntityVal(EntityNm, EntityVal);
} else {
GetExternalId();
GetWs(false);
if (Ch!='>'){GetNData();}
}
} else {
EntityNm=GetName(); GetWs(true);
// [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
if ((Ch=='\"')||(Ch=='\'')){
TStr EntityVal=GetEntityValue();
PutEntityVal(EntityNm, EntityVal);
} else {
GetExternalId();
}
}
GetWs(false);
if (Ch=='>'){GetCh();}
else {EThrow("Invalid end-of-tag in entity-declaration.");}
TagNm=EntityNm;
}
| TStr TXmlLx::GetEntityValue | ( | ) | [private] |
Definition at line 674 of file xml.cpp.
{
// [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'
// | "'" ([^%&'] | PEReference | Reference)* "'"
uchar QCh=Ch;
if ((QCh!='"')&&(QCh!='\'')){EThrow("Invalid entity-value start.");}
TChA ValChA; GetCh();
forever {
if (!ChDef.IsChar(Ch)){EThrow("Invalid entity-value character.");}
if (Ch==QCh){GetCh(); break;} // final quote
else if (Ch=='&'){GetCh(); ValChA+=GetReference();} // reference
else if (Ch=='%'){GetCh(); ValChA+=GetPEReference();} // pereference
else {ValChA+=Ch; GetCh();} // usual char
}
return ValChA;
}
| void TXmlLx::GetEq | ( | ) | [private] |
| void TXmlLx::GetExternalId | ( | ) | [private] |
Definition at line 609 of file xml.cpp.
{
// ExternalID ::= 'SYSTEM' S SystemLiteral
// | 'PUBLIC' S PubidLiteral S SystemLiteral
TStr ExtIdNm=GetName();
if (ExtIdNm=="SYSTEM"){
GetWs(true); GetSystemLiteral();
} else if (ExtIdNm=="PUBLIC"){
GetWs(true); GetPubidLiteral(); GetWs(true); GetSystemLiteral();
} else {
EThrow("Invalid external-id ('SYSTEM' or 'PUBLIC' expected).");
}
}
| TStr TXmlLx::GetFPosStr | ( | ) | const |
Definition at line 895 of file xml.cpp.
{
TChA FPosChA;
FPosChA+=" [File:"; FPosChA+=SIn->GetSNm();
FPosChA+=" Line:"; FPosChA+=TInt::GetStr(LnN);
FPosChA+=" Char:"; FPosChA+=TInt::GetStr(LnChN);
FPosChA+="]";
return FPosChA;
}
| TStr TXmlLx::GetName | ( | ) | [private] |
Definition at line 416 of file xml.cpp.
{
// [5] Name ::= (Letter | '_' | ':') (NameChar)*
TChA NmChA;
if (ChDef.IsFirstNameCh(Ch)){
do {NmChA+=Ch;} while (ChDef.IsName(GetCh()));
} else {
EThrow("Invalid first name character.");
// EThrow(TStr::Fmt("Invalid first name character [%u:'%c%c%c%c%c'].",
// uint(Ch), Ch, RSIn.GetCh(), RSIn.GetCh(), RSIn.GetCh(), RSIn.GetCh()));
}
return NmChA;
}
| TStr TXmlLx::GetName | ( | const TStr & | RqNm | ) | [private] |
| void TXmlLx::GetNData | ( | ) | [private] |
| void TXmlLx::GetNotation | ( | ) | [private] |
| TStr TXmlLx::GetPEReference | ( | ) | [private] |
Definition at line 397 of file xml.cpp.
{
// [69] PEReference ::= '%' Name ';'
TStr EntityNm=GetName();
if ((EntityNm.Empty())||(Ch!=';')){EThrow("Invalid PEntity-Reference.");}
GetCh();
TStr EntityVal;
if (IsPEntityNm(EntityNm, EntityVal)){/*intentionaly empty*/}
else {EThrow(TStr("PEntity-Reference (")+EntityNm+") does not exist.");}
return EntityVal;
}
| void TXmlLx::GetPI | ( | ) | [private] |
Definition at line 562 of file xml.cpp.
{
// [16] PI ::= {{'<?' PITarget}} (S (Char* - (Char* '?>' Char*)))? '?>'
// [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
GetWs(false);
TxtChA.Clr();
forever {
if (!ChDef.IsChar(Ch)){EThrow("Invalid PI character.");}
if (Ch=='?'){
if (GetCh()=='>'){
GetCh(); break;
} else {
if (!ChDef.IsChar(Ch)){EThrow("Invalid PI character.");}
TxtChA+='?'; TxtChA+=Ch; // special case if single '?'
}
} else {
TxtChA+=Ch; // usual char
}
GetCh();
}
}
| TStr TXmlLx::GetPlainStrFromXmlStr | ( | const TStr & | XmlStr | ) | [static] |
Definition at line 991 of file xml.cpp.
{
TChA PlainChA;
TChRet Ch(TStrIn::New(XmlStr));
Ch.GetCh();
while (!Ch.Eof()){
if (Ch()!='&'){
PlainChA+=Ch(); Ch.GetCh();
} else {
// [67] Reference ::= EntityRef | CharRef
if (Ch.GetCh()=='#'){
// [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
TChA RefChA; int RefCd=0;
if (Ch.GetCh()=='x'){
// hex-decimal character code
forever {
Ch.GetCh();
if (TCh::IsHex(Ch())){
RefChA+=Ch();
RefCd=RefCd*16+TCh::GetHex(Ch());
} else {
break;
}
}
} else {
// decimal character code
forever {
if (TCh::IsNum(Ch())){
RefChA+=Ch();
RefCd=RefCd*10+TCh::GetNum(Ch());
} else {
break;
}
Ch.GetCh();
}
}
if ((!RefChA.Empty())&&(Ch()==';')){
Ch.GetCh();
if (RefCd < 0x80) {
// ascii character
uchar RefCh=uchar(RefCd);
PlainChA+=RefCh;
} else {
// unicode
TUnicode::EncodeUtf8(RefCd, PlainChA);
}
}
} else {
// [68] EntityRef ::= '&' Name ';'
TChA EntityNm;
while ((!Ch.Eof())&&(Ch()!=';')){
EntityNm+=Ch(); Ch.GetCh();}
if ((!EntityNm.Empty())&&(Ch()==';')){
Ch.GetCh();
if (EntityNm=="quot"){PlainChA+='"';}
else if (EntityNm=="amp"){PlainChA+='&';}
else if (EntityNm=="apos"){PlainChA+='\'';}
else if (EntityNm=="lt"){PlainChA+='<';}
else if (EntityNm=="gt"){PlainChA+='>';}
}
}
}
}
return PlainChA;
}
| TStr TXmlLx::GetPubidLiteral | ( | ) | [private] |
Definition at line 596 of file xml.cpp.
{
// [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"
char QCh=Ch;
if ((Ch!='\'')&&(Ch!='"')){EThrow("Quote character (' or \") expected.");}
TChA LitChA; GetCh();
while (Ch!=QCh){
if (!ChDef.IsPubid(Ch)){EThrow("Invalid Public-Id-Literal character.");}
LitChA+=Ch; GetCh();
}
GetCh();
return LitChA;
}
| TStr TXmlLx::GetReference | ( | ) | [private] |
Definition at line 340 of file xml.cpp.
{
// [67] Reference ::= EntityRef | CharRef
if (Ch=='#'){
// [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
TChA RefChA; int RefCd=0;
if (GetCh()=='x'){
// hex-decimal character code
forever {
GetCh();
if (TCh::IsHex(Ch)){
RefChA+=Ch;
RefCd=RefCd*16+TCh::GetHex(Ch);
} else {
break;
}
}
} else {
// decimal character code
forever {
if (TCh::IsNum(Ch)){
RefChA+=Ch;
RefCd=RefCd*10+TCh::GetNum(Ch);
} else {
break;
}
GetCh();
}
}
if ((!RefChA.Empty())&&(Ch==';')){
GetCh();
if (RefCd < 0x80) {
// 8-bit char
uchar RefCh=uchar(RefCd);
return TStr(RefCh);
} else {
TStr ResStr = TUnicode::EncodeUtf8(RefCd);
return ResStr;
}
} else {
EThrow("Invalid Char-Reference."); Fail; return TStr();
}
} else {
// [68] EntityRef ::= '&' Name ';'
TStr EntityNm=GetName();
if ((!EntityNm.Empty())&&(Ch==';')){
GetCh();
TStr EntityVal;
if (IsEntityNm(EntityNm, EntityVal)){/*intentionaly empty*/}
else if (ChDef.IsEntityNm(EntityNm, EntityVal)){/*intentionaly empty*/}
else {EThrow(TStr("Entity-Reference (")+EntityNm+") does not exist.");}
return EntityVal;
} else {
EThrow("Invalid Entity-Reference."); Fail; return TStr();
}
}
}
| TStr TXmlLx::GetStalVal | ( | ) | [private] |
Definition at line 513 of file xml.cpp.
{
// [32] SDDecl ::= {{S 'standalone' Eq}}
// (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))
char QCh=Ch;
if ((Ch!='\'')&&(Ch!='"')){EThrow("Quote character (' or \") expected.");}
TChA StalChA;
GetCh();
while (Ch!=QCh){
if (('a'<=Ch)&&(Ch<='z')){StalChA+=Ch;}
else {EThrow("Invalid standalone-value character.");}
GetCh();
}
GetCh();
TStr StalVal=StalChA;
if ((StalVal=="yes")||(StalVal=="no")){return StalVal;}
else {EThrow("Invalid standalone-value."); Fail; return TStr();}
}
Definition at line 757 of file xml.cpp.
{
if (Ch=='<'){
GetCh(); ClrArgV();
if (Ch=='?'){
GetCh(); TagNm=GetName();
if (TagNm.GetLc()=="xml"){Sym=xsyXmlDecl; GetXmlDecl();}
else {Sym=xsyPI; GetPI();}
} else
if (Ch=='!'){
GetCh();
if (Ch=='['){
GetCh(); TagNm=GetName();
if (TagNm=="CDATA"){Sym=xsyQStr; GetCDSect();}
else {EThrow(TStr("Invalid tag after '<![' (")+TagNm+").");}
} else
if (Ch=='-'){
Sym=xsyComment; GetComment();
} else {
TagNm=GetName();
if (TagNm=="DOCTYPE"){GetDocTypeDecl(); Sym=xsyDocTypeDecl;}
else if (TagNm=="ELEMENT"){GetElement(); Sym=xsyElement;}
else if (TagNm=="ATTLIST"){GetAttList(); Sym=xsyAttList;}
else if (TagNm=="ENTITY"){GetEntity(); Sym=xsyEntity;}
else if (TagNm=="NOTATION"){GetNotation(); Sym=xsyNotation;}
else {EThrow(TStr("Invalid tag (")+TagNm+").");}
}
} else
if (Ch=='/'){
// xsyETag
GetCh(); Sym=xsyETag; TagNm=GetName(); GetWs(false);
if (Ch=='>'){GetCh();}
else {EThrow("Invalid End-Tag.");}
} else {
// xsySTag or xsySETag
TagNm=GetName(); GetWs(false);
while ((Ch!='>')&&(Ch!='/')){
TStr AttrNm=GetName();
GetEq();
TStr AttrVal=GetAttValue();
GetWs(false);
AddArg(AttrNm, AttrVal);
}
if (Ch=='/'){
if (GetCh()=='>'){Sym=xsySETag; GetCh();}
else {EThrow("Invalid Empty-Element-Tag.");}
} else {
Sym=xsySTag; GetCh();
}
}
if (Spacing==xspTruncate){SkipWs();}
} else
if (ChDef.IsWs(Ch)){
Sym=xsyWs; GetWs(true); ToNrSpacing();
if (Spacing==xspTruncate){GetSym();}
} else
if (Ch==TCh::EofCh){
Sym=xsyEof;
} else {
Sym=xsyStr; TxtChA.Clr();
// [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)
forever {
if (!ChDef.IsChar(Ch)){
EThrow(TUInt::GetStr(Ch, "Invalid character (%d)."));}
// GetCh(); continue; // skip invalid characters
if (Ch=='<'){break;} // tag
if (Ch=='&'){GetCh(); TxtChA+=GetReference();} // reference
else {
if ((Ch=='>')&&(TxtChA.Len()>=2)&&
(TxtChA.LastLastCh()==']')&&(TxtChA.LastCh()==']')){
EThrow("Forbidden substring ']]>' in character data.");}
TxtChA+=Ch; GetCh(); // usual char
}
}
ToNrSpacing();
}
return Sym;
}
| TStr TXmlLx::GetSymStr | ( | ) | const |
Definition at line 835 of file xml.cpp.
{
TChA SymChA;
switch (Sym){
case xsyUndef:
SymChA="{Undef}"; break;
case xsyWs:
SymChA+="{Space:'"; SymChA+=TStr(TxtChA).GetHex(); SymChA+="'}"; break;
case xsyComment:
SymChA+="<!--"; SymChA+=TxtChA; SymChA+="-->"; break;
case xsyXmlDecl:{
SymChA+="<?"; SymChA+=TagNm;
for (int ArgN=0; ArgN<GetArgs(); ArgN++){
TStr ArgNm; TStr ArgVal; GetArg(ArgN, ArgNm, ArgVal);
char ArgValQCh=GetArgValQCh(ArgVal);
SymChA+=' '; SymChA+=ArgNm; SymChA+='=';
SymChA+=ArgValQCh; SymChA+=ArgVal; SymChA+=ArgValQCh;
}
SymChA+="?>"; break;}
case xsyPI:
SymChA+="<?"; SymChA+=TagNm;
if (!TxtChA.Empty()){SymChA+=' '; SymChA+=TxtChA;}
SymChA+="?>"; break;
case xsyDocTypeDecl:
SymChA+="<!DOCTYPE "; SymChA+=TagNm; SymChA+=">"; break;
case xsySTag:
case xsySETag:{
SymChA+="<"; SymChA+=TagNm;
for (int ArgN=0; ArgN<GetArgs(); ArgN++){
TStr ArgNm; TStr ArgVal; GetArg(ArgN, ArgNm, ArgVal);
char ArgValQCh=GetArgValQCh(ArgVal);
SymChA+=' '; SymChA+=ArgNm; SymChA+='=';
SymChA+=ArgValQCh; SymChA+=ArgVal; SymChA+=ArgValQCh;
}
if (Sym==xsySTag){SymChA+=">";}
else if (Sym==xsySETag){SymChA+="/>";}
else {Fail;}
break;}
case xsyETag:
SymChA+="</"; SymChA+=TagNm; SymChA+=">"; break;
case xsyStr:
SymChA="{String:'"; SymChA+=TxtChA; SymChA+="'}"; break;
case xsyQStr:
SymChA="{QString:'"; SymChA+=TxtChA; SymChA+="'}"; break;
case xsyEof:
SymChA="{Eof}"; break;
default: Fail;
}
return SymChA;
}
| TStr TXmlLx::GetSystemLiteral | ( | ) | [private] |
Definition at line 583 of file xml.cpp.
{
// [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")
char QCh=Ch;
if ((Ch!='\'')&&(Ch!='"')){EThrow("Quote character (' or \") expected.");}
TChA LitChA; GetCh();
while (Ch!=QCh){
if (!ChDef.IsChar(Ch)){EThrow("Invalid System-Literal character.");}
LitChA+=Ch; GetCh();
}
GetCh();
return LitChA;
}
| TStr TXmlLx::GetUsAsciiStrFromXmlStr | ( | const TStr & | EntRefStr | ) | [static] |
Definition at line 1056 of file xml.cpp.
{
TStr UsAsciiStr=XmlStr;
UsAsciiStr.ChangeStrAll("è", "c");
UsAsciiStr.ChangeStrAll("È", "C");
UsAsciiStr.ChangeStrAll("š", "s");
UsAsciiStr.ChangeStrAll("Š", "S");
UsAsciiStr.ChangeStrAll("ž", "z");
UsAsciiStr.ChangeStrAll("Ž", "Z");
TChA UsAsciiChA=TXmlLx::GetPlainStrFromXmlStr(UsAsciiStr);
for (int ChN=0; ChN<UsAsciiChA.Len(); ChN++){
char Ch=UsAsciiChA[ChN];
if ((Ch<' ')||('~'<Ch)){UsAsciiChA.PutCh(ChN, 'x');}
}
return UsAsciiChA;
}
| TStr TXmlLx::GetVersionNum | ( | ) | [private] |
Definition at line 473 of file xml.cpp.
{
// [24] VersionInfo ::= {{S 'version' Eq}} (' VersionNum ' | " VersionNum ")
// [26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+
char QCh=Ch;
if ((Ch!='\'')&&(Ch!='"')){EThrow("Quote character (' or \") expected.");}
TChA VerNumChA;
GetCh();
do {
if ((('a'<=Ch)&&(Ch<='z'))||(('A'<=Ch)&&(Ch<='Z'))||
(('0'<=Ch)&&(Ch<='9'))||(Ch=='_')||(Ch=='.')||(Ch==':')||(Ch=='-')){
VerNumChA+=Ch;
} else {
EThrow("Invalid version-number character.");
}
GetCh();
} while (Ch!=QCh);
GetCh();
return VerNumChA;
}
| void TXmlLx::GetWs | ( | const bool & | IsRq | ) | [private] |
| void TXmlLx::GetXmlDecl | ( | ) | [private] |
Definition at line 531 of file xml.cpp.
{
// [23] XMLDecl ::= {{'<?xml'}}... VersionInfo EncodingDecl? SDDecl? S? '?>'
// [24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")
GetWs(true);
TStr VerNm=GetName("version"); GetEq(); TStr VerVal=GetVersionNum();
if (VerVal!="1.0"){EThrow("Invalid XML version.");}
AddArg(VerNm, VerVal);
GetWs(false);
if (Ch!='?'){
// EncodingDecl ::= {{S}} 'encoding' Eq
// ('"' EncName '"' | "'" EncName "'" )
TStr EncNm=GetName("encoding"); GetEq(); TStr EncVal=GetEncName();
AddArg(EncNm, EncVal);
}
GetWs(false);
if (Ch!='?'){
// SDDecl ::= {{S}} 'standalone' Eq
// (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))
TStr StalNm=GetName("standalone"); GetEq(); TStr StalVal=GetStalVal();
AddArg(StalNm, StalVal);
}
GetWs(false);
if (Ch=='?'){
GetCh();
if (Ch=='>'){GetCh();}
else {EThrow("Invalid end-of-tag in XML-declaration.");}
} else {
EThrow("Invalid end-of-tag in XML-declaration.");
}
}
| TStr TXmlLx::GetXmlLxSymStr | ( | const TXmlLxSym & | XmlLxSym | ) | [static] |
Definition at line 904 of file xml.cpp.
{
switch (XmlLxSym){
case xsyUndef: return "Undef";
case xsyWs: return "White-Space";
case xsyComment: return "Comment";
case xsyXmlDecl: return "Declaration";
case xsyPI: return "PI";
case xsyDocTypeDecl: return "Document-Type";
case xsyElement: return "Element";
case xsyAttList: return "Attribute-List";
case xsyEntity: return "Entity";
case xsyNotation: return "Notation";
case xsyTag: return "Tag";
case xsySTag: return "Start-Tag";
case xsyETag: return "End-Tag";
case xsySETag: return "Start-End-Tag";
case xsyStr: return "String";
case xsyQStr: return "Quoted-String";
case xsyEof: return "Eon-Of-File";
default: return "Undef";
}
}
| TStr TXmlLx::GetXmlStrFromPlainMem | ( | const TMem & | PlainMem | ) | [static] |
Definition at line 945 of file xml.cpp.
{
TChA XmlChA;
for (int ChN=0; ChN<PlainMem.Len(); ChN++){
uchar Ch=PlainMem[ChN];
if ((' '<=Ch)&&(Ch<='~')){
switch (Ch){
case '"': XmlChA+="""; break;
case '&': XmlChA+="&"; break;
case '\'': XmlChA+="'"; break;
case '<': XmlChA+="<"; break;
case '>': XmlChA+=">"; break;
default: XmlChA+=Ch;
}
} else
if ((Ch=='\r')||(Ch=='\n')){
XmlChA+=Ch;
} else {
XmlChA+='&'; XmlChA+='#'; XmlChA+=TUInt::GetStr(Ch); XmlChA+=';';
}
}
return XmlChA;
}
| TStr TXmlLx::GetXmlStrFromPlainStr | ( | const TChA & | PlainChA | ) | [static] |
Definition at line 968 of file xml.cpp.
{
TChA XmlChA;
for (int ChN=0; ChN<PlainChA.Len(); ChN++){
uchar Ch=PlainChA[ChN];
if ((' '<=Ch)&&(Ch<='~')){
switch (Ch){
case '"': XmlChA+="""; break;
case '&': XmlChA+="&"; break;
case '\'': XmlChA+="'"; break;
case '<': XmlChA+="<"; break;
case '>': XmlChA+=">"; break;
default: XmlChA+=Ch;
}
} else
if ((Ch=='\r')||(Ch=='\n')){
XmlChA+=Ch;
} else {
XmlChA+='&'; XmlChA+='#'; XmlChA+=TUInt::GetStr(Ch); XmlChA+=';';
}
}
return XmlChA;
}
| bool TXmlLx::IsArgNm | ( | const TStr & | ArgNm | ) | const [inline] |
Definition at line 163 of file xml.h.
{
return ArgNmValKdV.IsIn(TStrKd(ArgNm));}
| bool TXmlLx::IsEntityNm | ( | const TStr & | EntityNm, |
| TStr & | EntityVal | ||
| ) | const [inline] |
Definition at line 175 of file xml.h.
{
return EntityNmToValH.IsKeyGetDat(EntityNm, EntityVal);}
| bool TXmlLx::IsPEntityNm | ( | const TStr & | EntityNm, |
| TStr & | EntityVal | ||
| ) | const [inline] |
Definition at line 179 of file xml.h.
{
return PEntityNmToValH.IsKeyGetDat(EntityNm, EntityVal);}
| bool TXmlLx::IsTagNm | ( | const TStr & | Str | ) | [static] |
| void TXmlLx::PutCh | ( | const uchar & | _Ch | ) | [inline, private] |
| void TXmlLx::PutEntityVal | ( | const TStr & | Nm, |
| const TStr & | Val | ||
| ) | [inline] |
Definition at line 177 of file xml.h.
{
EntityNmToValH.AddDat(Nm, Val);}
| void TXmlLx::PutPEntityVal | ( | const TStr & | Nm, |
| const TStr & | Val | ||
| ) | [inline] |
Definition at line 181 of file xml.h.
{
PEntityNmToValH.AddDat(Nm, Val);}
| void TXmlLx::PutStr | ( | const TStr & | Str | ) | [inline, private] |
| void TXmlLx::SkipWs | ( | ) |
| void TXmlLx::ToNrSpacing | ( | ) | [private] |
Definition at line 270 of file xml.cpp.
{
if (Spacing==xspIntact){
} else
if (Spacing==xspPreserve){
int SrcChN=0; int DstChN=0;
while (SrcChN<TxtChA.Len()){
if (TxtChA[SrcChN]==TCh::CrCh){
TxtChA.PutCh(DstChN, TCh::LfCh); SrcChN++; DstChN++;
if ((SrcChN<TxtChA.Len())&&(TxtChA[SrcChN]==TCh::LfCh)){SrcChN++;}
} else {
if (SrcChN!=DstChN){
TxtChA.PutCh(DstChN, TxtChA[SrcChN]);}
SrcChN++; DstChN++;
}
}
TxtChA.Trunc(DstChN);
} else
if (Spacing==xspSeparate){
// squeeze series of white-spaces to single space
int SrcChN=0; int DstChN=0;
while (SrcChN<TxtChA.Len()){
if (ChDef.IsWs(TxtChA[SrcChN])){
if ((DstChN>0)&&(TxtChA[DstChN-1]==' ')){
SrcChN++;
} else {
TxtChA.PutCh(DstChN, ' ');
SrcChN++; DstChN++;
}
} else {
TxtChA.PutCh(DstChN, TxtChA[SrcChN]);
SrcChN++; DstChN++;
}
}
TxtChA.Trunc(DstChN);
} else
if (Spacing==xspTruncate){
// cut leading and trailing white-spaces and
// squeeze series of white-spaces to single space
int SrcChN=0; int DstChN=0;
while (SrcChN<TxtChA.Len()){
if (ChDef.IsWs(TxtChA[SrcChN])){
if ((DstChN>0)&&(TxtChA[DstChN-1]==' ')){
SrcChN++;
} else {
TxtChA.PutCh(DstChN, ' ');
SrcChN++; DstChN++;
}
} else {
TxtChA.PutCh(DstChN, TxtChA[SrcChN]);
SrcChN++; DstChN++;
}
}
TxtChA.Trunc(DstChN);
// delete trailing white-spaces
while ((TxtChA.Len()>0)&&(ChDef.IsWs(TxtChA.LastCh()))){
TxtChA.Pop();}
} else {
Fail;
}
}
uchar TXmlLx::Ch [private] |
TXmlChDef TXmlLx::ChDef [static, private] |
int TXmlLx::ChN [private] |
TChA TXmlLx::ChStack [private] |
TStrStrH TXmlLx::EntityNmToValH [private] |
int TXmlLx::LnChN [private] |
int TXmlLx::LnN [private] |
TStrStrH TXmlLx::PEntityNmToValH [private] |
uchar TXmlLx::PrevCh [private] |
TSIn& TXmlLx::RSIn [private] |
PSIn TXmlLx::SIn [private] |
TXmlSpacing TXmlLx::Spacing [private] |