aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti2008-06-13 09:39:13 +0000
committerVicent Marti2008-06-13 09:39:13 +0000
commit5d92e2710a85f998f1f7bfbf4705880921d904e7 (patch)
treeacf22a73df94ad1f7e9c70d8509346637d8a68e1
parente0d7301cb04a99927091fdf51cec2d88fb68ad52 (diff)
downloadscummvm-rg350-5d92e2710a85f998f1f7bfbf4705880921d904e7.tar.gz
scummvm-rg350-5d92e2710a85f998f1f7bfbf4705880921d904e7.tar.bz2
scummvm-rg350-5d92e2710a85f998f1f7bfbf4705880921d904e7.zip
Parser cleanup.
svn-id: r32691
-rw-r--r--gui/ThemeParser.cpp43
-rw-r--r--gui/ThemeParser.h25
2 files changed, 35 insertions, 33 deletions
diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp
index c75340ada2..fc960ca4d7 100644
--- a/gui/ThemeParser.cpp
+++ b/gui/ThemeParser.cpp
@@ -100,8 +100,7 @@ void ThemeParser::parseKeyValue(Common::String &key_name) {
return;
}
- while (isspace(_text[_pos]))
- _pos++;
+ skipSpaces();
Common::String data;
@@ -131,18 +130,8 @@ bool ThemeParser::parse() {
if (_state == kParserError)
break;
- while (isspace(_text[_pos]))
- _pos++;
-
- // comment handling: skip everything between /* and */
- if (_text[_pos] == '/' && _text[_pos + 1] == '*') {
- _pos += 2;
- while (_text[_pos++]) {
- if (_text[_pos - 2] == '*' && _text[_pos - 1] == '/')
- break;
- }
- continue;
- }
+ skipSpaces();
+ skipComments();
switch (_state) {
case kParserNeedKey:
@@ -157,25 +146,26 @@ bool ThemeParser::parse() {
while (isValidNameChar(_text[_pos]))
_token += _text[_pos++];
- if (!_activeKey.empty() && _token == _activeKey.top()) {
+ if (_activeKey.empty() || _token != _activeKey.top())
+ parserError("Unexpected closure.");
+ else {
_activeKey.pop();
_keyValues.pop();
- while (isspace(_text[_pos]) || _text[_pos] == '>')
- _pos++;
+ skipSpaces();
- break;
- } else {
- parserError("Unexpected closure.");
- break;
+ if (_text[_pos++] != '>')
+ parserError("Malformed tag closure.");
}
+
+ break;
}
_keyValues.push(Common::StringMap());
- _state = kParserKeyNeedName;
+ _state = kParserNeedKeyName;
break;
- case kParserKeyNeedName:
+ case kParserNeedKeyName:
_token.clear();
while (isValidNameChar(_text[_pos]))
_token += _text[_pos++];
@@ -185,11 +175,11 @@ bool ThemeParser::parse() {
break;
}
- _state = kParserKeyNeedToken;
+ _state = kParserNeedKeyValues;
_activeKey.push(_token);
break;
- case kParserKeyNeedToken:
+ case kParserNeedKeyValues:
_token.clear();
if ((_text[_pos] == '/' && _text[_pos + 1] == '>') || _text[_pos] == '>') {
@@ -203,8 +193,7 @@ bool ThemeParser::parse() {
while (isValidNameChar(_text[_pos]))
_token += _text[_pos++];
- while (isspace(_text[_pos]))
- _pos++;
+ skipSpaces();
if (_text[_pos] != '=') {
parserError("Unexpected character after key name.");
diff --git a/gui/ThemeParser.h b/gui/ThemeParser.h
index 22ad50a333..f87708e3f2 100644
--- a/gui/ThemeParser.h
+++ b/gui/ThemeParser.h
@@ -50,13 +50,10 @@ public:
~ThemeParser() {}
enum ParserState {
- kParserKeyNeedName,
- kParserKeyNeedToken,
- kParserKeyNeedSubkey,
kParserNeedKey,
- kParserInComment,
- kParserError,
- kParserSuccess
+ kParserNeedKeyName,
+ kParserNeedKeyValues,
+ kParserError
};
bool parse();
@@ -71,6 +68,22 @@ protected:
void parserCallback_DRAW();
void parserCallback_DRAWDATA();
+ inline void skipSpaces() {
+ while (isspace(_text[_pos]))
+ _pos++;
+ }
+
+ inline void skipComments() {
+ if (_text[_pos] == '/' && _text[_pos + 1] == '*') {
+ _pos += 2;
+ while (_text[_pos++]) {
+ if (_text[_pos - 2] == '*' && _text[_pos - 1] == '/')
+ break;
+ }
+ skipSpaces();
+ }
+ }
+
int _pos;
char *_text;