]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/tex2lyx.C
add config.h
[lyx.git] / src / tex2lyx / tex2lyx.C
index f37f9cd0d817979d51a5ff63de2c8ed45732fde6..0f0c45fc90971db8618294e538118c8b460425b0 100644 (file)
 #include "support/fs_extras.h"
 #include "support/lstrings.h"
 #include "support/lyxlib.h"
+#include "support/ExceptionMessage.h"
 #include "support/os.h"
 #include "support/package.h"
+#include "support/unicode.h"
 
 #include <boost/function.hpp>
 #include <boost/filesystem/operations.hpp>
@@ -38,6 +40,9 @@
 #include <vector>
 #include <map>
 
+
+namespace lyx {
+
 using std::endl;
 using std::cout;
 using std::cerr;
@@ -52,17 +57,25 @@ using std::string;
 using std::vector;
 using std::map;
 
-using lyx::support::changeExtension;
-using lyx::support::isStrUnsignedInt;
-using lyx::support::ltrim;
-using lyx::support::makeAbsPath;
-using lyx::support::onlyPath;
-using lyx::support::rtrim;
-using lyx::support::isFileReadable;
+using support::changeExtension;
+using support::FileName;
+using support::isStrUnsignedInt;
+using support::ltrim;
+using support::makeAbsPath;
+using support::onlyPath;
+using support::rtrim;
+using support::isFileReadable;
 
 namespace fs = boost::filesystem;
 
 
+IconvProcessor & utf8ToUcs4()
+{
+       static IconvProcessor iconv(ucs4_codeset, "UTF-8");
+       return iconv;
+}
+
+
 // Hacks to allow the thing to link in the lyxlayout stuff
 LyXErr lyxerr(std::cerr.rdbuf());
 
@@ -225,9 +238,9 @@ void read_environment(Parser & p, string const & begin,
  * has almost all of them listed. For the same reason the reLyX-specific
  * reLyXre environment is ignored.
  */
-void read_syntaxfile(string const & file_name)
+void read_syntaxfile(FileName const & file_name)
 {
-       ifstream is(file_name.c_str());
+       ifstream is(file_name.toFilesystemEncoding().c_str());
        if (!is.good()) {
                cerr << "Could not open syntax file \"" << file_name
                     << "\" for reading." << endl;
@@ -369,8 +382,8 @@ void easyParse(int & argc, char * argv[])
                if (it == cmdmap.end())
                        continue;
 
-               string arg((i + 1 < argc) ? argv[i + 1] : "");
-               string arg2((i + 2 < argc) ? argv[i + 2] : "");
+               string arg(to_utf8(from_local8bit((i + 1 < argc) ? argv[i + 1] : "")));
+               string arg2(to_utf8(from_local8bit((i + 2 < argc) ? argv[i + 2] : "")));
 
                int const remove = 1 + it->second(arg, arg2);
 
@@ -444,17 +457,16 @@ void tex2lyx(std::istream &is, std::ostream &os)
 
 
 /// convert TeX from \p infilename to LyX and write it to \p os
-bool tex2lyx(string const &infilename, std::ostream &os)
+bool tex2lyx(FileName const & infilename, std::ostream &os)
 {
-       BOOST_ASSERT(lyx::support::absolutePath(infilename));
-       ifstream is(infilename.c_str());
+       ifstream is(infilename.toFilesystemEncoding().c_str());
        if (!is.good()) {
                cerr << "Could not open input file \"" << infilename
                     << "\" for reading." << endl;
                return false;
        }
        string const oldParentFilePath = parentFilePath;
-       parentFilePath = onlyPath(infilename);
+       parentFilePath = onlyPath(infilename.absFilename());
        tex2lyx(is, os);
        parentFilePath = oldParentFilePath;
        return true;
@@ -463,7 +475,7 @@ bool tex2lyx(string const &infilename, std::ostream &os)
 } // anonymous namespace
 
 
-bool tex2lyx(string const &infilename, string const &outfilename)
+bool tex2lyx(string const &infilename, FileName const &outfilename)
 {
        if (isFileReadable(outfilename)) {
                if (overwrite_files) {
@@ -477,7 +489,7 @@ bool tex2lyx(string const &infilename, string const &outfilename)
        } else {
                cerr << "Creating file " << outfilename << endl;
        }
-       ofstream os(outfilename.c_str());
+       ofstream os(outfilename.toFilesystemEncoding().c_str());
        if (!os.good()) {
                cerr << "Could not open output file \"" << outfilename
                     << "\" for writing." << endl;
@@ -487,12 +499,15 @@ bool tex2lyx(string const &infilename, string const &outfilename)
        cerr << "Input file: " << infilename << "\n";
        cerr << "Output file: " << outfilename << "\n";
 #endif
-       return tex2lyx(infilename, os);
+       return tex2lyx(FileName(infilename), os);
 }
 
+} // namespace lyx
+
 
 int main(int argc, char * argv[])
 {
+       using namespace lyx;
        fs::path::default_name_check(fs::no_check);
 
        easyParse(argc, argv);
@@ -504,39 +519,47 @@ int main(int argc, char * argv[])
        }
 
        lyx::support::os::init(argc, argv);
-       lyx::support::init_package(argv[0], cl_system_support, cl_user_support,
-                                  lyx::support::top_build_dir_is_two_levels_up);
+
+       try { support::init_package(to_utf8(from_local8bit(argv[0])),
+               cl_system_support, cl_user_support,
+               support::top_build_dir_is_two_levels_up);
+       } catch (support::ExceptionMessage const & message) {
+               cerr << to_utf8(message.title_) << ":\n"
+                       << to_utf8(message.details_) << endl;
+               if (message.type_ == support::ErrorException)
+                       exit(1);
+       }
 
        // Now every known option is parsed. Look for input and output
        // file name (the latter is optional).
-       string const infilename = makeAbsPath(argv[1]);
+       string const infilename = makeAbsPath(to_utf8(from_local8bit(argv[1]))).absFilename();
        string outfilename;
        if (argc > 2) {
-               outfilename = argv[2];
+               outfilename = to_utf8(from_local8bit(argv[2]));
                if (outfilename != "-")
-                       outfilename = makeAbsPath(argv[2]);
+                       outfilename = makeAbsPath(to_utf8(from_local8bit(argv[2]))).absFilename();
        } else
                outfilename = changeExtension(infilename, ".lyx");
 
-       string const system_syntaxfile = lyx::support::libFileSearch("", "syntax.default");
+       FileName const system_syntaxfile = lyx::support::libFileSearch("", "syntax.default");
        if (system_syntaxfile.empty()) {
                cerr << "Error: Could not find syntax file \"syntax.default\"." << endl;
                exit(1);
        }
        read_syntaxfile(system_syntaxfile);
        if (!syntaxfile.empty())
-               read_syntaxfile(syntaxfile);
+               read_syntaxfile(makeAbsPath(syntaxfile));
 
        masterFilePath = onlyPath(infilename);
        parentFilePath = masterFilePath;
 
        if (outfilename == "-") {
-               if (tex2lyx(infilename, cout))
+               if (tex2lyx(FileName(infilename), cout))
                        return EXIT_SUCCESS;
                else
                        return EXIT_FAILURE;
        } else {
-               if (tex2lyx(infilename, outfilename))
+               if (tex2lyx(infilename, FileName(outfilename)))
                        return EXIT_SUCCESS;
                else
                        return EXIT_FAILURE;