summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp40
1 files changed, 31 insertions, 9 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp
index 6cedd193abc..1dc71393809 100644
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp
+++ b/Build/source/texk/dvisvgm/dvisvgm-src/src/DLLoader.hpp
@@ -2,7 +2,7 @@
** DLLoader.hpp **
** **
** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2017 Martin Gieseking <martin.gieseking@uos.de> **
+** Copyright (C) 2005-2018 Martin Gieseking <martin.gieseking@uos.de> **
** **
** This program is free software; you can redistribute it and/or **
** modify it under the terms of the GNU General Public License as **
@@ -21,23 +21,27 @@
#ifndef DLLOADER_HPP
#define DLLOADER_HPP
+#include <string>
+
#ifdef _WIN32
- #include <windows.h>
+ #include "windows.hpp"
#else
#include <dlfcn.h>
#endif
-class DLLoader
-{
+class DLLoader {
public:
- DLLoader (const char *dlname);
- virtual ~DLLoader ();
- bool loaded () const {return _handle != 0;}
+ DLLoader () =delete;
+ DLLoader (const std::string &dlname);
+ DLLoader (DLLoader &&loader) =default;
+ virtual ~DLLoader () {closeLibrary();}
+ bool loaded () const {return _handle != nullptr;}
+ bool loadLibrary (const std::string &dlname);
protected:
- DLLoader () : _handle(0) {}
- void* loadSymbol (const char *name);
+ template <typename T> T loadSymbol (const char *name) const;
+ void closeLibrary ();
private:
#ifdef _WIN32
@@ -47,4 +51,22 @@ class DLLoader
#endif
};
+
+/** Loads a function or variable from the dynamic/shared library.
+ * @param[in] name name of function/variable to load
+ * @return pointer to loaded symbol, or 0 if the symbol could not be loaded */
+template <typename T>
+T DLLoader::loadSymbol (const char *name) const {
+ if (_handle) {
+#ifdef _WIN32
+ return reinterpret_cast<T>(GetProcAddress(_handle, name));
+#else
+ return reinterpret_cast<T>(dlsym(_handle, name));
+#endif
+ }
+ return nullptr;
+}
+
+#define LOAD_SYMBOL(sym) loadSymbol<decltype(&sym)>(#sym)
+
#endif