#include <algorithm>
+using namespace lyx::support;
+
using std::sort;
using std::ostream;
using std::ios;
bool LyXLex::Pimpl::setFile(string const & filename)
{
+ // Is this a compressed file or not?
+ bool const compressed = (filename.substr(filename.size() - 3, 3) == ".gz");
+
// 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();
+ if (compressed) {
+ lyxerr << "lyxlex: compressed" << endl;
+
+ if (gz__.is_open() || is.tellg() > 0)
+ 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 {
+ lyxerr << "lyxlex: UNcompressed" << endl;
+
+ 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();
+ }
+
}
// That is not fast... (Lgb)
string dummy;
getline(is, dummy);
-
+
lyxerr[Debug::LYXLEX] << "Comment read: `" << c
<< dummy << '\'' << endl;
#else
if (c == '\"') {
buff.clear();
-
+
do {
is.get(cc);
c = cc;
// lot better to use the functions from cctype
if (c > ' ' && is) {
buff.clear();
-
+
do {
buff.push_back(c);
is.get(cc);
if (c == '\\') {
// escape
buff.clear();
-
+
do {
if (c == '\\') {
// escape the next char
// That is still not fast... (Lgb)
string dummy;
getline(is, dummy);
-
+
lyxerr[Debug::LYXLEX] << "Comment read: `" << c
<< dummy << '\'' << endl;
#else
// string
if (c == '\"') {
buff.clear();
-
+
bool escaped = false;
do {
escaped = false;
if (c > ' ' && is) {
buff.clear();
-
+
do {
if (c == '\\') {
// escape the next char
bool LyXLex::Pimpl::eatLine()
{
buff.clear();
-
+
unsigned char c = '\0';
char cc = 0;
while (is && c != '\n') {
c = cc;
if (c >= ' ' && is) {
buff.clear();
-
+
if (c == '\\') { // first char == '\\'
do {
buff.push_back(c);