#include <cctype>
#include <utility>
-using std::make_pair;
-using std::pair;
+#include <fstream>
+
+#ifdef HAVE_SSTREAM
+#include <sstream>
+#else
+#include <strstream>
+#endif
#ifdef __GNUG__
#pragma implementation "filetools.h"
# endif
#endif
+using std::make_pair;
+using std::pair;
+using std::endl;
+using std::ifstream;
+
extern string system_lyxdir;
extern string build_lyxdir;
extern string user_lyxdir;
}
-bool IsSGMLFilename(string const & filename)
-{
- return contains(filename, ".sgml");
-}
-
-
// Substitutes spaces with underscores in filename (and path)
-string MakeLatexName(string const & file)
+string const MakeLatexName(string const & file)
{
string name = OnlyFilename(file);
string path = OnlyPath(file);
return AddName(path, name);
}
+
// Substitutes spaces with underscores in filename (and path)
-string QuoteName(string const & name)
+string const QuoteName(string const & name)
{
-#ifdef WITH_WARNINGS
-#warning Add proper emx support here!
-#endif
+ // CHECK Add proper emx support here!
#ifndef __EMX__
return '\'' + name + '\'';
#else
}
-/// Returns an unique name to be used as a temporary file.
-string TmpFileName(string const & dir, string const & mask)
+// Returns an unique name to be used as a temporary file.
+string const TmpFileName(string const & dir, string const & mask)
{// With all these temporary variables, it should be safe enough :-) (JMarc)
string tmpdir;
if (dir.empty())
tmpdir = system_tempdir;
else
tmpdir = dir;
- string tmpfl = AddName(tmpdir, mask);
+ string tmpfl(AddName(tmpdir, mask));
// find a uniq postfix for the filename...
// using the pid, and...
// -1: error- couldn't find out
int IsDirWriteable (string const & path)
{
- string tmpfl = TmpFileName(path);
+ string tmpfl(TmpFileName(path));
if (tmpfl.empty()) {
WriteFSAlert(_("LyX Internal Error!"),
// If path entry begins with $$LyX/, use system_lyxdir
// If path entry begins with $$User/, use user_lyxdir
// Example: "$$User/doc;$$LyX/doc"
-string FileOpenSearch (string const & path, string const & name,
- string const & ext)
+string const FileOpenSearch (string const & path, string const & name,
+ string const & ext)
{
string real_file, path_element;
bool notfound = true;
// Returns the real name of file name in directory path, with optional
// extension ext.
-string FileSearch(string const & path, string const & name,
- string const & ext)
+string const FileSearch(string const & path, string const & name,
+ string const & ext)
{
// if `name' is an absolute path, we ignore the setting of `path'
// Expand Environmentvariables in 'name'
// 1) user_lyxdir
// 2) build_lyxdir (if not empty)
// 3) system_lyxdir
-string LibFileSearch(string const & dir, string const & name,
- string const & ext)
+string const LibFileSearch(string const & dir, string const & name,
+ string const & ext)
{
string fullname = FileSearch(AddPath(user_lyxdir, dir),
name, ext);
}
-string i18nLibFileSearch(string const & dir, string const & name,
- string const & ext)
+string const
+i18nLibFileSearch(string const & dir, string const & name,
+ string const & ext)
{
string lang = token(string(GetEnv("LANG")), '_', 0);
}
-string GetEnv(string const & envname)
+string const GetEnv(string const & envname)
{
// f.ex. what about error checking?
char const * const ch = getenv(envname.c_str());
}
-string GetEnvPath(string const & name)
+string const GetEnvPath(string const & name)
{
#ifndef __EMX__
string pathlist = subst(GetEnv(name), ':', ';');
bool PutEnv(string const & envstr)
{
-#ifdef WITH_WARNINGS
-#warning Look at and fix this.
-#endif
+ // CHECK Look at and fix this.
// f.ex. what about error checking?
+
#if HAVE_PUTENV
// this leaks, but what can we do about it?
// Is doing a getenv() and a free() of the older value
string varname;
string str = envstr.split(varname,'=');
int retval = setenv(varname.c_str(), str.c_str(), true);
+#else
+ // No environment setting function. Can this happen?
+ int retval = 1; //return an error condition.
#endif
#endif
return retval == 0;
// library. Check out http://www.boost.org/
// For directory access we will then use the directory_iterator.
// Then the code will be something like:
- // directory_iterator dit(path.c_str());
- // if (<some way to detect failure>) {
+ // directory_iterator dit(path);
+ // directory_iterator dend;
+ // if (dit == dend) {
// WriteFSAlert(_("Error! Cannot open directory:"), path);
// return -1;
// }
- // for (; dit != <someend>; ++dit) {
- // if ((*dit) == 2." || (*dit) == "..")
+ // for (; dit != dend; ++dit) {
+ // string filename(*dit);
+ // if (filename == "." || filename == "..")
// continue;
- // string unlinkpath = AddName(path, temp);
+ // string unlinkpath(AddName(path, filename));
// if (remove(unlinkpath.c_str()))
// WriteFSAlert(_("Error! Could not remove file:"),
// unlinkpath);
static
-string CreateTmpDir (string const & tempdir, string const & mask)
+string const CreateTmpDir (string const & tempdir, string const & mask)
{
- string tmpfl = TmpFileName(tempdir, mask);
+ string tmpfl(TmpFileName(tempdir, mask));
if ((tmpfl.empty()) || lyx::mkdir (tmpfl.c_str(), 0777)) {
WriteFSAlert(_("Error! Couldn't create temporary directory:"),
}
-string CreateBufferTmpDir (string const & pathfor)
+string const CreateBufferTmpDir (string const & pathfor)
{
return CreateTmpDir(pathfor, "lyx_bufrtmp");
}
}
-string CreateLyXTmpDir (string const & deflt)
+string const CreateLyXTmpDir (string const & deflt)
{
if ((!deflt.empty()) && (deflt != "/tmp")) {
if (lyx::mkdir(deflt.c_str(), 0777)) {
#ifdef __EMX__
Path p(user_lyxdir);
#endif
- string t = CreateTmpDir (deflt.c_str(), "lyx_tmp");
+ string t(CreateTmpDir (deflt.c_str(), "lyx_tmp"));
return t;
} else
return deflt;
#ifdef __EMX__
Path p(user_lyxdir);
#endif
- string t = CreateTmpDir ("/tmp", "lyx_tmp");
+ string t(CreateTmpDir ("/tmp", "lyx_tmp"));
return t;
}
}
// Creates directory. Returns true if succesfull
bool createDirectory(string const & path, int permission)
{
- string temp = strip(CleanupPath(path), '/');
+ string temp(strip(CleanupPath(path), '/'));
if (temp.empty()) {
WriteAlert(_("Internal error!"),
// Returns current working directory
-string GetCWD ()
+string const GetCWD ()
{
int n = 256; // Assume path is less than 256 chars
char * err;
// Strip filename from path name
-string OnlyPath(string const & Filename)
+string const OnlyPath(string const & Filename)
{
// If empty filename, return empty
if (Filename.empty()) return Filename;
// Convert relative path into absolute path based on a basepath.
// If relpath is absolute, just use that.
// If basepath is empty, use CWD as base.
-string MakeAbsPath(string const & RelPath, string const & BasePath)
+string const MakeAbsPath(string const & RelPath, string const & BasePath)
{
// checks for already absolute path
if (AbsolutePath(RelPath))
return RelPath;
// Copies given paths
- string TempRel = CleanupPath(RelPath);
+ string TempRel(CleanupPath(RelPath));
string TempBase;
TempBase.erase(TempBase.length() - 2);
// processes relative path
- string RTemp = TempRel;
+ string RTemp(TempRel);
string Temp;
while (!RTemp.empty()) {
// Correctly append filename to the pathname.
// If pathname is '.', then don't use pathname.
// Chops any path of filename.
-string AddName(string const & path, string const & fname)
+string const AddName(string const & path, string const & fname)
{
// Get basename
- string basename = OnlyFilename(fname);
+ string basename(OnlyFilename(fname));
string buf;
// Strips path from filename
-string OnlyFilename(string const & fname)
+string const OnlyFilename(string const & fname)
{
if (fname.empty())
return fname;
// Create absolute path. If impossible, don't do anything
// Supports ./ and ~/. Later we can add support for ~logname/. (Asger)
-string ExpandPath(string const & path)
+string const ExpandPath(string const & path)
{
// checks for already absolute path
- string RTemp = ReplaceEnvironmentPath(path);
+ string RTemp(ReplaceEnvironmentPath(path));
if (AbsolutePath(RTemp))
return RTemp;
string copy(RTemp);
// Split by next /
- RTemp= split(RTemp, Temp, '/');
+ RTemp = split(RTemp, Temp, '/');
if (Temp == ".") {
return GetCWD() + '/' + RTemp;
// Normalize a path
// Constracts path/../path
// Can't handle "../../" or "/../" (Asger)
-string NormalizePath(string const & path)
+string const NormalizePath(string const & path)
{
string TempBase;
string RTemp;
return TempBase;
}
-string CleanupPath(string const & path)
+
+string const CleanupPath(string const & path)
{
#ifdef __EMX__ /* SMiyata: This should fix searchpath bug. */
string temppath = subst(path, '\\', '/');
}
+string const GetFileContents(string const & fname)
+{
+ FileInfo finfo(fname);
+ if (finfo.exist()) {
+ ifstream ifs(fname.c_str());
+#ifdef HAVE_SSTREAM
+ std::ostringstream ofs;
+#else
+#warning The rumour goes that this might leak, but who really cares?
+ ostrstream ofs;
+#endif
+ if (ifs && ofs) {
+ ofs << ifs.rdbuf();
+ ifs.close();
+#ifdef HAVE_SSTREAM
+ return ofs.str().c_str();
+#else
+ ofs << '\0';
+ char const * tmp = ofs.str();
+ string ret(tmp);
+ delete[] tmp;
+ return ret;
+#endif
+ }
+ }
+ lyxerr << "LyX was not able to read file '" << fname << "'" << endl;
+ return string();
+}
+
+
//
// Search ${...} as Variable-Name inside the string and replace it with
// the denoted environmentvariable
// variable := '$' '{' [A-Za-z_]{[A-Za-z_0-9]*} '}'
//
-string ReplaceEnvironmentPath(string const & path)
+string const ReplaceEnvironmentPath(string const & path)
{
//
// CompareChar: Environmentvariables starts with this character
if (!regexMatch(copy1, RegExp)) {
// No EndChar inside. So we are finished
result1 += CompareString + result0;
- result0.clear();
+ result0.erase();
continue;
}
continue;
}
- string env = GetEnv(res1_contents+1);
+ string env(GetEnv(res1_contents + 1));
if (!env.empty()) {
// Congratulations. Environmentvariable found
result1 += env;
// Make relative path out of two absolute paths
-string MakeRelPath(string const & abspath0, string const & basepath0)
+string const MakeRelPath(string const & abspath0, string const & basepath0)
// Makes relative path out of absolute path. If it is deeper than basepath,
// it's easy. If basepath and abspath share something (they are all deeper
// than some directory), it'll be rendered using ..'s. If they are completely
if (abspath.empty())
return "<unknown_path>";
- const int abslen = abspath.length();
- const int baselen = basepath.length();
+ int const abslen = abspath.length();
+ int const baselen = basepath.length();
// Find first different character
int i = 0;
// Append sub-directory(ies) to a path in an intelligent way
-string AddPath(string const & path, string const & path_2)
+string const AddPath(string const & path, string const & path_2)
{
string buf;
string path2 = CleanupPath(path_2);
Strips path off if no_path == true.
If no extension on oldname, just appends.
*/
-string ChangeExtension(string const & oldname, string const & extension,
- bool no_path)
+string const
+ChangeExtension(string const & oldname, string const & extension)
{
string::size_type last_slash = oldname.rfind('/');
string::size_type last_dot = oldname.rfind('.');
ext= '.' + extension;
else
ext = extension;
- string ret_str;
- if (no_path && last_slash != string::npos) {
- ++last_slash; // step it
- ret_str = oldname.substr(last_slash,
- last_dot - last_slash) + ext;
- } else
- ret_str = oldname.substr(0, last_dot) + ext;
- return CleanupPath(ret_str);
+
+ return CleanupPath(oldname.substr(0, last_dot) + ext);
}
// Creates a nice compact path for displaying
-string MakeDisplayPath (string const & path, unsigned int threshold)
+string const
+MakeDisplayPath (string const & path, unsigned int threshold)
{
- const int l1 = path.length();
+ int const l1 = path.length();
// First, we try a relative path compared to home
- string home = GetEnvPath("HOME");
+ string const home(GetEnvPath("HOME"));
string relhome = MakeRelPath(path, home);
unsigned int l2 = relhome.length();
typedef pair<int, string> cmdret;
-static cmdret do_popen(string const & cmd)
+static
+cmdret const do_popen(string const & cmd)
{
// One question is if we should use popen or
// create our own popen based on fork, exec, pipe
}
-string findtexfile(string const & fil, string const & format)
+string const
+findtexfile(string const & fil, string const & /*format*/)
{
/* There is no problem to extend this function too use other
methods to look for files. It could be setup to look
Lgb
*/
- // If fil is a file with absolute path we just return it
- if (AbsolutePath(fil)) return fil;
-
- // Check in the current dir.
- if (FileInfo(OnlyFilename(fil)).exist())
- return OnlyFilename(fil);
-
- // No we try to find it using kpsewhich.
- string kpsecmd = "kpsewhich --format=" + format + " " + OnlyFilename(fil);
+ // If the file can be found directly, we just return a
+ // absolute path version of it.
+ if (FileInfo(fil).exist())
+ return MakeAbsPath(fil);
- cmdret c = do_popen(kpsecmd);
+ // No we try to find it using kpsewhich.
+ // It seems from the kpsewhich manual page that it is safe to use
+ // kpsewhich without --format: "When the --format option is not
+ // given, the search path used when looking for a file is inferred
+ // from the name given, by looking for a known extension. If no
+ // known extension is found, the search path for TeX source files
+ // is used."
+ // However, we want to take advantage of the format sine almost all
+ // the different formats has environment variables that can be used
+ // to controll which paths to search. f.ex. bib looks in
+ // BIBINPUTS and TEXBIB. Small list follows:
+ // bib - BIBINPUTS, TEXBIB
+ // bst - BSTINPUTS
+ // graphic/figure - TEXPICTS, TEXINPUTS
+ // ist - TEXINDEXSTYLE, INDEXSTYLE
+ // pk - PROGRAMFONTS, PKFONTS, TEXPKS, GLYPHFONTS, TEXFONTS
+ // tex - TEXINPUTS
+ // tfm - TFMFONTS, TEXFONTS
+ // This means that to use kpsewhich in the best possible way we
+ // should help it by setting additional path in the approp. envir.var.
+ string const kpsecmd = "kpsewhich " + fil;
+
+ cmdret const c = do_popen(kpsecmd);
lyxerr[Debug::LATEX] << "kpse status = " << c.first << "\n"
<< "kpse result = `" << strip(c.second, '\n')