1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1993-2021 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// This file is part of Octave.
//
// Octave is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Octave is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Octave; see the file COPYING. If not, see
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////
#if ! defined (octave_dynamic_ld_h)
#define octave_dynamic_ld_h 1
#include "octave-config.h"
#include <list>
#include <string>
#include "oct-shlib.h"
class octave_function;
namespace octave
{
class interpreter;
class
dynamic_loader
{
private:
class
shlibs_list
{
public:
typedef std::list<dynamic_library>::iterator iterator;
typedef std::list<dynamic_library>::const_iterator const_iterator;
shlibs_list (void) : m_lib_list () { }
// No copying!
shlibs_list (const shlibs_list&) = delete;
shlibs_list& operator = (const shlibs_list&) = delete;
~shlibs_list (void) = default;
void append (const dynamic_library& shl);
std::list<std::string> remove (dynamic_library& shl);
dynamic_library find_file (const std::string& file_name) const;
void display (void) const;
private:
// List of libraries we have loaded.
std::list<dynamic_library> m_lib_list;
};
public:
dynamic_loader (interpreter& interp)
: m_interpreter (interp), m_loaded_shlibs (), m_doing_load (false)
{ }
// No copying!
dynamic_loader (const dynamic_loader&) = delete;
dynamic_loader& operator = (const dynamic_loader&) = delete;
virtual ~dynamic_loader (void) = default;
octave_function *
load_oct (const std::string& fcn_name,
const std::string& file_name = "",
bool relative = false);
octave_function *
load_mex (const std::string& fcn_name,
const std::string& file_name = "",
bool relative = false);
bool remove_oct (const std::string& fcn_name,
dynamic_library& shl);
bool remove_mex (const std::string& fcn_name,
dynamic_library& shl);
private:
void clear_function (const std::string& fcn_name);
void clear (dynamic_library& oct_file);
interpreter& m_interpreter;
shlibs_list m_loaded_shlibs;
bool m_doing_load;
static std::string name_mangler (const std::string& name);
static std::string name_uscore_mangler (const std::string& name);
static std::string mex_mangler (const std::string& name);
static std::string mex_uscore_mangler (const std::string& name);
static std::string mex_f77_mangler (const std::string& name);
};
}
#endif
|