PS: i made a little change compared to the recent patch such that LyXLex::isOK() after applying the patch now behaves as it did before.


this one is the changed patch
Index: src/buffer.C
===================================================================
--- src/buffer.C        (revision 17394)
+++ src/buffer.C        (working copy)
@@ -649,7 +649,7 @@
        lex.next();
        string const token(lex.getString());
 
-       if (!lex.isOK()) {
+       if (!lex) {
                Alert::error(_("Document could not be read"),
                             bformat(_("%1$s could not be read."), 
from_utf8(filename.absFilename())));
                return failure;
Index: src/frontends/controllers/ControlLog.C
===================================================================
--- src/frontends/controllers/ControlLog.C      (revision 17394)
+++ src/frontends/controllers/ControlLog.C      (working copy)
@@ -43,7 +43,7 @@
 
        string logtype, logfile;
        lex >> logtype;
-       if (lex.isOK()) {
+       if (lex) {
                lex.next(true);
                logfile = lex.getString();
        }
Index: src/frontends/controllers/ControlParagraph.C
===================================================================
--- src/frontends/controllers/ControlParagraph.C        (revision 17394)
+++ src/frontends/controllers/ControlParagraph.C        (working copy)
@@ -53,7 +53,12 @@
                } else if (token == "update") {
                        lex.next();
                        bool const accept = lex.getBool();
-                       action = accept ? 1 : 2;
+                       if (lex) {
+                               action = accept ? 1 : 2;
+                       } else {
+                               // Unrecognised update option
+                               return false;
+                       }
                } else if (!token.empty()) {
                        // Unrecognised token
                        return false;
Index: src/insets/insetbox.C
===================================================================
--- src/insets/insetbox.C       (revision 17394)
+++ src/insets/insetbox.C       (working copy)
@@ -531,15 +531,17 @@
        if (!lex.isOK())
                return;
 
-       if (lex.isOK()) {
-               lex.next();
-               type = lex.getString();
-       }
-       if (!lex.isOK())
+       lex.next();
+       type = lex.getString();
+
+       if (!lex)
                return;
+
        lex.next();
        string token;
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "position") {
                lex.next();
                // The [0] is needed. We need the first and only char in
@@ -549,10 +551,11 @@
                lyxerr << "InsetBox::Read: Missing 'position'-tag!" << token << 
endl;
                lex.pushToken(token);
        }
-       if (!lex.isOK())
-               return;
+
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "hor_pos") {
                lex.next();
                hor_pos = lex.getString()[0];
@@ -560,10 +563,11 @@
                lyxerr << "InsetBox::Read: Missing 'hor_pos'-tag!" << token << 
endl;
                lex.pushToken(token);
        }
-       if (!lex.isOK())
-               return;
+
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "has_inner_box") {
                lex.next();
                inner_box = lex.getInteger();
@@ -572,10 +576,10 @@
                lex.pushToken(token);
        }
 
-       if (!lex.isOK())
-               return;
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "inner_pos") {
                lex.next();
                inner_pos = lex.getString()[0];
@@ -584,10 +588,11 @@
                        << token << endl;
                lex.pushToken(token);
        }
-       if (!lex.isOK())
-               return;
+
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "use_parbox") {
                lex.next();
                use_parbox = lex.getInteger();
@@ -595,10 +600,11 @@
                lyxerr << "InsetBox::Read: Missing 'use_parbox'-tag!" << endl;
                lex.pushToken(token);
        }
-       if (!lex.isOK())
-               return;
+
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "width") {
                lex.next();
                width = LyXLength(lex.getString());
@@ -606,10 +612,11 @@
                lyxerr << "InsetBox::Read: Missing 'width'-tag!" << endl;
                lex.pushToken(token);
        }
-       if (!lex.isOK())
-               return;
+
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "special") {
                lex.next();
                special = lex.getString();
@@ -617,10 +624,11 @@
                lyxerr << "InsetBox::Read: Missing 'special'-tag!" << endl;
                lex.pushToken(token);
        }
-       if (!lex.isOK())
-               return;
+
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "height") {
                lex.next();
                height = LyXLength(lex.getString());
@@ -628,10 +636,11 @@
                lyxerr << "InsetBox::Read: Missing 'height'-tag!" << endl;
                lex.pushToken(token);
        }
-       if (!lex.isOK())
-               return;
+
        lex.next();
        token = lex.getString();
+       if (!lex)
+               return;
        if (token == "height_special") {
                lex.next();
                height_special = lex.getString();
Index: src/insets/insetert.C
===================================================================
--- src/insets/insetert.C       (revision 17394)
+++ src/insets/insetert.C       (working copy)
@@ -466,7 +466,7 @@
 
        int s;
        lex >> s;
-       if (lex.isOK())
+       if (lex)
                status = static_cast<InsetCollapsable::CollapseStatus>(s);
 }
 
Index: src/insets/insetnote.C
===================================================================
--- src/insets/insetnote.C      (revision 17394)
+++ src/insets/insetnote.C      (working copy)
@@ -105,7 +105,7 @@
 {
        string label;
        lex >> label;
-       if (lex.isOK())
+       if (lex)
                type = notetranslator().find(label);
 }
 
Index: src/insets/insettabular.C
===================================================================
--- src/insets/insettabular.C   (revision 17394)
+++ src/insets/insettabular.C   (working copy)
@@ -230,11 +230,11 @@
 
        lex.next();
        string token = lex.getString();
-       while (lex.isOK() && (token != "\\end_inset")) {
+       while (lex && token != "\\end_inset") {
                lex.next();
                token = lex.getString();
        }
-       if (token != "\\end_inset") {
+       if (!lex) {
                lex.printError("Missing \\end_inset at this point. "
                               "Read: `$$Token'");
        }
Index: src/insets/insetvspace.C
===================================================================
--- src/insets/insetvspace.C    (revision 17394)
+++ src/insets/insetvspace.C    (working copy)
@@ -88,7 +88,7 @@
        BOOST_ASSERT(lex.isOK());
        string vsp;
        lex >> vsp;
-       if (lex.isOK())
+       if (lex)
                space_ = VSpace(vsp);
 
        string end_token;
@@ -257,7 +257,7 @@
 
        string vsp;
        lex >> vsp;
-       if (lex.isOK())
+       if (lex)
                vspace = VSpace(vsp);
 }
 
Index: src/lyxlex.C
===================================================================
--- src/lyxlex.C        (revision 17394)
+++ src/lyxlex.C        (working copy)
@@ -53,7 +53,7 @@
 
 bool LyXLex::isOK() const
 {
-       return pimpl_->is.good();
+       return pimpl_->inputAvailable();
 }
 
 
@@ -124,8 +124,16 @@
 
 int LyXLex::getInteger() const
 {
+       lastReadOk_ = pimpl_->status == LEX_DATA || pimpl_->status == LEX_TOKEN;
+       if (!lastReadOk_) {
+               pimpl_->printError("integer token missing");
+               return -1;
+       }
+
        if (isStrInt(pimpl_->getString()))
                return convert<int>(pimpl_->getString());
+
+       lastReadOk_ = false;
        pimpl_->printError("Bad integer `$$Token'");
        return -1;
 }
@@ -136,9 +144,17 @@
        // replace comma with dot in case the file was written with
        // the wrong locale (should be rare, but is easy enough to
        // avoid).
+       lastReadOk_ = pimpl_->status == LEX_DATA || pimpl_->status == LEX_TOKEN;
+       if (!lastReadOk_) {
+               pimpl_->printError("float token missing");
+               return -1;
+       }
+
        string const str = subst(pimpl_->getString(), ",", ".");
        if (isStrDbl(str))
                return convert<double>(str);
+
+       lastReadOk_ = false;
        pimpl_->printError("Bad float `$$Token'");
        return -1;
 }
@@ -146,13 +162,23 @@
 
 string const LyXLex::getString() const
 {
+       lastReadOk_ = pimpl_->status == LEX_DATA || pimpl_->status == LEX_TOKEN;
+
+       if (lastReadOk_)
        return pimpl_->getString();
+
+       return string();
 }
 
 
 docstring const LyXLex::getDocString() const
 {
-       return pimpl_->getDocString();
+       lastReadOk_ = pimpl_->status == LEX_DATA || pimpl_->status == LEX_TOKEN;
+       
+       if (lastReadOk_)
+               return pimpl_->getDocString();
+
+       return docstring();
 }
 
 
@@ -164,7 +190,7 @@
        string str, prefix;
        bool firstline = true;
 
-       while (isOK()) {
+       while (pimpl_->is) { //< eatLine only reads from is, not from pushTok
                if (!eatLine())
                        // blank line in the file being read
                        continue;
@@ -197,7 +223,7 @@
                str += ltrim(tmpstr, "\t") + '\n';
        }
 
-       if (!isOK()) {
+       if (!pimpl_->is) {
                printError("Long string not ended by `" + endtoken + '\'');
        }
 
@@ -208,11 +234,14 @@
 bool LyXLex::getBool() const
 {
        if (pimpl_->getString() == "true") {
+               lastReadOk_ = true;
                return true;
        } else if (pimpl_->getString() != "false") {
                pimpl_->printError("Bad boolean `$$Token'. "
                                   "Use \"false\" or \"true\"");
+               lastReadOk_ = false;
        }
+       lastReadOk_ = true;
        return false;
 }
 
@@ -246,13 +275,13 @@
        // use fail() here. However, our implementation of getString() et al.
        // can cause the eof() and fail() bits to be set, even though we
        // haven't tried to read 'em.
-       return pimpl_->is.bad() ? 0 : this;
+       return lastReadOk_? this: 0;
 }
 
 
 bool LyXLex::operator!() const
 {
-       return pimpl_->is.bad();
+       return !lastReadOk_;
 }
 
 
@@ -261,6 +290,8 @@
        if (isOK()) {
                next();
                s = getString();
+       } else {
+               lastReadOk_ = false;
        }
        return *this;
 }
@@ -271,6 +302,8 @@
        if (isOK()) {
                next();
                s = getDocString();
+       } else {
+               lastReadOk_ = false;
        }
        return *this;
 }
@@ -281,6 +314,8 @@
        if (isOK()) {
                next();
                s = getFloat();
+       } else {
+               lastReadOk_ = false;
        }
        return *this;
 }
@@ -291,6 +326,8 @@
        if (isOK()) {
                next();
                s = getInteger();
+       } else {
+               lastReadOk_ = false;
        }
        return *this;
 }
@@ -301,6 +338,8 @@
        if (isOK()) {
                next();
                s = getInteger();
+       } else {
+               lastReadOk_ = false;
        }
        return *this;
 }
@@ -311,6 +350,8 @@
        if (isOK()) {
                next();
                s = getBool();
+       } else {
+               lastReadOk_ = false;
        }
        return *this;
 }
Index: src/lyxlex.h
===================================================================
--- src/lyxlex.h        (revision 17394)
+++ src/lyxlex.h        (working copy)
@@ -162,6 +162,8 @@
        class Pimpl;
        ///
        Pimpl * pimpl_;
+       ///
+       mutable bool lastReadOk_;
 };
 
 
Index: src/lyxlex_pimpl.C
===================================================================
--- src/lyxlex_pimpl.C  (revision 17394)
+++ src/lyxlex_pimpl.C  (working copy)
@@ -204,15 +204,15 @@
                // There can have been a whole line pushed so
                // we extract the first word and leaves the rest
                // in pushTok. (Lgb)
-               if (pushTok.find(' ') != string::npos && pushTok[0] == '\\') {
+               if (pushTok[0] == '\\' && pushTok.find(' ') != string::npos) {
                        buff.clear();
                        pushTok = split(pushTok, buff, ' ');
-                       return true;
                } else {
                        buff = pushTok;
                        pushTok.clear();
-                       return true;
                }
+               status = LEX_TOKEN;
+               return true;
        }
        if (!esc) {
                unsigned char c = 0; // getc() returns an int
@@ -308,24 +308,24 @@
                        // skip ','s
                        if (c == ',') continue;
 
-                       if (c == '\\') {
-                               // escape
-                               buff.clear();
+                       //if (c == '\\') { // covered by the later LEX_TOKEN 
part
+                       //      // escape
+                       //      buff.clear();
 
-                               do {
-                                       if (c == '\\') {
-                                               // escape the next char
-                                               is.get(cc);
-                                               c = cc;
-                                       }
-                                       buff.push_back(c);
-                                       is.get(cc);
-                                       c = cc;
-                               } while (c > ' ' && c != ',' && is);
+                       //      do {
+                       //              if (c == '\\') {
+                       //                      // escape the next char
+                       //                      is.get(cc);
+                       //                      c = cc;
+                       //              }
+                       //              buff.push_back(c);
+                       //              is.get(cc);
+                       //              c = cc;
+                       //      } while (c > ' ' && c != ',' && is);
 
-                               status = LEX_TOKEN;
-                               continue;
-                       }
+                       //      status = LEX_TOKEN;
+                       //      continue;
+                       //}
 
                        if (c == commentChar) {
                                // Read rest of line (fast :-)
@@ -453,10 +453,13 @@
        }
 
        if (c == '\n') {
+               buff.resize(buff.size() - 1);
                ++lineno;
-               buff.resize(buff.size() - 1);
                status = LEX_DATA;
                return true;
+       } else if (buff.length() > 0) { // last line
+               status = LEX_DATA;
+               return true;
        } else {
                return false;
        }
@@ -469,15 +472,15 @@
                // There can have been a whole line pushed so
                // we extract the first word and leaves the rest
                // in pushTok. (Lgb)
-               if (pushTok.find(' ') != string::npos && pushTok[0] == '\\') {
+               if (pushTok[0] == '\\' && pushTok.find(' ') != string::npos) {
                        buff.clear();
                        pushTok = split(pushTok, buff, ' ');
-                       return true;
                } else {
                        buff = pushTok;
                        pushTok.clear();
-                       return true;
                }
+               status = LEX_TOKEN;
+               return true;
        }
 
        status = 0;
@@ -519,6 +522,11 @@
 }
 
 
+bool LyXLex::Pimpl::inputAvailable() {
+       return is.good(); 
+}
+
+
 void LyXLex::Pimpl::pushToken(string const & pt)
 {
        pushTok = pt;
Index: src/lyxlex_pimpl.h
===================================================================
--- src/lyxlex_pimpl.h  (revision 17394)
+++ src/lyxlex_pimpl.h  (working copy)
@@ -65,6 +65,8 @@
        bool eatLine();
        ///
        bool nextToken();
+       /// test if there is a pushed token or the stream is ok
+       bool inputAvailable();
        ///
        void pushToken(std::string const &);
        /// fb_ is only used to open files, the stream is accessed through is.
Index: src/ToolbarBackend.C
===================================================================
--- src/ToolbarBackend.C        (revision 17394)
+++ src/ToolbarBackend.C        (working copy)
@@ -79,12 +79,12 @@
        Toolbar tb;
        tb.name = lex.getString();
        lex.next(true);
-       if (!lex.isOK()) {
+       tb.gui_name = lex.getString();
+       if (!lex) {
                lyxerr << "ToolbarBackend::read: Malformed toolbar "
                        "description " <<  lex.getString() << endl;
                return;
        }
-       tb.gui_name = lex.getString();
 
        bool quit = false;
 

Reply via email to