X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxlex_pimpl.C;h=0ae2b1391c85323f36a6f4d3aef64ef6543879bb;hb=e7f4618bcce770369cf46335c2c7f0164b4b8857;hp=f5c1a1b412c19914ae3402d5a555d1aa2057d9c0;hpb=57a24ea9124812ddc5108ff1ad304ff61acc826a;p=lyx.git diff --git a/src/lyxlex_pimpl.C b/src/lyxlex_pimpl.C index f5c1a1b412..0ae2b1391c 100644 --- a/src/lyxlex_pimpl.C +++ b/src/lyxlex_pimpl.C @@ -19,38 +19,50 @@ #include "support/filetools.h" #include "support/lyxalgo.h" #include "support/lstrings.h" +#include "support/types.h" +#include "support/unicode.h" -using lyx::support::compare_ascii_no_case; -using lyx::support::getExtFromContents; -using lyx::support::MakeDisplayPath; -using lyx::support::split; -using lyx::support::subst; +#include + + +namespace lyx { + +using support::compare_ascii_no_case; +using support::FileName; +using support::getFormatFromContents; +using support::makeDisplayPath; +using support::split; +using support::subst; using std::endl; using std::getline; using std::lower_bound; using std::sort; - +using std::string; using std::ios; using std::istream; using std::ostream; -// namespace { -struct compare_tags { +namespace { + +class compare_tags + : public std::binary_function { +public: // used by lower_bound, sort and sorted - inline - int operator()(keyword_item const & a, keyword_item const & b) const { + bool operator()(keyword_item const & a, keyword_item const & b) const + { // we use the ascii version, because in turkish, 'i' // is not the lowercase version of 'I', and thus // turkish locale breaks parsing of tags. return compare_ascii_no_case(a.tag, b.tag) < 0; } }; -// } // end of anon namespace + +} // end of anon namespace LyXLex::Pimpl::Pimpl(keyword_item * tab, int num) - : is(&fb__), table(tab), no_items(num), + : is(&fb_), table(tab), no_items(num), status(0), lineno(0), commentChar('#') { verifyTable(); @@ -59,7 +71,13 @@ LyXLex::Pimpl::Pimpl(keyword_item * tab, int num) string const LyXLex::Pimpl::getString() const { - return string(buff.begin(), buff.end()); + return buff; +} + + +docstring const LyXLex::Pimpl::getDocString() const +{ + return from_utf8(buff); } @@ -67,7 +85,7 @@ void LyXLex::Pimpl::printError(string const & message) const { string const tmpmsg = subst(message, "$$Token", getString()); lyxerr << "LyX: " << tmpmsg << " [around line " << lineno - << " of file " << MakeDisplayPath(name) << ']' << endl; + << " of file " << to_utf8(makeDisplayPath(name)) << ']' << endl; } @@ -126,47 +144,47 @@ void LyXLex::Pimpl::popTable() } -bool LyXLex::Pimpl::setFile(string const & filename) +bool LyXLex::Pimpl::setFile(FileName const & filename) { - // Check the format of the file. - string const format = getExtFromContents(filename); + string const format = getFormatFromContents(filename); if (format == "gzip" || format == "zip" || format == "compress") { - lyxerr << "lyxlex: compressed" << endl; + lyxerr[Debug::LYXLEX] << "lyxlex: compressed" << endl; // The check only outputs a debug message, because it triggers // a bug in compaq cxx 6.2, where is_open() returns 'true' for // a fresh new filebuf. (JMarc) - if (gz__.is_open() || is.tellg() > 0) + if (!gz_.empty() || istream::off_type(is.tellg()) > -1) lyxerr[Debug::LYXLEX] << "Error in LyXLex::setFile: " "file or stream already set." << endl; - gz__.open(filename.c_str(), ios::in); - is.rdbuf(&gz__); - name = filename; + gz_.push(io::gzip_decompressor()); + gz_.push(io::file_source(filename.toFilesystemEncoding())); + is.rdbuf(&gz_); + name = filename.absFilename(); lineno = 0; - return gz__.is_open() && is.good(); + return gz_.component(1)->is_open() && is.good(); } else { - lyxerr << "lyxlex: UNcompressed" << endl; + lyxerr[Debug::LYXLEX] << "lyxlex: UNcompressed" << endl; // The check only outputs a debug message, because it triggers // a bug in compaq cxx 6.2, where is_open() returns 'true' for // a fresh new filebuf. (JMarc) - if (fb__.is_open() || is.tellg() > 0) + if (fb_.is_open() || istream::off_type(is.tellg()) > 0) lyxerr[Debug::LYXLEX] << "Error in LyXLex::setFile: " "file or stream already set." << endl; - fb__.open(filename.c_str(), ios::in); - is.rdbuf(&fb__); - name = filename; + fb_.open(filename.toFilesystemEncoding().c_str(), ios::in); + is.rdbuf(&fb_); + name = filename.absFilename(); lineno = 0; - return fb__.is_open() && is.good(); + return fb_.is_open() && is.good(); } } void LyXLex::Pimpl::setStream(istream & i) { - if (fb__.is_open() || is.tellg() > 0) + if (fb_.is_open() || istream::off_type(is.tellg()) > 0) lyxerr[Debug::LYXLEX] << "Error in LyXLex::setStream: " "file or stream already set." << endl; is.rdbuf(i.rdbuf()); @@ -187,13 +205,12 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) // we extract the first word and leaves the rest // in pushTok. (Lgb) if (pushTok.find(' ') != string::npos && pushTok[0] == '\\') { - string tmp; - pushTok = split(pushTok, tmp, ' '); - buff.assign(tmp.begin(), tmp.end()); + buff.clear(); + pushTok = split(pushTok, buff, ' '); return true; } else { - buff.assign(pushTok.begin(), pushTok.end()); - pushTok.erase(); + buff = pushTok; + pushTok.clear(); return true; } } @@ -237,7 +254,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) ++lineno; } - buff.pop_back(); + buff.resize(buff.size()-1); status = LEX_DATA; break; } @@ -358,7 +375,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) ++lineno; } - buff.pop_back(); + buff.resize(buff.size() -1); status = LEX_DATA; break; } @@ -437,7 +454,7 @@ bool LyXLex::Pimpl::eatLine() if (c == '\n') { ++lineno; - buff.pop_back(); + buff.resize(buff.size() - 1); status = LEX_DATA; return true; } else { @@ -453,13 +470,12 @@ bool LyXLex::Pimpl::nextToken() // we extract the first word and leaves the rest // in pushTok. (Lgb) if (pushTok.find(' ') != string::npos && pushTok[0] == '\\') { - string tmp; - pushTok = split(pushTok, tmp, ' '); - buff.assign(tmp.begin(), tmp.end()); + buff.clear(); + pushTok = split(pushTok, buff, ' '); return true; } else { - buff.assign(pushTok.begin(), pushTok.end()); - pushTok.erase(); + buff = pushTok; + pushTok.clear(); return true; } } @@ -507,3 +523,6 @@ void LyXLex::Pimpl::pushToken(string const & pt) { pushTok = pt; } + + +} // namespace lyx