diff --git a/src/pdf2htmlEX.cc b/src/pdf2htmlEX.cc
index 6ca3512..cbfce42 100644
--- a/src/pdf2htmlEX.cc
+++ b/src/pdf2htmlEX.cc
@@ -41,33 +41,10 @@ using namespace pdf2htmlEX;
Param param;
ArgParser argparser;
-string data_dir;
#ifdef _WIN32
-#include
-#include
-char *mkdtemp(char *tempbuf) {
- int rand_value = 0;
- char* tempbase = NULL;
- char tempbasebuf[MAX_PATH] = "";
-
- if (strcmp(&tempbuf[strlen(tempbuf)-6], "XXXXXX")) {
- errno = EINVAL;
- return NULL;
- }
-
- srand((unsigned)time(0));
- rand_value = (int)((rand() / ((double)RAND_MAX+1.0)) * 1e6);
- tempbase = strrchr(tempbuf, '/');
- tempbase = tempbase ? tempbase+1 : tempbuf;
- strcpy(tempbasebuf, tempbase);
- sprintf(&tempbasebuf[strlen(tempbasebuf)-6], "%d", rand_value);
- ::GetTempPath(MAX_PATH, tempbuf);
- strcat(tempbuf, tempbasebuf);
- ::CreateDirectory(tempbuf, NULL);
- return tempbuf;
-}
-
+# include
+# include
#endif
void deprecated_font_suffix(const char * dummy = nullptr)
@@ -94,7 +71,7 @@ void show_version_and_exit(const char * dummy = nullptr)
cerr << " cairo " << cairo_version_string() << endl;
#endif
#ifdef _WIN32
- cerr << "Default data-dir: " << data_dir << endl;
+ cerr << "Default data-dir: " << param.data_dir << endl;
#else
cerr << "Default data-dir: " << PDF2HTMLEX_DATA_PATH << endl;
#endif
@@ -138,6 +115,39 @@ void embed_parser (const char * str)
}
}
+void prepare_directories()
+{
+ std::string tmp_dir = param.basetmp_dir + "/pdf2htmlEX-XXXXXX";
+#ifndef _WIN32
+ errno = 0;
+
+ auto_ptr pBuf(new char[tmp_dir.size() + 1]);
+ strcpy(pBuf.get(), tmp_dir.c_str());
+ auto p = mkdtemp(pBuf.get());
+ if(p == nullptr)
+ {
+ const char * errmsg = strerror(errno);
+ if(!errmsg)
+ {
+ errmsg = "unknown error";
+ }
+ cerr << "Cannot create temp directory: " << errmsg << endl;
+ exit(EXIT_FAILURE);
+ }
+ param.tmp_dir = pBuf.get();
+#else
+ srand((unsigned)time(0));
+ int rand_value = (int)((rand() / ((double)RAND_MAX+1.0)) * 1e6);
+ stringstream ss;
+ ss << setw(6) << rand_value;
+
+ std::cout << "1- " << tmp_dir << endl;
+ tmp_dir.erase(tmp_dir.size() - 6);
+ param.tmp_dir = tmp_dir + ss.str();
+ ::CreateDirectory(param.tmp_dir.c_str(), NULL);
+#endif
+}
+
void parse_options (int argc, char **argv)
{
argparser
@@ -200,8 +210,9 @@ void parse_options (int argc, char **argv)
// misc.
.add("clean-tmp", ¶m.clean_tmp, 1, "remove temporary files after conversion")
+ .add("base-tmp-dir", ¶m.basetmp_dir, param.basetmp_dir, "base temporary directory - will create pdf2htmlEX-XXXXXX under it")
#ifdef _WIN32
- .add("data-dir", ¶m.data_dir, data_dir, "specify data directory")
+ .add("data-dir", ¶m.data_dir, param.data_dir, "specify data directory")
#else
.add("data-dir", ¶m.data_dir, PDF2HTMLEX_DATA_PATH, "specify data directory")
#endif
@@ -353,12 +364,19 @@ void check_param()
int main(int argc, char **argv)
{
-#ifdef _WIN32
+#ifndef _WIN32
+ param.basetmp_dir = "/tmp";
+#else
{
// Under Windows, the default data_dir is under /data in the pdf2htmlEX directory
stringstream ss;
ss << dirname(argv[0]) << "/data";
- data_dir = ss.str();
+ param.data_dir = ss.str();
+
+ // Under Windows, the temp path is not under /tmp, find it.
+ char temppath[MAX_PATH];
+ ::GetTempPath(MAX_PATH, temppath);
+ param.basetmp_dir = temppath;
}
#endif
@@ -366,26 +384,13 @@ int main(int argc, char **argv)
check_param();
//prepare the directories
- {
- char buf[] = "/tmp/pdf2htmlEX-XXXXXX";
- errno = 0;
- auto p = mkdtemp(buf);
- if(p == nullptr)
- {
- const char * errmsg = strerror(errno);
- if(!errmsg)
- {
- errmsg = "unknown error";
- }
- cerr << "Cannot create temp directory: " << errmsg << endl;
- exit(EXIT_FAILURE);
- }
- param.tmp_dir = buf;
+ prepare_directories();
+
+ if(param.debug) {
+ cerr << "temporary dir: " << (param.tmp_dir) << endl;
}
- if(param.debug)
- cerr << "temporary dir: " << (param.tmp_dir) << endl;
-
+ exit(0);
try
{
create_directories(param.dest_dir);