]> www.ginac.de Git - ginac.git/blobdiff - ginac/excompiler.cpp
Happy New Year!
[ginac.git] / ginac / excompiler.cpp
index 0febfbd34046c1722f1a872d78b25ff028b90077..c54c4659c297d0f242b816c328315134ba1e68ab 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 /*
- *  GiNaC Copyright (C) 1999-2014 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2019 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #include "symbol.h"
 
 #ifdef HAVE_LIBDL
-#include <dlfcn.h>
+# include <dlfcn.h>
 #endif // def HAVE_LIBDL
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#else
+# ifdef _MSC_VER
+#  include <io.h>  // for close(3)
+# endif // def _MSC_VER
+#endif // def HAVE_UNISTD_H
+#include <cstdlib>
 #include <fstream>
 #include <ios>
 #include <sstream>
@@ -48,7 +56,7 @@
 namespace GiNaC {
 
 #ifdef HAVE_LIBDL
-       
+
 /**
  * Small class that manages modules opened by libdl. It is used by compile_ex
  * and link_ex in order to have a clean-up of opened modules and their
@@ -72,11 +80,11 @@ class excompiler
        std::vector<filedesc> filelist; /**< List of all opened modules */
 public:
        /**
-        * Complete clean-up of opend modules is done on destruction.
+        * Complete clean-up of opened modules is done on destruction.
         */
        ~excompiler()
        {
-               for (std::vector<filedesc>::const_iterator it = filelist.begin(); it != filelist.end(); ++it) {
+               for (auto it = filelist.begin(); it != filelist.end(); ++it) {
                        clean_up(it);
                }
        }
@@ -112,12 +120,14 @@ public:
                        const char* filename_pattern = "./GiNaCXXXXXX";
                        char* new_filename = new char[strlen(filename_pattern)+1];
                        strcpy(new_filename, filename_pattern);
-                       if (!mktemp(new_filename)) {
+                       int fd = mkstemp(new_filename);
+                       if (fd == -1) {
                                delete[] new_filename;
-                               throw std::runtime_error("mktemp failed");
+                               throw std::runtime_error("mkstemp failed");
                        }
                        filename = std::string(new_filename);
                        ofs.open(new_filename, std::ios::out);
+                       close(fd);
                        delete[] new_filename;
                } else {
                        // use parameter as filename
@@ -140,7 +150,7 @@ public:
         */
        void compile_src_file(const std::string filename, bool clean_up)
        {
-               std::string strcompile = "ginac-excompiler " + filename;
+               std::string strcompile = LIBEXECDIR "ginac-excompiler " + filename;
                if (system(strcompile.c_str())) {
                        throw std::runtime_error("excompiler::compile_src_file: error compiling source file!");
                }
@@ -153,9 +163,9 @@ public:
         */
        void* link_so_file(const std::string filename, bool clean_up)
        {
-               void* module = NULL;
+               void* module = nullptr;
                module = dlopen(filename.c_str(), RTLD_NOW);
-               if (module == NULL)     {
+               if (module == nullptr) {
                        throw std::runtime_error("excompiler::link_so_file: could not open compiled module!");
                }
 
@@ -169,7 +179,7 @@ public:
         */
        void unlink(const std::string filename)
        {
-               for (std::vector<filedesc>::iterator it = filelist.begin(); it != filelist.end();) {
+               for (auto it = filelist.begin(); it != filelist.end();) {
                        if (it->name == filename) {
                                clean_up(it);
                                it = filelist.erase(it);
@@ -181,7 +191,7 @@ public:
 };
 
 /**
- * This static object manages the modules opened by the complile_ex and link_ex
+ * This static object manages the modules opened by the compile_ex and link_ex
  * functions. On program termination its dtor is called and all open modules
  * are closed. The associated source and so-files are eventually deleted then
  * as well.
@@ -195,7 +205,7 @@ static excompiler global_excompiler;
 void compile_ex(const ex& expr, const symbol& sym, FUNCP_1P& fp, const std::string filename)
 {
        symbol x("x");
-       ex expr_with_x = expr.subs(lst(sym==x));
+       ex expr_with_x = expr.subs(lst{sym==x});
 
        std::ofstream ofs;
        std::string unique_filename = filename;
@@ -220,7 +230,7 @@ void compile_ex(const ex& expr, const symbol& sym, FUNCP_1P& fp, const std::stri
 void compile_ex(const ex& expr, const symbol& sym1, const symbol& sym2, FUNCP_2P& fp, const std::string filename)
 {
        symbol x("x"), y("y");
-       ex expr_with_xy = expr.subs(lst(sym1==x, sym2==y));
+       ex expr_with_xy = expr.subs(lst{sym1==x, sym2==y});
 
        std::ofstream ofs;
        std::string unique_filename = filename;