From df8af387fb33d5ef645e41b554267aaafd2432bf Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Sat, 18 Oct 2008 09:14:43 +0000 Subject: [PATCH] Changed XML Parser to require standards-compilant XML header. Updated STX version to 0.3 svn-id: r34817 --- common/xmlparser.cpp | 56 +++++++++++++++--- common/xmlparser.h | 6 +- gui/theme.h | 2 +- gui/themes/default.inc | 3 + gui/themes/scummclassic.zip | Bin 43280 -> 43354 bytes gui/themes/scummclassic/THEMERC | 2 +- gui/themes/scummclassic/classic_gfx.stx | 2 +- gui/themes/scummclassic/classic_layout.stx | 2 +- .../scummclassic/classic_layout_320.stx | 2 +- gui/themes/scummmodern.zip | Bin 143567 -> 143656 bytes gui/themes/scummmodern/THEMERC | 2 +- gui/themes/scummmodern/scummodern_gfx.stx | 2 +- gui/themes/scummmodern/scummodern_layout.stx | 2 +- .../scummmodern/scummodern_layout_320.stx | 2 +- 14 files changed, 64 insertions(+), 19 deletions(-) diff --git a/common/xmlparser.cpp b/common/xmlparser.cpp index b3fb2e3cc57..2440a088038 100644 --- a/common/xmlparser.cpp +++ b/common/xmlparser.cpp @@ -54,7 +54,7 @@ bool XMLParser::parserError(const char *errorString, ...) { lineCount++; } - _stream->seek(-middle, SEEK_CUR); + _stream->seek(-MIN(middle, startPosition), SEEK_CUR); for (int i = 0, j = 0; i < kErrorMessageWidth; ++i, ++j) { c = _stream->readByte(); @@ -105,11 +105,32 @@ bool XMLParser::parserError(const char *errorString, ...) { return false; } +bool XMLParser::parseXMLHeader(ParserNode *node) { + assert(node->header); + + if (_activeKey.size() != 1) + return parserError("XML Header is expected in the global scope."); + + if (!node->values.contains("version")) + return parserError("Missing XML version in XML header."); + + if (node->values["version"] != "1.0") + return parserError("Unsupported XML version."); + + return true; +} + bool XMLParser::parseActiveKey(bool closed) { bool ignore = false; assert(_activeKey.empty() == false); ParserNode *key = _activeKey.top(); + + if (key->name == "xml" && key->header == true) { + assert(closed); + return parseXMLHeader(key) && closeKey(); + } + XMLKeyLayout *layout = (_activeKey.size() == 1) ? _XMLkeys : getParentNode(key)->layout; if (layout->children.contains(key->name)) { @@ -217,9 +238,10 @@ bool XMLParser::parse() { cleanup(); bool activeClosure = false; - bool selfClosure = false; + bool activeHeader = false; + bool selfClosure; - _state = kParserNeedKey; + _state = kParserNeedHeader; _activeKey.clear(); _char = _stream->readByte(); @@ -232,6 +254,7 @@ bool XMLParser::parse() { continue; switch (_state) { + case kParserNeedHeader: case kParserNeedKey: if (_char != '<') { parserError("Parser expecting key start."); @@ -243,7 +266,15 @@ bool XMLParser::parse() { break; } - if (_char == '/') { // FIXME: What if it's a comment start + if (_state == kParserNeedHeader) { + if (_char != '?') { + parserError("Expecting XML header."); + break; + } + + _char = _stream->readByte(); + activeHeader = true; + } else if (_char == '/') { _char = _stream->readByte(); activeClosure = true; } @@ -266,6 +297,7 @@ bool XMLParser::parse() { ParserNode *node = allocNode(); //new ParserNode; node->name = _token; node->ignore = false; + node->header = activeHeader; node->depth = _activeKey.size(); node->layout = 0; _activeKey.push(node); @@ -291,23 +323,29 @@ bool XMLParser::parse() { _char = _stream->readByte(); break; } - + selfClosure = false; - if (_char == '/') { // FIXME: comment start? + if (_char == '/' || (_char == '?' && activeHeader)) { selfClosure = true; _char = _stream->readByte(); } if (_char == '>') { - if (parseActiveKey(selfClosure)) { + if (activeHeader && !selfClosure) { + parserError("XML Header must be self-closed."); + } else if (parseActiveKey(selfClosure)) { _char = _stream->readByte(); _state = kParserNeedKey; } + + activeHeader = false; break; } - - if (!parseToken()) + + if (selfClosure) + parserError("Expecting key closure after '/' symbol."); + else if (!parseToken()) parserError("Error when parsing key value."); else _state = kParserNeedPropertyOperator; diff --git a/common/xmlparser.h b/common/xmlparser.h index f7a3c664e98..fd4788a426b 100644 --- a/common/xmlparser.h +++ b/common/xmlparser.h @@ -129,6 +129,7 @@ public: /** Active state for the parser */ enum ParserState { + kParserNeedHeader, kParserNeedKey, kParserNeedKeyName, @@ -166,6 +167,7 @@ public: Common::String name; Common::StringMap values; bool ignore; + bool header; int depth; XMLKeyLayout *layout; }; @@ -404,7 +406,7 @@ protected: _char = _stream->readByte(); } - return isspace(_char) != 0 || _char == '>' || _char == '=' || _char == '/'; + return isspace(_char) != 0 || _char == '>' || _char == '=' || _char == '/' || _char == '?'; } /** @@ -451,6 +453,8 @@ protected: va_end(args); return (*key == 0); } + + bool parseXMLHeader(ParserNode *node); /** * Overload if your parser needs to support parsing the same file diff --git a/gui/theme.h b/gui/theme.h index 45c81a06cf8..0b20613fe41 100644 --- a/gui/theme.h +++ b/gui/theme.h @@ -35,7 +35,7 @@ #include "graphics/fontman.h" #define THEME_VERSION 24 -#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.2" +#define SCUMMVM_THEME_VERSION_STR "SCUMMVM_STX0.3" namespace GUI { diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 348d013141b..a7adc49d7f2 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -1,3 +1,4 @@ +" " " " " " " " " " " " +" " " " " " " " @@ -907,6 +909,7 @@ " " " " " " +" " " " " " " " diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 2df5573a4e9ed0b8f1080fb4dd24614743800130..3ee5730303d8effdb9344d4186c51aec9dec8776 100644 GIT binary patch delta 638 zcmbPmiRsoQCX)bfW)=|!5SS7fWI5Z?{eS_G4Z`d|9OB{X>l)-79qb(H>l@}99~=^4 zpl3YMM4RtVM3CkEv`i;1c?Je9`Hi`nEcMAbiN(d4$@)+_K0U2MuehW_L4`{}S3$)y z#YzEP#@NKdz+Az|z`#P+&_LJFRKd{L%Gkup&>~8qBrz{PyA-S!s9o2N%f`MUH%Fl? zwWv5VKTp9{LCH|hK*=5`UX+@bl3Em>xtW=@QHmGjE;nn>u%#{x3`;jpl-I>{S59JO zerX8~ry)sF#dSG}n^je09Ki0H`sv1joz4slJ2(5K7~*nQys?o1Ubn#&Q0P7uQ1DGw zRFU5NH$&K-0~Y<0C06L7#qQ+b75efh0SgRVAz<==fhCPSlNYW~1gn9266jGem;xZZ Qq%m>w!xfrrek(wN0K5FT-2eap delta 522 zcmcb0iD|+mCX)bfW)=|!5D+N!w_KZX^oaqG4Z`d|9OB{X>l)-79qb(H>l@}99~=^4 zpl3AEM4N9xiNEDjzUAM3$T2YdklUE6$r6y8pORXXr(c|0nhRmZr>9lu6_->fsBkIh zDyVp-SSetUG&V6eGg2@zFtE@yG|)A$R4}x#GO)BVwVeErMR+qeYqu0H$TGJIk(6E+ z28Q0vi{*7`W7%Y#OzF*ODy$A7APf2D?>IfvnSlX>#eiWkd1Hpy=BX(nw6S}$PNtqc z2P_UIC#}#$3*yOhSLn;51OzZJgn;gXfhCPqlV7h;RKn(Vgc|b{h)*WFtQ25lSpkv& E08vt%WB>pF diff --git a/gui/themes/scummclassic/THEMERC b/gui/themes/scummclassic/THEMERC index 96f0528ddb3..ea13cb21b03 100644 --- a/gui/themes/scummclassic/THEMERC +++ b/gui/themes/scummclassic/THEMERC @@ -1 +1 @@ -[SCUMMVM_STX0.2:ScummVM Classic Theme:No Author] \ No newline at end of file +[SCUMMVM_STX0.3:ScummVM Classic Theme:No Author] \ No newline at end of file diff --git a/gui/themes/scummclassic/classic_gfx.stx b/gui/themes/scummclassic/classic_gfx.stx index a566e83e45f..7ec136c03d9 100644 --- a/gui/themes/scummclassic/classic_gfx.stx +++ b/gui/themes/scummclassic/classic_gfx.stx @@ -22,7 +22,7 @@ - $Id$ - --> - + - + diff --git a/gui/themes/scummclassic/classic_layout_320.stx b/gui/themes/scummclassic/classic_layout_320.stx index 792f54e45e9..7d925be9cb6 100644 --- a/gui/themes/scummclassic/classic_layout_320.stx +++ b/gui/themes/scummclassic/classic_layout_320.stx @@ -22,7 +22,7 @@ - $Id$ - --> - + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index d1700259db70ae6f31c460aa07c31bde58f20349..0de77c92fc00c44cb50095ede049f5cacefbed11 100644 GIT binary patch delta 516 zcmX^AkYmLo4wC?HW)=|!5SSYoWckl{o3=iX4Z`d|9OB{X>l)-79qb(H>l@}99~=^4 zpl94@vekrCO)xl`s;U$(%V0+U<`E> z2Kh=rf$bNs3j+fPOENG_pKrhV;7jO9U2g9i#QU_^mY1OrPNU8YAFFsXnQp}8NXhG9u#;q8^B@wc4anb&nrn}OlncDD+~G!}7lGb05f0|N_PLjzp{O9ev85r(vk6yy)#4^3LhEW~AUhb8Q1&(|my$%QE zHC{L~FuZWy-ua5rl?ct#ftsba$G>Mxvgd$#bNfj>rfx=5KTJj - + - + diff --git a/gui/themes/scummmodern/scummodern_layout_320.stx b/gui/themes/scummmodern/scummodern_layout_320.stx index 8c755b4ca23..c135d7e03ad 100644 --- a/gui/themes/scummmodern/scummodern_layout_320.stx +++ b/gui/themes/scummmodern/scummodern_layout_320.stx @@ -22,7 +22,7 @@ - $Id$ - --> - +