]> git.lyx.org Git - lyx.git/blobdiff - src/Lexer.cpp
revert erroneous previous commit.
[lyx.git] / src / Lexer.cpp
index a069c93e471117d19dc7860c344c773009ede7d5..9061d7c0b3ab0ac7a23a25681900a720baa3f452 100644 (file)
@@ -67,7 +67,7 @@ public:
        ///
        bool next(bool esc = false);
        ///
-       int search_kw(char const * const tag) const;
+       int searchKeyword(char const * const tag) const;
        ///
        int lex();
        ///
@@ -102,6 +102,8 @@ public:
        string pushTok;
        ///
        char commentChar;
+       /// used for error messages
+       string context;
 private:
        /// non-copyable
        Pimpl(Pimpl const &);
@@ -171,7 +173,9 @@ void Lexer::Pimpl::printError(string const & message) const
 {
        string const tmpmsg = subst(message, "$$Token", getString());
        lyxerr << "LyX: " << tmpmsg << " [around line " << lineno
-               << " of file " << to_utf8(makeDisplayPath(name)) << ']' << endl;
+               << " of file " << to_utf8(makeDisplayPath(name))
+               << " current token: '" << getString() << "'"
+               << " context: '" << context << "']" << endl;
 }
 
 
@@ -309,11 +313,6 @@ bool Lexer::Pimpl::next(bool esc /* = false */)
                is.get(cc);
                c = cc;
 
-               // skip ','s
-               if (esc && c == ',')
-                       continue;
-
-               
                if (c == commentChar) {
                        // Read rest of line (fast :-)
 #if 1
@@ -378,13 +377,13 @@ bool Lexer::Pimpl::next(bool esc /* = false */)
                        break;
                }
 
-               if (!esc && c == ',')
+               if (c == ',')
                        continue;              /* Skip ','s */
 
-                       // using relational operators with chars other
-                       // than == and != is not safe. And if it is done
-                       // the type _have_ to be unsigned. It usually a
-                       // lot better to use the functions from cctype
+               // using relational operators with chars other
+               // than == and != is not safe. And if it is done
+               // the type _have_ to be unsigned. It usually a
+               // lot better to use the functions from cctype
                if (c > ' ' && is)  {
                        buff.clear();
 
@@ -402,7 +401,7 @@ bool Lexer::Pimpl::next(bool esc /* = false */)
                        status = LEX_TOKEN;
                }
 
-               if (!esc && c == '\r' && is) {
+               if (c == '\r' && is) {
                        // The Windows support has lead to the
                        // possibility of "\r\n" at the end of
                        // a line.  This will stop LyX choking
@@ -424,7 +423,7 @@ bool Lexer::Pimpl::next(bool esc /* = false */)
 }
 
 
-int Lexer::Pimpl::search_kw(char const * const tag) const
+int Lexer::Pimpl::searchKeyword(char const * const tag) const
 {
        LexerKeyword search_tag = { tag, 0 };
        LexerKeyword * res =
@@ -444,7 +443,7 @@ int Lexer::Pimpl::lex()
 {
        //NOTE: possible bug.
        if (next() && status == LEX_TOKEN)
-               return search_kw(getString().c_str());
+               return searchKeyword(getString().c_str());
        return status;
 }
 
@@ -500,7 +499,7 @@ bool Lexer::Pimpl::nextToken()
                char cc = 0;
                is.get(cc);
                c = cc;
-               if (c >= ' ' && is) {
+               if ((c >= ' ' || c == '\t') && is) {
                        buff.clear();
 
                        if (c == '\\') { // first char == '\\'
@@ -514,7 +513,7 @@ bool Lexer::Pimpl::nextToken()
                                        buff.push_back(c);
                                        is.get(cc);
                                        c = cc;
-                               } while (c >= ' ' && c != '\\' && is);
+                               } while ((c >= ' ' || c == '\t') && c != '\\' && is);
                        }
 
                        if (c == '\\')
@@ -637,6 +636,7 @@ void Lexer::setCommentChar(char c)
        pimpl_->setCommentChar(c);
 }
 
+
 int Lexer::lex()
 {
        return pimpl_->lex();
@@ -721,7 +721,7 @@ string const Lexer::getLongString(string const & endtoken)
 
                LYXERR(Debug::PARSER, "LongString: `" << getString() << '\'');
 
-               // We do a case independent comparison, like search_kw does.
+               // We do a case independent comparison, like searchKeyword does.
                if (compare_ascii_no_case(token, endtoken) == 0)
                        break;
 
@@ -751,15 +751,18 @@ string const Lexer::getLongString(string const & endtoken)
 
 bool Lexer::getBool() const
 {
-       if (pimpl_->getString() == "true") {
+       string const s = pimpl_->getString();   
+       if (s == "false" || s == "0") {
+               lastReadOk_ = true;
+               return false;
+       }
+       if (s == "true" || s == "1") {
                lastReadOk_ = true;
                return true;
-       } else if (pimpl_->getString() != "false") {
-               pimpl_->printError("Bad boolean `$$Token'. "
-                                  "Use \"false\" or \"true\"");
-               lastReadOk_ = false;
        }
-       lastReadOk_ = true;
+       pimpl_->printError("Bad boolean `$$Token'. "
+                                "Use \"false\" or \"true\"");
+       lastReadOk_ = false;
        return false;
 }
 
@@ -876,9 +879,19 @@ Lexer & Lexer::operator>>(bool & s)
 }
 
 
+Lexer & Lexer::operator>>(char & c)
+{
+       string s;
+       operator>>(s);
+       if (!s.empty())
+               c = s[0];
+       return *this;
+}
+
+
 // quotes a string, e.g. for use in preferences files or as an argument
 // of the "log" dialog
-string const Lexer::quoteString(string const & arg)
+string Lexer::quoteString(string const & arg)
 {
        string res;
        res += '"';
@@ -888,4 +901,34 @@ string const Lexer::quoteString(string const & arg)
 }
 
 
+Lexer & Lexer::operator>>(char const * required)
+{
+       string token;
+       *this >> token;
+       if (token != required) {
+               LYXERR0("Missing '" << required << "'-tag in " << pimpl_->context 
+                       << ". Got " << token << " instead. Line: " << lineNumber());
+               pushToken(token);
+       }
+       return *this;
+}
+
+
+bool Lexer::checkFor(char const * required)
+{
+       string token;
+       *this >> token;
+       if (token == required)
+               return true;
+       pushToken(token);
+       return false;
+}
+
+
+void Lexer::setContext(std::string const & str)
+{
+       pimpl_->context = str;
+}
+
+
 } // namespace lyx