X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Ffiletools.cpp;h=a72c93ed610ce7c711df4eab94f2d8d0f7ae7446;hb=8d640dc77608bedddb5b00982c23665584f52d21;hp=040272aade620e406bed47dcca8947126c0c763d;hpb=158b9a0e551144ca357d6635af9cddcc446bb91f;p=lyx.git diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp index 040272aade..a72c93ed61 100644 --- a/src/support/filetools.cpp +++ b/src/support/filetools.cpp @@ -291,7 +291,7 @@ FileName const fileOpenSearch(string const & path, string const & name, // Returns the real name of file name in directory path, with optional // extension ext. FileName const fileSearch(string const & path, string const & name, - string const & ext, search_mode mode) + string const & exts, search_mode mode) { // if `name' is an absolute path, we ignore the setting of `path' // Expand Environmentvariables in 'name' @@ -300,21 +300,29 @@ FileName const fileSearch(string const & path, string const & name, // search first without extension, then with it. if (fullname.isReadableFile()) return fullname; - if (ext.empty()) + if (exts.empty()) // We are done. return mode == may_not_exist ? fullname : FileName(); - // Only add the extension if it is not already the extension of - // fullname. - if (getExtension(fullname.absFileName()) != ext) { - if (mode == check_hidpi) { - FileName fullname2x = FileName(addExtension(fullname.absFileName() + "@2x", ext)); - if (fullname2x.isReadableFile()) - return fullname2x; + int n = 0; + string ext = token(exts, ',', n); + while (!ext.empty()) { + // Only add the extension if it is not already the extension of + // fullname. + bool addext = getExtension(fullname.absFileName()) != ext; + if (addext) { + if (mode == check_hidpi) { + FileName fullname2x = FileName(addExtension(fullname.absFileName() + "@2x", ext)); + if (fullname2x.isReadableFile()) + return fullname2x; + } + fullname = FileName(addExtension(fullname.absFileName(), ext)); } - fullname = FileName(addExtension(fullname.absFileName(), ext)); + if (fullname.isReadableFile() || mode == may_not_exist) + return fullname; + if (addext) + fullname.changeExtension(""); + ext = token(exts, ',', ++n); } - if (fullname.isReadableFile() || mode == may_not_exist) - return fullname; return FileName(); } @@ -502,7 +510,7 @@ FileName const createLyXTmpDir(FileName const & deflt) // dir inside deflt. return createTmpDir(deflt, "lyx_tmpdir"); } else { - // some other error occured. + // some other error occurred. return createTmpDir(package().system_temp_dir(), "lyx_tmpdir"); } } @@ -692,29 +700,59 @@ string const replaceEnvironmentPath(string const & path) // Return a command prefix for setting the environment of the TeX engine. -string latexEnvCmdPrefix(string const & path) +string latexEnvCmdPrefix(string const & path, string const & lpath) { - if (path.empty() || lyxrc.texinputs_prefix.empty()) + bool use_lpath = !(lpath.empty() || lpath == "." || lpath == "./"); + + if (path.empty() || (lyxrc.texinputs_prefix.empty() && !use_lpath)) return string(); - string const texinputs_prefix = os::latex_path_list( + string texinputs_prefix = lyxrc.texinputs_prefix.empty() ? string() + : os::latex_path_list( replaceCurdirPath(path, lyxrc.texinputs_prefix)); + string const allother_prefix = os::latex_path_list(path); string const sep = string(1, os::path_separator(os::TEXENGINE)); string const texinputs = getEnv("TEXINPUTS"); + string const bibinputs = getEnv("BIBINPUTS"); + string const bstinputs = getEnv("BSTINPUTS"); + string const texfonts = getEnv("TEXFONTS"); + + if (use_lpath) { + string const abslpath = FileName::isAbsolute(lpath) + ? os::latex_path(lpath) + : os::latex_path(FileName(path + "/" + lpath).realPath()); + if (texinputs_prefix.empty()) + texinputs_prefix = abslpath; + else if (suffixIs(texinputs_prefix, sep)) + texinputs_prefix.append(abslpath + sep); + else + texinputs_prefix.append(sep + abslpath); + } if (os::shell() == os::UNIX) return "env TEXINPUTS=\"." + sep + texinputs_prefix - + sep + texinputs + "\" "; + + sep + texinputs + "\" " + + "BIBINPUTS=\"." + sep + allother_prefix + + sep + bibinputs + "\" " + + "BSTINPUTS=\"." + sep + allother_prefix + + sep + bstinputs + "\" " + + "TEXFONTS=\"." + sep + allother_prefix + + sep + texfonts + "\" "; else -#ifndef USE_QPROCESS - return "cmd /d /c set \"TEXINPUTS=." - + sep + texinputs_prefix - + sep + texinputs + "\"&"; -#else - return "cmd /d /c set \"\"\"TEXINPUTS=." - + sep + texinputs_prefix - + sep + texinputs + "\"\"\"&"; -#endif + // NOTE: the dummy blank dirs are necessary to force the + // QProcess parser to quote the argument (see bug 9453) + return "cmd /d /c set \"TEXINPUTS=." + sep + " " + + sep + texinputs_prefix + + sep + texinputs + "\" & " + + "set \"BIBINPUTS=." + sep + " " + + sep + allother_prefix + + sep + bibinputs + "\" & " + + "set \"BSTINPUTS=." + sep + " " + + sep + allother_prefix + + sep + bstinputs + "\" & " + + "set \"TEXFONTS=." + sep + " " + + sep + allother_prefix + + sep + texfonts + "\" & "; } @@ -745,7 +783,7 @@ string const replaceCurdirPath(string const & path, string const & pathlist) } if (i != string::npos) { newpathlist += sep; - // Stop here if the last element is empty + // Stop here if the last element is empty if (++i == oldpathlist.length()) break; } @@ -872,6 +910,8 @@ string const unzippedFileName(string const & zipped_file) string const ext = getExtension(zipped_file); if (ext == "gz" || ext == "z" || ext == "Z") return changeExtension(zipped_file, string()); + else if (ext == "svgz") + return changeExtension(zipped_file, "svg"); return onlyPath(zipped_file) + "unzipped_" + onlyFileName(zipped_file); } @@ -921,13 +961,11 @@ docstring const makeDisplayPath(string const & path, unsigned int threshold) if (dstr.empty()) { // Yes, filename itself is too long. // Pick the start and the end of the filename. - dstr = from_utf8(onlyFileName(path)); - docstring const head = dstr.substr(0, threshold / 2 - 3); - - docstring::size_type len = dstr.length(); - docstring const tail = - dstr.substr(len - threshold / 2 - 2, len - 1); - dstr = head + from_ascii("...") + tail; + docstring fstr = from_utf8(onlyFileName(path)); + dstr = fstr; + if (support::truncateWithEllipsis(dstr, threshold / 2)) + dstr += fstr.substr(fstr.length() - threshold / 2 - 2, + docstring::npos); } return from_utf8(os::external_path(prefix + to_utf8(dstr))); @@ -986,7 +1024,6 @@ cmd_ret const runCommand(string const & cmd) // variants ipstream, opstream #if defined (_WIN32) - int fno; STARTUPINFO startup; PROCESS_INFORMATION process; SECURITY_ATTRIBUTES security; @@ -1028,7 +1065,7 @@ cmd_ret const runCommand(string const & cmd) 0, 0, &startup, &process)) { CloseHandle(process.hThread); - fno = _open_osfhandle((long)in, _O_RDONLY); + int fno = _open_osfhandle((intptr_t)in, _O_RDONLY); CloseHandle(out); inf = _fdopen(fno, "r"); } @@ -1172,19 +1209,43 @@ bool prefs2prefs(FileName const & filename, FileName const & tempfile, bool lfun return true; } + +bool configFileNeedsUpdate(string const & file) +{ + // We cannot initialize configure_script directly because the package + // is not initialized yet when static objects are constructed. + static FileName configure_script; + static bool firstrun = true; + if (firstrun) { + configure_script = + FileName(addName(package().system_support().absFileName(), + "configure.py")); + firstrun = false; + } + + FileName absfile = + FileName(addName(package().user_support().absFileName(), file)); + return !absfile.exists() + || configure_script.lastModified() > absfile.lastModified(); +} + + int fileLock(const char * lock_file) { int fd = -1; #if defined(HAVE_LOCKF) fd = open(lock_file, O_CREAT|O_APPEND|O_SYNC|O_RDWR, 0666); + if (fd == -1) + return -1; if (lockf(fd, F_LOCK, 0) != 0) { close(fd); - return(-1); + return -1; } #endif - return(fd); + return fd; } + void fileUnlock(int fd, const char * /* lock_file*/) { #if defined(HAVE_LOCKF)