X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fexcompiler.cpp;h=513c19a7058a164da7b097f44326fe0d5de4bd0f;hp=646930357755d82ff128ec3036bfbc314c0dcd44;hb=HEAD;hpb=0052e44b34c982b13b08454fd6c9429fe7a90f71 diff --git a/ginac/excompiler.cpp b/ginac/excompiler.cpp index 64693035..513c19a7 100644 --- a/ginac/excompiler.cpp +++ b/ginac/excompiler.cpp @@ -6,7 +6,7 @@ */ /* - * GiNaC Copyright (C) 1999-2016 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2024 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 @@ -36,8 +36,16 @@ #include "symbol.h" #ifdef HAVE_LIBDL -#include +# include #endif // def HAVE_LIBDL +#ifdef HAVE_UNISTD_H +# include +#else +# ifdef _MSC_VER +# include // for close(3) +# endif // def _MSC_VER +#endif // def HAVE_UNISTD_H +#include #include #include #include @@ -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 @@ -76,7 +84,7 @@ public: */ ~excompiler() { - for (std::vector::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::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); @@ -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;