X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxlex_pimpl.C;h=292778761a44a3bd87fc7d77c3a8b60e4b91fc6e;hb=2486c96b8d9086471299bf207b85b1ce848246aa;hp=3248c4a849945ada2300767b53c802fbd902874a;hpb=7b411194635cb97468046628e6f3bec928ad16af;p=lyx.git diff --git a/src/lyxlex_pimpl.C b/src/lyxlex_pimpl.C index 3248c4a849..292778761a 100644 --- a/src/lyxlex_pimpl.C +++ b/src/lyxlex_pimpl.C @@ -1,39 +1,62 @@ +/** + * \file lyxlex_pimpl.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes + * \author Jürgen Vigna + * + * Full author contact details are available in file CREDITS. + */ + #include #include "lyxlex_pimpl.h" + #include "debug.h" -#include "support/lyxalgo.h" #include "support/filetools.h" +#include "support/lyxalgo.h" #include "support/lstrings.h" -#include +#include +using lyx::support::compare_ascii_no_case; +using lyx::support::getFormatFromContents; +using lyx::support::MakeDisplayPath; +using lyx::support::split; +using lyx::support::subst; + +using std::endl; +using std::getline; +using std::lower_bound; using std::sort; -using std::ostream; +using std::string; using std::ios; using std::istream; -using std::endl; -using std::lower_bound; -using std::vector; -using std::getline; +using std::ostream; + +namespace { -// namespace { -struct compare_tags { +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(); @@ -56,7 +79,7 @@ void LyXLex::Pimpl::printError(string const & message) const void LyXLex::Pimpl::printTable(ostream & os) { - os << "\nNumber of tags: " << no_items << '\n'; + os << "\nNumber of tags: " << no_items << endl; for (int i= 0; i < no_items; ++i) os << "table[" << i << "]: tag: `" << table[i].tag @@ -73,11 +96,11 @@ void LyXLex::Pimpl::verifyTable() lyxerr << "The table passed to LyXLex is not sorted!\n" << "Tell the developers to fix it!" << endl; // We sort it anyway to avoid problems. - lyxerr << "\nUnsorted:\n"; + lyxerr << "\nUnsorted:" << endl; printTable(lyxerr); sort(table, table + no_items, compare_tags()); - lyxerr << "\nSorted:\n"; + lyxerr << "\nSorted:" << endl; printTable(lyxerr); } } @@ -111,23 +134,48 @@ void LyXLex::Pimpl::popTable() bool LyXLex::Pimpl::setFile(string const & filename) { - // 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) - 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; - lineno = 0; - return fb__.is_open() && is.good(); + // Check the format of the file. + string const format = getFormatFromContents(filename); + + if (format == "gzip" || format == "zip" || format == "compress") { + lyxerr[Debug::LYXLEX] << "lyxlex: compressed" << endl; + +#ifdef USE_COMPRESSION + // 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() || 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; + lineno = 0; + return gz_.is_open() && is.good(); +#else + return false; +#endif + } else { + 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() || 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; + lineno = 0; + 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()); @@ -171,7 +219,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) // That is not fast... (Lgb) string dummy; getline(is, dummy); - + lyxerr[Debug::LYXLEX] << "Comment read: `" << c << dummy << '\'' << endl; #else @@ -184,7 +232,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) if (c == '\"') { buff.clear(); - + do { is.get(cc); c = cc; @@ -212,7 +260,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) // lot better to use the functions from cctype if (c > ' ' && is) { buff.clear(); - + do { buff.push_back(c); is.get(cc); @@ -255,7 +303,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) if (c == '\\') { // escape buff.clear(); - + do { if (c == '\\') { // escape the next char @@ -277,7 +325,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) // That is still not fast... (Lgb) string dummy; getline(is, dummy); - + lyxerr[Debug::LYXLEX] << "Comment read: `" << c << dummy << '\'' << endl; #else @@ -292,7 +340,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) // string if (c == '\"') { buff.clear(); - + bool escaped = false; do { escaped = false; @@ -326,7 +374,7 @@ bool LyXLex::Pimpl::next(bool esc /* = false */) if (c > ' ' && is) { buff.clear(); - + do { if (c == '\\') { // escape the next char @@ -384,7 +432,7 @@ int LyXLex::Pimpl::lex() bool LyXLex::Pimpl::eatLine() { buff.clear(); - + unsigned char c = '\0'; char cc = 0; while (is && c != '\n') { @@ -433,7 +481,7 @@ bool LyXLex::Pimpl::nextToken() c = cc; if (c >= ' ' && is) { buff.clear(); - + if (c == '\\') { // first char == '\\' do { buff.push_back(c);