#include <sstream>
-using lyx::support::compare_ascii_no_case;
-using lyx::support::isStrDbl;
-using lyx::support::isStrInt;
-using lyx::support::ltrim;
-using lyx::support::prefixIs;
-using lyx::support::subst;
-using lyx::support::trim;
+
+namespace lyx {
+
+using support::compare_ascii_no_case;
+using support::isStrDbl;
+using support::isStrInt;
+using support::ltrim;
+using support::prefixIs;
+using support::subst;
+using support::trim;
using std::endl;
using std::string;
bool LyXLex::isOK() const
{
- return pimpl_->is.good();
+ return pimpl_->inputAvailable();
}
}
-bool LyXLex::setFile(string const & filename)
+bool LyXLex::setFile(support::FileName const & filename)
{
return pimpl_->setFile(filename);
}
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;
}
// 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;
}
string const LyXLex::getString() const
{
+ lastReadOk_ = pimpl_->status == LEX_DATA || pimpl_->status == LEX_TOKEN;
+
+ if (lastReadOk_)
return pimpl_->getString();
+
+ return string();
}
-lyx::docstring const LyXLex::getDocString() const
+docstring const LyXLex::getDocString() const
{
- return pimpl_->getDocString();
+ lastReadOk_ = pimpl_->status == LEX_DATA || pimpl_->status == LEX_TOKEN;
+
+ if (lastReadOk_)
+ return pimpl_->getDocString();
+
+ return docstring();
}
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;
string const token = trim(getString(), " \t");
- lyxerr[Debug::PARSER] << "LongString: `"
+ LYXERR(Debug::PARSER) << "LongString: `"
<< getString() << '\'' << endl;
// We do a case independent comparison, like search_kw does.
if (i != string::npos)
prefix = tmpstr.substr(0, i);
firstline = false;
- lyxerr[Debug::PARSER]
+ LYXERR(Debug::PARSER)
<< "Prefix = `" << prefix << "\'" << endl;
}
str += ltrim(tmpstr, "\t") + '\n';
}
- if (!isOK()) {
+ if (!pimpl_->is) {
printError("Long string not ended by `" + endtoken + '\'');
}
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;
}
// 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_;
}
if (isOK()) {
next();
s = getString();
+ } else {
+ lastReadOk_ = false;
+ }
+ return *this;
+}
+
+
+LyXLex & LyXLex::operator>>(docstring & s)
+{
+ if (isOK()) {
+ next();
+ s = getDocString();
+ } else {
+ lastReadOk_ = false;
}
return *this;
}
if (isOK()) {
next();
s = getFloat();
+ } else {
+ lastReadOk_ = false;
}
return *this;
}
if (isOK()) {
next();
s = getInteger();
+ } else {
+ lastReadOk_ = false;
}
return *this;
}
if (isOK()) {
next();
s = getInteger();
+ } else {
+ lastReadOk_ = false;
}
return *this;
}
if (isOK()) {
next();
s = getBool();
+ } else {
+ lastReadOk_ = false;
}
return *this;
}
os << '"' << subst(subst(arg, "\\", "\\\\"), "\"", "\\\"") << '"';
return os.str();
}
+
+
+} // namespace lyx