/* This file is part of * ====================================================== * * LyX, The Document Processor * * Copyright 1996-2000 The LyX Team. * * Generalized simple lexical analizer. * It can be used for simple syntax parsers, like lyxrc, * texclass and others to come. [asierra30/03/96] * * ====================================================== */ #include #ifdef __GNUG__ #pragma implementation "lyxlex.h" #endif #include "lyxlex.h" #include "lyxlex_pimpl.h" #include "support/filetools.h" using std::ostream; using std::istream; using std::endl; LyXLex::LyXLex(keyword_item * tab, int num) : pimpl_(new Pimpl(tab, num)) {} LyXLex::~LyXLex() { delete pimpl_; } bool LyXLex::IsOK() const { return pimpl_->is.good(); } void LyXLex::setLineNo(int l) { pimpl_->lineno = l; } int LyXLex::GetLineNo() const { return pimpl_->lineno; } char const * LyXLex::text() const { return &pimpl_->buff[0]; } std::istream & LyXLex::getStream() { return pimpl_->is; } void LyXLex::pushTable(keyword_item * tab, int num) { pimpl_->pushTable(tab, num); } void LyXLex::popTable() { pimpl_->popTable(); } void LyXLex::printTable(ostream & os) { pimpl_->printTable(os); } void LyXLex::printError(string const & message) const { pimpl_->printError(message); } bool LyXLex::setFile(string const & filename) { return pimpl_->setFile(filename); } void LyXLex::setStream(istream & i) { pimpl_->setStream(i); } int LyXLex::lex() { return pimpl_->lex(); } int LyXLex::GetInteger() const { if (pimpl_->buff[0] > ' ') return atoi(pimpl_->buff); else { pimpl_->printError("Bad integer `$$Token'"); return -1; } } float LyXLex::GetFloat() const { if (pimpl_->buff[0] > ' ') return atof(pimpl_->buff); else { pimpl_->printError("Bad float `$$Token'"); return -1; } } string LyXLex::GetString() const { 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) { string str, prefix; bool firstline = true; while (IsOK()) { if (!EatLine()) // blank line in the file being read continue; string const token = frontStrip(strip(GetString()), " \t"); lyxerr[Debug::PARSER] << "LongString: `" << 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 break; } if (!IsOK()) printError("Long string not ended by `" + endtoken + '\''); return str; } bool LyXLex::GetBool() const { if (compare(pimpl_->buff, "true") == 0) return true; else if (compare(pimpl_->buff, "false") != 0) pimpl_->printError("Bad boolean `$$Token'. Use \"false\" or \"true\""); return false; } bool LyXLex::EatLine() { return pimpl_->EatLine(); } bool LyXLex::next(bool esc) { return pimpl_->next(esc); } bool LyXLex::nextToken() { return pimpl_->nextToken(); } void LyXLex::pushToken(string const & pt) { pimpl_->pushToken(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; }