ifndef SASS_PLUGINS_H define SASS_PLUGINS_H

include <string> include <vector> include “utf8_string.hpp” include “sass/functions.h”

ifdef _WIN32

#define LOAD_LIB(var, path) HMODULE var = LoadLibraryW(UTF_8::convert_to_utf16(path).c_str())
#define LOAD_LIB_WCHR(var, path_wide_str) HMODULE var = LoadLibraryW(path_wide_str.c_str())
#define LOAD_LIB_FN(type, var, name) type var = (type) GetProcAddress(plugin, name)
#define CLOSE_LIB(var) FreeLibrary(var)

#ifndef dlerror
#define dlerror() 0
#endif

else

#define LOAD_LIB(var, path) void* var = dlopen(path.c_str(), RTLD_LAZY)
#define LOAD_LIB_FN(type, var, name) type var = (type) dlsym(plugin, name)
#define CLOSE_LIB(var) dlclose(var)

endif

namespace Sass {

class Plugins {

  public: // c-tor
    Plugins(void);
    ~Plugins(void);

  public: // methods
    // load one specific plugin
    bool load_plugin(const sass::string& path);
    // load all plugins from a directory
    size_t load_plugins(const sass::string& path);

  public: // public accessors
    const sass::vector<Sass_Importer_Entry> get_headers(void) { return headers; }
    const sass::vector<Sass_Importer_Entry> get_importers(void) { return importers; }
    const sass::vector<Sass_Function_Entry> get_functions(void) { return functions; }

  private: // private vars
    sass::vector<Sass_Importer_Entry> headers;
    sass::vector<Sass_Importer_Entry> importers;
    sass::vector<Sass_Function_Entry> functions;

};

}

endif