X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxlex.C;h=3bd90f40b4381f8ffd86a8504cf23c9908c621b8;hb=8a5d04fd84e344a1ba1cfd3f5cce67d41874cfa3;hp=178ad888337526791704706f1cd90ee35ab5c1bb;hpb=e5f1824f33b51af675f8d345d5871a76dbd54465;p=lyx.git diff --git a/src/lyxlex.C b/src/lyxlex.C index 178ad88833..3bd90f40b4 100644 --- a/src/lyxlex.C +++ b/src/lyxlex.C @@ -1,8 +1,14 @@ -// Generalized simple lexical analizer. -// It can be used for simple syntax parsers, like lyxrc, -// texclass and others to come. [asierra30/03/96] -// -// Copyright 1996 Lyx Team. +/** + * \file lyxlex.C + * Copyright 1996-2002 the LyX Team + * Read the file COPYING + * + * Generalized simple lexical analyzer. + * It can be used for simple syntax parsers, like lyxrc, + * texclass and others to come. + * + * \author Alejandro Aguilar Sierra + */ #include @@ -12,7 +18,9 @@ #include "lyxlex.h" #include "lyxlex_pimpl.h" +#include "debug.h" #include "support/filetools.h" +#include "support/lstrings.h" using std::ostream; using std::istream; @@ -24,13 +32,13 @@ LyXLex::LyXLex(keyword_item * tab, int num) {} -LyXLex::~LyXLex() +LyXLex::~LyXLex() { delete pimpl_; } -bool LyXLex::IsOK() const +bool LyXLex::isOK() const { return pimpl_->is.good(); } @@ -42,18 +50,19 @@ void LyXLex::setLineNo(int l) } -int LyXLex::GetLineNo() const +int LyXLex::getLineNo() const { return pimpl_->lineno; } -char const * LyXLex::text() const + +string const LyXLex::text() const { return &pimpl_->buff[0]; } -std::istream & LyXLex::getStream() +istream & LyXLex::getStream() { return pimpl_->is; } @@ -95,103 +104,113 @@ void LyXLex::setStream(istream & i) } +void LyXLex::setCommentChar(char c) +{ + pimpl_->setCommentChar(c); +} + int LyXLex::lex() { return pimpl_->lex(); } -int LyXLex::GetInteger() const +int LyXLex::getInteger() const { - if (pimpl_->buff[0] > ' ') - return atoi(pimpl_->buff); - else { + if (isStrInt(pimpl_->getString())) { + return strToInt(pimpl_->getString()); + } else { pimpl_->printError("Bad integer `$$Token'"); return -1; } } -float LyXLex::GetFloat() const +float LyXLex::getFloat() const { - if (pimpl_->buff[0] > ' ') - return atof(pimpl_->buff); - else { - pimpl_->printError("Bad float `$$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). + string str = subst(pimpl_->getString(), ",", "."); + if (isStrDbl(str)) + return strToDbl(str); + else { + pimpl_->printError("Bad float `$$Token'"); + return -1; + } } -string LyXLex::GetString() const +string const LyXLex::getString() const { - return pimpl_->GetString(); + return pimpl_->getString(); } // I would prefer to give a tag number instead of an explicit token // here, but it is not possible because Buffer::readLyXformat2 uses -// explicit tokens (JMarc) -string LyXLex::getLongString(string const & endtoken) +// explicit tokens (JMarc) +string const LyXLex::getLongString(string const & endtoken) { string str, prefix; bool firstline = true; - while (IsOK()) { - if (!EatLine()) + while (isOK()) { + if (!eatLine()) // blank line in the file being read continue; - - string const token = frontStrip(strip(GetString()), " \t"); - + + string const token = trim(getString(), " \t"); + lyxerr[Debug::PARSER] << "LongString: `" - << GetString() << '\'' << endl; + << getString() << '\'' << endl; // We do a case independent comparison, like search_kw // does. - if (compare_no_case(token, endtoken) != 0) { - string tmpstr = GetString(); - if (firstline) { - unsigned int i = 0; - while(i < tmpstr.length() - && tmpstr[i] == ' ') { - ++i; - prefix += ' '; - } - firstline = false; - lyxerr[Debug::PARSER] << "Prefix = `" << prefix - << '\'' << endl; - } - - if (!prefix.empty() - && prefixIs(tmpstr, prefix.c_str())) { - tmpstr.erase(0, prefix.length() - 1); - } - str += frontStrip(tmpstr, "\t") + '\n'; - } - else // token == endtoken + if (compare_ascii_no_case(token, endtoken) == 0) break; + + string tmpstr = getString(); + if (firstline) { + string::size_type i(tmpstr.find_first_not_of(' ')); + if (i != string::npos) + prefix = tmpstr.substr(0, i); + firstline = false; + lyxerr[Debug::PARSER] + << "Prefix = `" << prefix << "\'" << endl; + } + + // further lines in long strings may have the same + // whitespace prefix as the first line. Remove it. + if (prefix.length() && prefixIs(tmpstr, prefix)) { + tmpstr.erase(0, prefix.length() - 1); + } + + str += ltrim(tmpstr, "\t") + '\n'; } - if (!IsOK()) + + if (!isOK()) { printError("Long string not ended by `" + endtoken + '\''); + } return str; } -bool LyXLex::GetBool() const +bool LyXLex::getBool() const { - if (compare(pimpl_->buff, "true") == 0) + if (compare(pimpl_->buff, "true") == 0) { return true; - else if (compare(pimpl_->buff, "false") != 0) + } else if (compare(pimpl_->buff, "false") != 0) { pimpl_->printError("Bad boolean `$$Token'. Use \"false\" or \"true\""); + } return false; } -bool LyXLex::EatLine() +bool LyXLex::eatLine() { - return pimpl_->EatLine(); + return pimpl_->eatLine(); } @@ -213,35 +232,24 @@ void LyXLex::pushToken(string const & pt) } -int LyXLex::FindToken(char const * str[]) -{ - int i = -1; - - if (next()) { - if (compare(pimpl_->buff, "default")) { - for (i = 0; str[i][0] && compare(str[i], pimpl_->buff); ++i); - if (!str[i][0]) { - pimpl_->printError("Unknown argument `$$Token'"); - i = -1; - } - } - } else - pimpl_->printError("file ended while scanning string token"); - return i; -} - - -int LyXLex::CheckToken(char const * str[], int print_error) -{ - int i = -1; - - if (compare(pimpl_->buff, "default")) { - for (i = 0; str[i][0] && compare(str[i], pimpl_->buff); ++i); - if (!str[i][0]) { - if (print_error) - pimpl_->printError("Unknown argument `$$Token'"); - i = -1; - } - } - return i; +int LyXLex::findToken(char const * str[]) +{ + if (!next()) { + pimpl_->printError("file ended while scanning string token"); + return -1; + } + + int i = 0; + + if (compare(pimpl_->buff, "default")) { + while (str[i][0] && compare(str[i], pimpl_->buff)) { + ++i; + } + if (!str[i][0]) { + pimpl_->printError("Unknown argument `$$Token'"); + i = -1; + } + } + + return i; }