%module{Slic3r::XS};
%package{Slic3r::XS};

#include <xsinit.h>
#include "Utils.hpp"

%{

%}

%package{Slic3r};
%{

SV*
VERSION()
    CODE:
        RETVAL = newSVpv(SLIC3R_VERSION, 0);
    OUTPUT: RETVAL

SV*
BUILD()
    CODE:
        RETVAL = newSVpv(SLIC3R_BUILD, 0);
    OUTPUT: RETVAL

SV*
DEBUG_OUT_PATH_PREFIX()
    CODE:
        RETVAL = newSVpv(SLIC3R_DEBUG_OUT_PATH_PREFIX, 0);
    OUTPUT: RETVAL

SV*
FORK_NAME()
    CODE:
        RETVAL = newSVpv(SLIC3R_FORK_NAME, 0);
    OUTPUT: RETVAL

void
set_logging_level(level)
    unsigned int level;
    CODE:
        Slic3r::set_logging_level(level);

void
trace(level, message)
    unsigned int level;
    char        *message;
    CODE:
        Slic3r::trace(level, message);

void
disable_multi_threading()
    CODE:
        Slic3r::disable_multi_threading();

void
set_var_dir(dir)
    char  *dir;
    CODE:
        Slic3r::set_var_dir(dir);

void
set_local_dir(dir)
    char  *dir;
    CODE:
        Slic3r::set_local_dir(dir);

char*
var_dir()
    CODE:
        RETVAL = const_cast<char*>(Slic3r::var_dir().c_str());
    OUTPUT: RETVAL

void
set_resources_dir(dir)
    char  *dir;
    CODE:
        Slic3r::set_resources_dir(dir);

char*
resources_dir()
    CODE:
        RETVAL = const_cast<char*>(Slic3r::resources_dir().c_str());
    OUTPUT: RETVAL

std::string
var(file_name)
    const char *file_name;
    CODE:
        RETVAL = Slic3r::var(file_name);
    OUTPUT: RETVAL

void
set_data_dir(dir)
    char  *dir;
    CODE:
        Slic3r::set_data_dir(dir);

char*
data_dir()
    CODE:
        RETVAL = const_cast<char*>(Slic3r::data_dir().c_str());
    OUTPUT: RETVAL

local_encoded_string
encode_path(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::encode_path(src);
    OUTPUT: RETVAL

std::string
decode_path(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::decode_path(src);
    OUTPUT: RETVAL

std::string
normalize_utf8_nfc(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::normalize_utf8_nfc(src);
    OUTPUT: RETVAL

std::string
path_to_filename(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::PerlUtils::path_to_filename(src);
    OUTPUT: RETVAL

local_encoded_string
path_to_filename_raw(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::PerlUtils::path_to_filename(src);
    OUTPUT: RETVAL

std::string
path_to_stem(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::PerlUtils::path_to_stem(src);
    OUTPUT: RETVAL

std::string
path_to_extension(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::PerlUtils::path_to_extension(src);
    OUTPUT: RETVAL

std::string
path_to_parent_path(src)
    const char *src;
    CODE:
        RETVAL = Slic3r::PerlUtils::path_to_parent_path(src);
    OUTPUT: RETVAL

void
xspp_test_croak_hangs_on_strawberry()
    CODE:
    	try {
    		throw 1;
    	} catch (...) {
    		croak("xspp_test_croak_hangs_on_strawberry: exception catched\n");
    	}
%}