X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FDepTable.C;h=0c745f0950c15a6652f19968eacc544db80b789d;hb=b01a9dc187d9cd396a57463ad27511379dcdc9cd;hp=842e03ed0c10bc078bef3090da4e34ff6921f1af;hpb=0eccdd1c3613e5170deb77b22174dd0afde833e9;p=lyx.git diff --git a/src/DepTable.C b/src/DepTable.C index 842e03ed0c..0c745f0950 100644 --- a/src/DepTable.C +++ b/src/DepTable.C @@ -1,168 +1,259 @@ -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * Copyright (C) 1995 Matthias Ettrich - * Copyright (C) 1995-1998 The LyX Team. +/** + * \file DepTable.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * This file is Copyright (C) 1996-1998 - * Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes + * \author Ben Stanley * - * ====================================================== + * Full author contact details are available in file CREDITS. */ #include #include "DepTable.h" + +#include "debug.h" + #include "support/lyxlib.h" #include "support/filetools.h" +#include "support/lstrings.h" +#include "support/lyxtime.h" + +#include + +#include + + +namespace lyx { -DepTable::DepTable() +#ifndef CXX_GLOBAL_CSTD +using std::time; +#endif + +using support::FileName; +using support::ltrim; +using support::onlyFilename; +using support::suffixIs; +using support::sum; + +using std::endl; +using std::flush; +using std::getline; +using std::string; +using std::ofstream; +using std::ifstream; + +inline +bool DepTable::dep_info::changed() const { - new_sum = 0; - old_sum = 0; - next = 0; + return crc_prev != crc_cur && crc_cur != 0; } -DepTable::DepTable(string const & f, - bool upd, - unsigned long one, - unsigned long two) +void DepTable::insert(FileName const & f, bool upd) { - // not quite sure if this is the correct place for MakeAbsPath - file = MakeAbsPath(f); - new_sum = 0; old_sum = 0; - if (one != 0) - new_sum = one; - if (two != 0) - old_sum = two; - if (upd) { - old_sum = new_sum; - new_sum = lyxsum(file.c_str()); + if (deplist.find(f) == deplist.end()) { + dep_info di; + di.crc_prev = 0; + if (upd) { + lyxerr[Debug::DEPEND] << " CRC..." << flush; + di.crc_cur = sum(f); + lyxerr[Debug::DEPEND] << "done." << endl; + struct stat f_info; + stat(f.toFilesystemEncoding().c_str(), &f_info); + di.mtime_cur = f_info.st_mtime; + } else { + di.crc_cur = 0; + di.mtime_cur = 0; + } + deplist[f] = di; + } else { + lyxerr[Debug::DEPEND] << " Already in DepTable" << endl; + } +} + + +void DepTable::update() +{ + lyxerr[Debug::DEPEND] << "Updating DepTable..." << endl; + time_type const start_time = current_time(); + + DepList::iterator itr = deplist.begin(); + while (itr != deplist.end()) { + dep_info &di = itr->second; + + struct stat f_info; + if (stat(itr->first.toFilesystemEncoding().c_str(), &f_info) == 0) { + if (di.mtime_cur == f_info.st_mtime) { + di.crc_prev = di.crc_cur; + lyxerr[Debug::DEPEND] << itr->first << " same mtime" << endl; + } else { + di.crc_prev = di.crc_cur; + lyxerr[Debug::DEPEND] << itr->first << " CRC... " << flush; + di.crc_cur = sum(itr->first); + lyxerr[Debug::DEPEND] << "done" << endl; + } + } else { + // file doesn't exist + // remove stale files - if it's re-created, it + // will be re-inserted by deplog. + lyxerr[Debug::DEPEND] << itr->first + << " doesn't exist. removing from DepTable." << endl; + DepList::iterator doomed = itr++; + deplist.erase(doomed); + continue; + } + + if (lyxerr.debugging(Debug::DEPEND)) { + if (di.changed()) + lyxerr << " +"; + lyxerr << endl; + } + ++itr; } - if (lyxerr.debugging()) { - char tmp1[256]; - char tmp2[256]; - sprintf(tmp1, "%lu", new_sum); - sprintf(tmp2, "%lu", old_sum); - lyxerr.debug("New file inserted in deplog: " + - file + " " + - tmp1 + " " + tmp2); + time_type const time_sec = current_time() - start_time; + lyxerr[Debug::DEPEND] << "Finished updating DepTable (" + << time_sec << " sec)." << endl; +} + + +bool DepTable::sumchange() const +{ + DepList::const_iterator cit = deplist.begin(); + DepList::const_iterator end = deplist.end(); + for (; cit != end; ++cit) { + if (cit->second.changed()) return true; } - next = 0; + return false; } -void DepTable::insert(string const & fi, - bool upd, - unsigned long one, - unsigned long two) +bool DepTable::haschanged(FileName const & fil) const { - // not quite sure if this is the correct place for MakeAbsPath - string f = MakeAbsPath(fi); - if (f == file) return; // exist already in the log - if (next) - next->insert(f, upd, one, two); - else - next = new DepTable(f, upd, one, two); + DepList::const_iterator cit = deplist.find(fil); + if (cit != deplist.end()) { + if (cit->second.changed()) + return true; + } + return false; } - -void DepTable::update() + +bool DepTable::extchanged(string const & ext) const { - if (!file.empty()) { - old_sum = new_sum; - new_sum = lyxsum(file.c_str()); - if (lyxerr.debugging()) { - char tmp1[256]; - char tmp2[256]; - sprintf(tmp1, "%lu", new_sum); - sprintf(tmp2, "%lu", old_sum); - lyxerr.debug("update: " + file + " " + - tmp1 + " " + tmp2); + DepList::const_iterator cit = deplist.begin(); + DepList::const_iterator end = deplist.end(); + for (; cit != end; ++cit) { + if (suffixIs(cit->first.absFilename(), ext)) { + if (cit->second.changed()) + return true; } } - if (next) next->update(); + return false; } -bool DepTable::sumchange() +bool DepTable::ext_exist(string const & ext) const { - bool ret = false; - - if (!file.empty()) { - if (old_sum != new_sum) ret = true; + DepList::const_iterator cit = deplist.begin(); + DepList::const_iterator end = deplist.end(); + for (; cit != end; ++cit) { + if (suffixIs(cit->first.absFilename(), ext)) { + return true; + } } - if (!ret && next) ret = next->sumchange(); - - return ret; + return false; } -bool DepTable::haschanged(string const & f) +bool DepTable::exist(FileName const & fil) const { - // not quite sure if this is the correct place for MakeAbsPath - string fil = MakeAbsPath(f); - bool ret = false; + return deplist.find(fil) != deplist.end(); +} - if (!fil.empty() && !file.empty() && fil == file) { - if (new_sum != old_sum && new_sum != 0) - ret = true; + +void DepTable::remove_files_with_extension(string const & suf) +{ + DepList::iterator cit = deplist.begin(); + DepList::iterator end = deplist.end(); + while (cit != end) { + if (suffixIs(cit->first.absFilename(), suf)) { + // Can't erase the current iterator, but we + // can increment and then erase. + // Deplist is a map so only the erased + // iterator is invalidated. + DepList::iterator doomed = cit++; + deplist.erase(doomed); + continue; + } + ++cit; } - if (!ret && next) ret = next->haschanged(fil); - return ret; } -void DepTable::write(string const&f) +void DepTable::remove_file(FileName const & filename) { - FilePtr fp(f, FilePtr::write); - if (fp() && next) next->write(fp()); + DepList::iterator cit = deplist.begin(); + DepList::iterator end = deplist.end(); + while (cit != end) { + if (cit->first == filename) { + // Can't erase the current iterator, but we + // can increment and then erase. + // deplist is a map so only the erased + // iterator is invalidated. + DepList::iterator doomed = cit++; + deplist.erase(doomed); + continue; + } + ++cit; + } } -void DepTable::read(string const &f) +void DepTable::write(FileName const & f) const { - FilePtr fp(f, FilePtr::read); - if (fp()) { // file opened - char nome[256]; - unsigned long one = 0; - unsigned long two = 0; - // scan the file line by line - // return true if the two numbers on the line is different - int ret = 0; - while (!feof(fp())) { - ret = fscanf(fp(), "%s %lu %lu", - nome, &one, &two); - if (ret !=3) continue; - if (lyxerr.debugging()) { - char tmp1[255]; - char tmp2[255]; - sprintf(tmp1, "%lu", one); - sprintf(tmp2, "%lu", two); - lyxerr.debug(string("read dep: ") + - nome + " " + tmp1 + - " " + tmp2); - } - insert(string(nome), false, one, two); + ofstream ofs(f.toFilesystemEncoding().c_str()); + DepList::const_iterator cit = deplist.begin(); + DepList::const_iterator end = deplist.end(); + for (; cit != end; ++cit) { + if (lyxerr.debugging(Debug::DEPEND)) { + // Store the second (most recently calculated) + // CRC value. + // The older one is effectively set to 0 upon re-load. + lyxerr << "Write dep: " + << cit->second.crc_cur << ' ' + << cit->second.mtime_cur << ' ' + << cit->first << endl; } + ofs << cit->second.crc_cur << ' ' + << cit->second.mtime_cur << ' ' + << cit->first << endl; } } -void DepTable::write(FILE * f) +bool DepTable::read(FileName const & f) { - if (lyxerr.debugging()) { - char tmp1[255]; - char tmp2[255]; - sprintf(tmp1, "%lu", new_sum); - sprintf(tmp2, "%lu", old_sum); - lyxerr.print("Write dep: " + file + " " + - tmp1 + " " + tmp2); + ifstream ifs(f.toFilesystemEncoding().c_str()); + string nome; + dep_info di; + // This doesn't change through the loop. + di.crc_prev = 0; + + while (ifs >> di.crc_cur >> di.mtime_cur && getline(ifs, nome)) { + nome = ltrim(nome); + if (lyxerr.debugging(Debug::DEPEND)) { + lyxerr << "Read dep: " + << di.crc_cur << ' ' + << di.mtime_cur << ' ' + << nome << endl; + } + deplist[FileName(nome)] = di; } - fprintf(f, "%s %lu %lu\n", file.c_str(), - new_sum, old_sum); - if (next) - next->write(f); + return deplist.size(); } + + +} // namespace lyx