]> git.lyx.org Git - features.git/blobdiff - src/support/filetools.cpp
reduce line noise
[features.git] / src / support / filetools.cpp
index 44c8b1e4f83892b0f5a966b9871c8471687c99f0..7a35d0cb91a0137ddc3dde2c962f747b73e6d110 100644 (file)
@@ -24,7 +24,6 @@
 #include "support/convert.h"
 #include "support/environment.h"
 #include "support/filetools.h"
-#include "support/fs_extras.h"
 #include "support/lstrings.h"
 #include "support/lyxlib.h"
 #include "support/os.h"
@@ -79,10 +78,7 @@ bool isSGMLFilename(string const & filename)
 bool isValidLaTeXFilename(string const & filename)
 {
        string const invalid_chars("#$%{}()[]\"^");
-       if (filename.find_first_of(invalid_chars) != string::npos)
-               return false;
-       else
-               return true;
+       return filename.find_first_of(invalid_chars) == string::npos;
 }
 
 
@@ -157,29 +153,6 @@ string const quoteName(string const & name, quote_style style)
 }
 
 
-bool isFileReadable(FileName const & filename)
-{
-       std::string const path = filename.toFilesystemEncoding();
-       return fs::exists(path) && !fs::is_directory(path) && fs::is_readable(path);
-}
-
-
-//returns true: dir writeable
-//       false: not writeable
-bool isDirWriteable(FileName const & path)
-{
-       LYXERR(Debug::FILES) << "isDirWriteable: " << path << endl;
-
-       FileName const tmpfl(tempName(path, "lyxwritetest"));
-
-       if (tmpfl.empty())
-               return false;
-
-       unlink(tmpfl);
-       return true;
-}
-
-
 #if 0
 // Uses a string of paths separated by ";"s to find a file to open.
 // Can't cope with pathnames with a ';' in them. Returns full path to file.
@@ -224,11 +197,9 @@ vector<FileName> const dirList(FileName const & dir, string const & ext)
        // EXCEPTIONS FIXME. Rewrite needed when we turn on exceptions. (Lgb)
        vector<FileName> dirlist;
 
-       string const encoded_dir = dir.toFilesystemEncoding();
-       if (!(fs::exists(encoded_dir) && fs::is_directory(encoded_dir))) {
-               LYXERR(Debug::FILES)
-                       << "Directory \"" << dir
-                       << "\" does not exist to DirList." << endl;
+       if (!(dir.exists() && dir.isDirectory())) {
+               LYXERR(Debug::FILES, "Directory \"" << dir
+                       << "\" does not exist to DirList.");
                return dirlist;
        }
 
@@ -237,6 +208,7 @@ vector<FileName> const dirList(FileName const & dir, string const & ext)
                extension += '.';
        extension += ext;
 
+       string const encoded_dir = dir.toFilesystemEncoding();
        fs::directory_iterator dit(encoded_dir);
        fs::directory_iterator end;
        for (; dit != end; ++dit) {
@@ -259,7 +231,7 @@ FileName const fileSearch(string const & path, string const & name,
        string const tmpname = replaceEnvironmentPath(name);
        FileName fullname(makeAbsPath(tmpname, path));
        // search first without extension, then with it.
-       if (isFileReadable(fullname))
+       if (fullname.isReadable())
                return fullname;
        if (ext.empty())
                // We are done.
@@ -268,7 +240,7 @@ FileName const fileSearch(string const & path, string const & name,
        // fullname.
        if (getExtension(fullname.absFilename()) != ext)
                fullname = FileName(addExtension(fullname.absFilename(), ext));
-       if (isFileReadable(fullname) || mode == allow_unreadable)
+       if (fullname.isReadable() || mode == allow_unreadable)
                return fullname;
        return FileName();
 }
@@ -379,13 +351,10 @@ string const libScriptSearch(string const & command_in, quote_style style)
 }
 
 
-namespace {
-
-FileName const createTmpDir(FileName const & tempdir, string const & mask)
+static FileName createTmpDir(FileName const & tempdir, string const & mask)
 {
-       LYXERR(Debug::FILES)
-               << "createTmpDir: tempdir=`" << tempdir << "'\n"
-               << "createTmpDir:    mask=`" << mask << '\'' << endl;
+       LYXERR(Debug::FILES, "createTmpDir: tempdir=`" << tempdir << "'\n"
+               << "createTmpDir:    mask=`" << mask << '\'');
 
        FileName const tmpfl(tempName(tempdir, mask));
        // lyx::tempName actually creates a file to make sure that it
@@ -403,20 +372,6 @@ FileName const createTmpDir(FileName const & tempdir, string const & mask)
        return tmpfl;
 }
 
-} // namespace anon
-
-
-bool destroyDir(FileName const & tmpdir)
-{
-       try {
-               return fs::remove_all(tmpdir.toFilesystemEncoding()) > 0;
-       } catch (fs::filesystem_error const & fe){
-               lyxerr << "Could not delete " << tmpdir << ". (" << fe.what() << ")" << std::endl;
-               return false;
-       }
-}
-
-
 string const createBufferTmpDir()
 {
        static int count;
@@ -438,29 +393,21 @@ string const createBufferTmpDir()
 
 FileName const createLyXTmpDir(FileName const & deflt)
 {
-       if (!deflt.empty() && deflt.absFilename() != "/tmp") {
-               if (mkdir(deflt, 0777)) {
-                       if (isDirWriteable(deflt)) {
-                               // deflt could not be created because it
-                               // did exist already, so let's create our own
-                               // dir inside deflt.
-                               return createTmpDir(deflt, "lyx_tmpdir");
-                       } else {
-                               // some other error occured.
-                               return createTmpDir(FileName("/tmp"), "lyx_tmpdir");
-                       }
-               } else
-                       return deflt;
-       } else {
+       if (deflt.empty() || deflt.absFilename() == "/tmp")
                return createTmpDir(FileName("/tmp"), "lyx_tmpdir");
-       }
-}
 
+       if (!mkdir(deflt, 0777)) 
+               return deflt;
 
-bool createDirectory(FileName const & path, int permission)
-{
-       BOOST_ASSERT(!path.empty());
-       return mkdir(path, permission) == 0;
+       if (deflt.isDirWritable()) {
+               // deflt could not be created because it
+               // did exist already, so let's create our own
+               // dir inside deflt.
+               return createTmpDir(deflt, "lyx_tmpdir");
+       } else {
+               // some other error occured.
+               return createTmpDir(FileName("/tmp"), "lyx_tmpdir");
+       }
 }
 
 
@@ -472,7 +419,7 @@ string const onlyPath(string const & filename)
                return filename;
 
        // Find last / or start of filename
-       string::size_type j = filename.rfind('/');
+       size_t j = filename.rfind('/');
        return j == string::npos ? "./" : filename.substr(0, j + 1);
 }
 
@@ -625,23 +572,6 @@ string const normalizePath(string const & path)
 }
 
 
-string const getFileContents(FileName const & fname)
-{
-       string const encodedname = fname.toFilesystemEncoding();
-       if (fs::exists(encodedname)) {
-               ifstream ifs(encodedname.c_str());
-               ostringstream ofs;
-               if (ifs && ofs) {
-                       ofs << ifs.rdbuf();
-                       ifs.close();
-                       return ofs.str();
-               }
-       }
-       lyxerr << "LyX was not able to read file '" << fname << '\'' << endl;
-       return string();
-}
-
-
 // Search the string for ${VAR} and $VAR and replace VAR using getenv.
 string const replaceEnvironmentPath(string const & path)
 {
@@ -784,195 +714,6 @@ string const getExtension(string const & name)
 }
 
 
-// the different filetypes and what they contain in one of the first lines
-// (dots are any characters).          (Herbert 20020131)
-// AGR Grace...
-// BMP BM...
-// EPS %!PS-Adobe-3.0 EPSF...
-// FIG #FIG...
-// FITS ...BITPIX...
-// GIF GIF...
-// JPG JFIF
-// PDF %PDF-...
-// PNG .PNG...
-// PBM P1... or P4     (B/W)
-// PGM P2... or P5     (Grayscale)
-// PPM P3... or P6     (color)
-// PS  %!PS-Adobe-2.0 or 1.0,  no "EPSF"!
-// SGI \001\332...     (decimal 474)
-// TGIF        %TGIF...
-// TIFF        II... or MM...
-// XBM ..._bits[]...
-// XPM /* XPM */    sometimes missing (f.ex. tgif-export)
-//      ...static char *...
-// XWD \000\000\000\151        (0x00006900) decimal 105
-//
-// GZIP        \037\213        http://www.ietf.org/rfc/rfc1952.txt
-// ZIP PK...                   http://www.halyava.ru/document/ind_arch.htm
-// Z   \037\235                UNIX compress
-
-string const getFormatFromContents(FileName const & filename)
-{
-       // paranoia check
-       if (filename.empty() || !isFileReadable(filename))
-               return string();
-
-       ifstream ifs(filename.toFilesystemEncoding().c_str());
-       if (!ifs)
-               // Couldn't open file...
-               return string();
-
-       // gnuzip
-       static string const gzipStamp = "\037\213";
-
-       // PKZIP
-       static string const zipStamp = "PK";
-
-       // compress
-       static string const compressStamp = "\037\235";
-
-       // Maximum strings to read
-       int const max_count = 50;
-       int count = 0;
-
-       string str;
-       string format;
-       bool firstLine = true;
-       while ((count++ < max_count) && format.empty()) {
-               if (ifs.eof()) {
-                       LYXERR(Debug::GRAPHICS)
-                               << "filetools(getFormatFromContents)\n"
-                               << "\tFile type not recognised before EOF!"
-                               << endl;
-                       break;
-               }
-
-               getline(ifs, str);
-               string const stamp = str.substr(0, 2);
-               if (firstLine && str.size() >= 2) {
-                       // at first we check for a zipped file, because this
-                       // information is saved in the first bytes of the file!
-                       // also some graphic formats which save the information
-                       // in the first line, too.
-                       if (prefixIs(str, gzipStamp)) {
-                               format =  "gzip";
-
-                       } else if (stamp == zipStamp) {
-                               format =  "zip";
-
-                       } else if (stamp == compressStamp) {
-                               format =  "compress";
-
-                       // the graphics part
-                       } else if (stamp == "BM") {
-                               format =  "bmp";
-
-                       } else if (stamp == "\001\332") {
-                               format =  "sgi";
-
-                       // PBM family
-                       // Don't need to use str.at(0), str.at(1) because
-                       // we already know that str.size() >= 2
-                       } else if (str[0] == 'P') {
-                               switch (str[1]) {
-                               case '1':
-                               case '4':
-                                       format =  "pbm";
-                                   break;
-                               case '2':
-                               case '5':
-                                       format =  "pgm";
-                                   break;
-                               case '3':
-                               case '6':
-                                       format =  "ppm";
-                               }
-                               break;
-
-                       } else if ((stamp == "II") || (stamp == "MM")) {
-                               format =  "tiff";
-
-                       } else if (prefixIs(str,"%TGIF")) {
-                               format =  "tgif";
-
-                       } else if (prefixIs(str,"#FIG")) {
-                               format =  "fig";
-
-                       } else if (prefixIs(str,"GIF")) {
-                               format =  "gif";
-
-                       } else if (str.size() > 3) {
-                               int const c = ((str[0] << 24) & (str[1] << 16) &
-                                              (str[2] << 8)  & str[3]);
-                               if (c == 105) {
-                                       format =  "xwd";
-                               }
-                       }
-
-                       firstLine = false;
-               }
-
-               if (!format.empty())
-                   break;
-               else if (contains(str,"EPSF"))
-                       // dummy, if we have wrong file description like
-                       // %!PS-Adobe-2.0EPSF"
-                       format = "eps";
-
-               else if (contains(str, "Grace"))
-                       format = "agr";
-
-               else if (contains(str, "JFIF"))
-                       format = "jpg";
-
-               else if (contains(str, "%PDF"))
-                       format = "pdf";
-
-               else if (contains(str, "PNG"))
-                       format = "png";
-
-               else if (contains(str, "%!PS-Adobe")) {
-                       // eps or ps
-                       ifs >> str;
-                       if (contains(str,"EPSF"))
-                               format = "eps";
-                       else
-                           format = "ps";
-               }
-
-               else if (contains(str, "_bits[]"))
-                       format = "xbm";
-
-               else if (contains(str, "XPM") || contains(str, "static char *"))
-                       format = "xpm";
-
-               else if (contains(str, "BITPIX"))
-                       format = "fits";
-       }
-
-       if (!format.empty()) {
-               LYXERR(Debug::GRAPHICS)
-                       << "Recognised Fileformat: " << format << endl;
-               return format;
-       }
-
-       LYXERR(Debug::GRAPHICS)
-               << "filetools(getFormatFromContents)\n"
-               << "\tCouldn't find a known format!\n";
-       return string();
-}
-
-
-/// check for zipped file
-bool zippedFile(FileName const & name)
-{
-       string const type = getFormatFromContents(name);
-       if (contains("gzip zip compress", type) && !type.empty())
-               return true;
-       return false;
-}
-
-
 string const unzippedFileName(string const & zipped_file)
 {
        string const ext = getExtension(zipped_file);
@@ -1120,7 +861,7 @@ FileName const findtexfile(string const & fil, string const & /*format*/)
        // If the file can be found directly, we just return a
        // absolute path version of it.
        FileName const absfile(makeAbsPath(fil));
-       if (fs::exists(absfile.toFilesystemEncoding()))
+       if (absfile.exists())
                return absfile;
 
        // No we try to find it using kpsewhich.
@@ -1147,9 +888,8 @@ FileName const findtexfile(string const & fil, string const & /*format*/)
 
        cmd_ret const c = runCommand(kpsecmd);
 
-       LYXERR(Debug::LATEX) << "kpse status = " << c.first << '\n'
-                << "kpse result = `" << rtrim(c.second, "\n\r")
-                << '\'' << endl;
+       LYXERR(Debug::LATEX, "kpse status = " << c.first << '\n'
+                << "kpse result = `" << rtrim(c.second, "\n\r") << '\'');
        if (c.first != -1)
                return FileName(os::internal_path(rtrim(to_utf8(from_filesystem8bit(c.second)),
                                                        "\n\r")));
@@ -1165,7 +905,7 @@ void removeAutosaveFile(string const & filename)
        a += onlyFilename(filename);
        a += '#';
        FileName const autosave(a);
-       if (fs::exists(autosave.toFilesystemEncoding()))
+       if (autosave.exists())
                unlink(autosave);
 }
 
@@ -1173,8 +913,7 @@ void removeAutosaveFile(string const & filename)
 void readBB_lyxerrMessage(FileName const & file, bool & zipped,
        string const & message)
 {
-       LYXERR(Debug::GRAPHICS) << "[readBB_from_PSFile] "
-               << message << std::endl;
+       LYXERR(Debug::GRAPHICS, "[readBB_from_PSFile] " << message);
        // FIXME: Why is this func deleting a file? (Lgb)
        if (zipped)
                unlink(file);
@@ -1190,9 +929,9 @@ string const readBB_from_PSFile(FileName const & file)
        // end of the file. Than we have in the header:
        // %%BoundingBox: (atend)
        // In this case we must check the end.
-       bool zipped = zippedFile(file);
+       bool zipped = file.isZippedFile();
        FileName const file_ = zipped ? unzipFile(file) : file;
-       string const format = getFormatFromContents(file_);
+       string const format = file_.guessFormatFromContents();
 
        if (format != "eps" && format != "ps") {
                readBB_lyxerrMessage(file_, zipped,"no(e)ps-format");
@@ -1224,23 +963,20 @@ string const readBB_from_PSFile(FileName const & file)
 }
 
 
-int compare_timestamps(FileName const & filename1, FileName const & filename2)
+int compare_timestamps(FileName const & file1, FileName const & file2)
 {
        // If the original is newer than the copy, then copy the original
        // to the new directory.
 
-       string const file1 = filename1.toFilesystemEncoding();
-       string const file2 = filename2.toFilesystemEncoding();
        int cmp = 0;
-       if (fs::exists(file1) && fs::exists(file2)) {
-               double const tmp = difftime(fs::last_write_time(file1),
-                                           fs::last_write_time(file2));
+       if (file1.exists() && file2.exists()) {
+               double const tmp = difftime(file1.lastModified(), file2.lastModified());
                if (tmp != 0)
                        cmp = tmp > 0 ? 1 : -1;
 
-       } else if (fs::exists(file1)) {
+       } else if (file1.exists()) {
                cmp = 1;
-       } else if (fs::exists(file2)) {
+       } else if (file2.exists()) {
                cmp = -1;
        }