From 6a0151b9c752ebfe1e32f328234789ceedf31769 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Mon, 4 Feb 2019 14:28:32 -0500 Subject: [PATCH] Adding support for custom epanet_py build target --- .travis.yml | 10 +- CMakeLists.txt | 75 ++++++++------- appveyor.yml | 22 ++--- include/epanet2.def | 114 ++++++++++++++++++++++ include/epanet2.h | 32 ++----- include/epanet2_2.h | 24 ++--- include/epanet_py.h | 224 ++++++++++++++++++++++---------------------- run/CMakeLists.txt | 1 - src/epanet_py.c | 222 +++++++++++++++++++++---------------------- 9 files changed, 412 insertions(+), 312 deletions(-) create mode 100644 include/epanet2.def diff --git a/.travis.yml b/.travis.yml index 7dfa9f9..53d70c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python -env: - global: +env: + global: - EPANET_HOME=`pwd` - BUILD_HOME=buildprod - TEST_HOME=nrtestsuite @@ -10,17 +10,17 @@ before_install: - sudo apt-get -qq update - sudo apt-get install -y libboost-test-dev - sudo apt-get install -y libboost-thread-dev - - sudo apt-get install -y swig + - sudo apt-get install -y swig #install: before_script: - mkdir -p $BUILD_HOME - cd $BUILD_HOME - - cmake -DBUILD_TESTS=1 .. + - cmake -DBUILD_TESTS=ON .. script: - - cmake --build . + - cmake --build . # run unit tests - cd tests - ctest diff --git a/CMakeLists.txt b/CMakeLists.txt index 268f55e..22f852b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,26 +9,14 @@ # Note: CMake requires that your platform build system and compiler are # properly installed. Build using Visual Studio requires msbuild shell. # -# Example Usage: -# mkdir buildproducts -# cd buildproducts -# cmake .. -# make -# -# Building MSYS on Windows: -# ... -# cmake -G "MSYS Makefiles" .. -# make -# -# Building Visual Studio on Windows: -# ... -# cmake -G "Visual Studio 10 2010" .. -# msbuild /p:Configuration=Release ALL_BUILD.vcxproj +# Build Options: +# BUILD_TESTS = ON/OFF +# BUILD_PY_LIB = ON/OFF # # Generic Invocation: # cmake -E make_directory buildprod # cd build -# cmake -G GENERATOR -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=1 .. +# cmake -G GENERATOR -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON .. # cmake --build . --target SOME_TARGET --config Release # # More information: @@ -40,7 +28,13 @@ cmake_minimum_required (VERSION 2.8.8) project(EPANET) -add_subdirectory(run) + +option(BUILD_TESTS "Build unit tests (requires Boost test)" OFF) +option(BUILD_PY_LIB "Build library for Python wrapper" OFF) + +IF (NOT BUILD_PY_LIB) + add_subdirectory(run) +ENDIF (NOT BUILD_PY_LIB) add_subdirectory(tools/epanet-output) IF (BUILD_TESTS) @@ -58,8 +52,8 @@ SET(CMAKE_POSITION_INDEPENDENT_CODE ON) IF (APPLE) -SET(INSTALL_NAME_DIR @executable_path/../lib) -SET(CMAKE_MACOSX_RPATH 1) + set(INSTALL_NAME_DIR @executable_path/../lib) + set(CMAKE_MACOSX_RPATH 1) ENDIF (APPLE) IF (MSVC) @@ -69,24 +63,41 @@ ENDIF (MSVC) # configure file groups -file(GLOB EPANET_SOURCES src/*.c src/util/*.c) -file(GLOB EPANET_LIB_ALL src/* src/util/*) +file(GLOB EPANET_SOURCES RELATIVE ${PROJECT_SOURCE_DIR} src/*.c) +file(GLOB EPANET_LIB_ALL RELATIVE ${PROJECT_SOURCE_DIR} src/*) +# exclude epanet python API from the default build +list(REMOVE_ITEM EPANET_LIB_ALL "src/epanet_py.c") source_group("Library" FILES ${EPANET_LIB_ALL}) -# the shared library -add_library(epanet2 SHARED ${EPANET_LIB_ALL}) -target_include_directories(epanet2 PUBLIC ${PROJECT_SOURCE_DIR}/include) +# create build target for epanet library with python API +IF (BUILD_PY_LIB) + # exclude legacy epanet 2.0 API and include epanet py API + list(REMOVE_ITEM EPANET_LIB_ALL "src/epanet2.c") + add_library(epanet_py SHARED ${EPANET_LIB_ALL} src/epanet_py.c src/util/errormanager.c) + target_include_directories(epanet_py PUBLIC ${PROJECT_SOURCE_DIR}/include) -# create export lib so we can link against dll using Visual Studio -add_definitions(-DWITH_GENX) -include(GenerateExportHeader) -GENERATE_EXPORT_HEADER(epanet2 - BASE_NAME epanet2 - EXPORT_MACRO_NAME DLLEXPORT - EXPORT_FILE_NAME epanet2_export.h + include(GenerateExportHeader) + GENERATE_EXPORT_HEADER(epanet_py + BASE_NAME epanet_py + EXPORT_MACRO_NAME EXPORT_PY_API + EXPORT_FILE_NAME epanet_py_export.h STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC) -file(COPY ${CMAKE_CURRENT_BINARY_DIR}/epanet2_export.h + file(COPY ${CMAKE_CURRENT_BINARY_DIR}/epanet_py_export.h DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/include) + + +# create build target for default epanet library with 2.0 and 2.2 API +ELSE (BUILD_PY_LIB) + + # the shared library + if(NOT WIN32) + add_library(epanet2 SHARED ${EPANET_LIB_ALL}) + else(NOT WIN32) + add_library(epanet2 SHARED ${EPANET_LIB_ALL} ${PROJECT_SOURCE_DIR}/include/epanet2.def) + endif(NOT WIN32) + target_include_directories(epanet2 PUBLIC ${PROJECT_SOURCE_DIR}/include) + +ENDIF (BUILD_PY_LIB) diff --git a/appveyor.yml b/appveyor.yml index 4e1d192..0e99f1f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,17 +5,17 @@ # # Author: Michael E. Tryby # US EPA - ORD/NRMRL -# +# version: 2.0.{build} -matrix: +matrix: allow_failures: #GROUP: (SUPPORTED/EXPERIMENTAL) #EXPERIMENTAL is allowed to fail under build matrix - GROUP: "EXPERIMENTAL" -environment: +environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 GENERATOR: "Visual Studio 15 2017" @@ -28,7 +28,7 @@ environment: BOOST_ROOT: "C:/Libraries/boost_1_67_0" # called before repo cloning -init: +init: - set EPANET_HOME=%APPVEYOR_BUILD_FOLDER% - set BUILD_HOME=buildprod - set TEST_HOME=nrtestsuite @@ -40,21 +40,21 @@ init: - echo %BOOST_ROOT% # called after repo clone -install: +install: - python -m pip install -r tools\requirements-appveyor.txt # called before build before_build: - mkdir %BUILD_HOME% - cd %BUILD_HOME% - - cmake -G "%GENERATOR%" - -DBUILD_TESTS=1 + - cmake -G "%GENERATOR%" + -DBUILD_TESTS=ON -DBOOST_ROOT="%BOOST_ROOT%" -DBoost_USE_STATIC_LIBS="ON" .. # run custom build script -build_script: - - cmake --build . --config Release +build_script: + - cmake --build . --config Release before_test: - cd %EPANET_HOME% @@ -69,8 +69,8 @@ test_script: - cd %EPANET_HOME% - tools\run-nrtest.cmd %NRTEST_SCRIPT% %TEST_HOME% %APPVEYOR_REPO_COMMIT% -after_test: - # zip up the SUT benchmarks +after_test: + # zip up the SUT benchmarks - 7z a benchmarks.zip %TEST_HOME%\benchmark\epanet-%APPVEYOR_REPO_COMMIT%\ artifacts: diff --git a/include/epanet2.def b/include/epanet2.def new file mode 100644 index 0000000..19b76e5 --- /dev/null +++ b/include/epanet2.def @@ -0,0 +1,114 @@ +LIBRARY EPANET2.DLL + +EXPORTS + ENaddcontrol = _ENaddcontrol@24 + ENaddcurve = _ENaddcurve@4 + ENaddlink = _ENaddlink@16 + ENaddnode = _ENaddnode@8 + ENaddpattern = _ENaddpattern@4 + ENaddrule = _ENaddrule@4 + ENclose = _ENclose@0 + ENcloseH = _ENcloseH@0 + ENcloseQ = _ENcloseQ@0 + ENdeletecontrol = _ENdeletecontrol@4 + ENdeletelink = _ENdeletelink@8 + ENdeletenode = _ENdeletenode@8 + ENdeleterule = _ENdeleterule@4 + ENepanet = _ENepanet@16 + ENgetaveragepatternvalue = _ENgetaveragepatternvalue@8 + ENgetbasedemand = _ENgetbasedemand@12 + ENgetcontrol = _ENgetcontrol@24 + ENgetcoord = _ENgetcoord@12 + ENgetcount = _ENgetcount@8 + ENgetcurve = _ENgetcurve@20 + ENgetcurveid = _ENgetcurveid@8 + ENgetcurveindex = _ENgetcurveindex@8 + ENgetcurvelen = _ENgetcurvelen@8 + ENgetcurvetype = _ENgetcurvetype@8 + ENgetcurvevalue = _ENgetcurvevalue@16 + ENgetdemandmodel = _ENgetdemandmodel@16 + ENgetdemandname = _ENgetdemandname@12 + ENgetdemandpattern = _ENgetdemandpattern@12 + ENgetelseaction = _ENgetelseaction@20 + ENgeterror = _ENgeterror@12 + ENgetflowunits = _ENgetflowunits@4 + ENgetheadcurveindex = _ENgetheadcurveindex@8 + ENgetlinkid = _ENgetlinkid@8 + ENgetlinkindex = _ENgetlinkindex@8 + ENgetlinknodes = _ENgetlinknodes@12 + ENsetlinknodes = _ENsetlinknodes@12 + ENgetlinktype = _ENgetlinktype@8 + ENgetlinkvalue = _ENgetlinkvalue@12 + ENgetnodeid = _ENgetnodeid@8 + ENgetnodeindex = _ENgetnodeindex@8 + ENgetnodetype = _ENgetnodetype@8 + ENgetnodevalue = _ENgetnodevalue@12 + ENgetnumdemands = _ENgetnumdemands@8 + ENgetoption = _ENgetoption@8 + ENgetpatternid = _ENgetpatternid@8 + ENgetpatternindex = _ENgetpatternindex@8 + ENgetpatternlen = _ENgetpatternlen@8 + ENgetpatternvalue = _ENgetpatternvalue@12 + ENgetpremise = _ENgetpremise@36 + ENgetpumptype = _ENgetpumptype@8 + ENgetqualinfo = _ENgetqualinfo@16 + ENgetqualtype = _ENgetqualtype@8 + ENgetrule = _ENgetrule@20 + ENgetruleID = _ENgetruleID@8 + ENgetstatistic = _ENgetstatistic@8 + ENgetthenaction = _ENgetthenaction@20 + ENgettimeparam = _ENgettimeparam@8 + ENgetversion = _ENgetversion@4 + ENinit = _ENinit@16 + ENinitH = _ENinitH@4 + ENinitQ = _ENinitQ@4 + ENnextH = _ENnextH@4 + ENnextQ = _ENnextQ@4 + ENopen = _ENopen@12 + ENopenH = _ENopenH@0 + ENopenQ = _ENopenQ@0 + ENreport = _ENreport@0 + ENresetreport = _ENresetreport@0 + ENrunH = _ENrunH@4 + ENrunQ = _ENrunQ@4 + ENsaveH = _ENsaveH@0 + ENsavehydfile = _ENsavehydfile@4 + ENsaveinpfile = _ENsaveinpfile@4 + ENsetbasedemand = _ENsetbasedemand@12 + ENsetcontrol = _ENsetcontrol@24 + ENsetcoord = _ENsetcoord@12 + ENsetcurve = _ENsetcurve@16 + ENsetcurvevalue = _ENsetcurvevalue@16 + ENsetdemandmodel = _ENsetdemandmodel@16 + ENsetdemandname = _ENsetdemandname@12 + ENsetdemandpattern = _ENsetdemandpattern@12 + ENsetelseaction = _ENsetelseaction@20 + ENsetflowunits = _ENsetflowunits@4 + ENsetheadcurveindex = _ENsetheadcurveindex@8 + ENsetjuncdata = _ENsetjuncdata@16 + ENsetlinkid = _ENsetlinkid@8 + ENsetlinknodes = _ENsetlinknodes@12 + ENsetlinktype = _ENsetlinktype@12 + ENsetlinkvalue = _ENsetlinkvalue@12 + ENsetnodeid = _ENsetnodeid@8 + ENsetnodevalue = _ENsetnodevalue@12 + ENsetoption = _ENsetoption@8 + ENsetpattern = _ENsetpattern@12 + ENsetpatternvalue = _ENsetpatternvalue@12 + ENsetpipedata = _ENsetpipedata@20 + ENsetpremise = _ENsetpremise@36 + ENsetpremiseindex = _ENsetpremiseindex@12 + ENsetpremisestatus = _ENsetpremisestatus@12 + ENsetpremisevalue = _ENsetpremisevalue@12 + ENsetqualtype = _ENsetqualtype@16 + ENsetreport = _ENsetreport@4 + ENsetrulepriority = _ENsetrulepriority@8 + ENsetstatusreport = _ENsetstatusreport@4 + ENsettankdata = _ENsettankdata@32 + ENsetthenaction = _ENsetthenaction@20 + ENsettimeparam = _ENsettimeparam@8 + ENsolveH = _ENsolveH@0 + ENsolveQ = _ENsolveQ@0 + ENstepQ = _ENstepQ@4 + ENusehydfile = _ENusehydfile@4 + ENwriteline = _ENwriteline@4 diff --git a/include/epanet2.h b/include/epanet2.h index 8509641..03558e5 100644 --- a/include/epanet2.h +++ b/include/epanet2.h @@ -30,37 +30,23 @@ function in epanet2_2.h. // The legacy style EPANET API can be compiled with support for either single // precision or double precision floating point arguments, with the default // being single precision. To compile for double precision one must #define -// EN_API_FLOAT_TYPE as double both here and in any client code that uses the +// EN_API_FLOAT_TYPE as double both here and in any client code that uses the // API. #ifndef EN_API_FLOAT_TYPE #define EN_API_FLOAT_TYPE float #endif -#ifdef WITH_GENX - #include "epanet2_export.h" -#else - // --- define WINDOWS - #undef WINDOWS +#ifndef DLLEXPORT #ifdef _WIN32 - #define WINDOWS - #endif - #ifdef __WIN32__ - #define WINDOWS - #endif - - // --- define DLLEXPORT - #ifndef DLLEXPORT - #ifdef WINDOWS - #ifdef __cplusplus - #define DLLEXPORT __declspec(dllexport) - #else - #define DLLEXPORT __declspec(dllexport) __stdcall - #endif // __cplusplus - #elif defined(CYGWIN) - #define DLLEXPORT __stdcall + #ifdef epanet2_EXPORTS + #define DLLEXPORT __declspec(dllexport) __stdcall #else - #define DLLEXPORT + #define DLLEXPORT __declspec(dllimport) __stdcall #endif + #elif defined(CYGWIN) + #define DLLEXPORT __stdcall + #else + #define DLLEXPORT #endif #endif diff --git a/include/epanet2_2.h b/include/epanet2_2.h index 161f122..baa657b 100644 --- a/include/epanet2_2.h +++ b/include/epanet2_2.h @@ -18,26 +18,16 @@ #ifndef EPANET2_2_H #define EPANET2_2_H -#ifdef WITH_GENX - #include "epanet2_export.h" +#ifdef epanet_py_EXPORTS + #define DLLEXPORT #else - // --- define WINDOWS - #undef WINDOWS - #ifdef _WIN32 - #define WINDOWS - #endif - #ifdef __WIN32__ - #define WINDOWS - #endif - - // --- define DLLEXPORT #ifndef DLLEXPORT - #ifdef WINDOWS - #ifdef __cplusplus - #define DLLEXPORT __declspec(dllexport) - #else + #ifdef _WIN32 + #ifdef epanet2_EXPORTS #define DLLEXPORT __declspec(dllexport) __stdcall - #endif // __cplusplus + #else + #define DLLEXPORT __declspec(dllimport) __stdcall + #endif #elif defined(CYGWIN) #define DLLEXPORT __stdcall #else diff --git a/include/epanet_py.h b/include/epanet_py.h index f63e472..9af6951 100644 --- a/include/epanet_py.h +++ b/include/epanet_py.h @@ -21,7 +21,7 @@ typedef void *Handle; #include "epanet2_enums.h" -#include "epanet2_export.h" +#include "epanet_py_export.h" #if defined(__cplusplus) @@ -29,142 +29,142 @@ extern "C" { #endif -int DLLEXPORT proj_create(Handle *ph_out); -int DLLEXPORT proj_delete(Handle *ph_inout); -int DLLEXPORT proj_run(Handle ph, const char *input_path, const char *report_path, const char *output_path); -int DLLEXPORT proj_init(Handle ph, const char *rptFile, const char *outFile, EN_FlowUnits unitsType, EN_HeadLossType headLossType); -int DLLEXPORT proj_open(Handle ph, const char *inpFile, const char *rptFile, const char *binOutFile); -int DLLEXPORT proj_savefile(Handle ph, const char *inpfilename); -int DLLEXPORT proj_close(Handle ph); +int EXPORT_PY_API proj_create(Handle *ph_out); +int EXPORT_PY_API proj_delete(Handle *ph_inout); +int EXPORT_PY_API proj_run(Handle ph, const char *input_path, const char *report_path, const char *output_path); +int EXPORT_PY_API proj_init(Handle ph, const char *rptFile, const char *outFile, EN_FlowUnits unitsType, EN_HeadLossType headLossType); +int EXPORT_PY_API proj_open(Handle ph, const char *inpFile, const char *rptFile, const char *binOutFile); +int EXPORT_PY_API proj_savefile(Handle ph, const char *inpfilename); +int EXPORT_PY_API proj_close(Handle ph); -int DLLEXPORT hydr_solve(Handle ph); -int DLLEXPORT hydr_save(Handle ph); -int DLLEXPORT hydr_open(Handle ph); -int DLLEXPORT hydr_init(Handle ph, EN_InitHydOption saveFlag); -int DLLEXPORT hydr_run(Handle ph, long *currentTime); -int DLLEXPORT hydr_next(Handle ph, long *tStep); -int DLLEXPORT hydr_close(Handle ph); -int DLLEXPORT hydr_savefile(Handle ph, char *filename); -int DLLEXPORT hydr_usefile(Handle ph, char *filename); +int EXPORT_PY_API hydr_solve(Handle ph); +int EXPORT_PY_API hydr_save(Handle ph); +int EXPORT_PY_API hydr_open(Handle ph); +int EXPORT_PY_API hydr_init(Handle ph, EN_InitHydOption saveFlag); +int EXPORT_PY_API hydr_run(Handle ph, long *currentTime); +int EXPORT_PY_API hydr_next(Handle ph, long *tStep); +int EXPORT_PY_API hydr_close(Handle ph); +int EXPORT_PY_API hydr_savefile(Handle ph, char *filename); +int EXPORT_PY_API hydr_usefile(Handle ph, char *filename); -int DLLEXPORT qual_solve(Handle ph); -int DLLEXPORT qual_open(Handle ph); -int DLLEXPORT qual_init(Handle ph, EN_InitHydOption saveFlag); -int DLLEXPORT qual_run(Handle ph, long *currentTime); -int DLLEXPORT qual_next(Handle ph, long *tStep); -int DLLEXPORT qual_step(Handle ph, long *timeLeft); -int DLLEXPORT qual_close(Handle ph); +int EXPORT_PY_API qual_solve(Handle ph); +int EXPORT_PY_API qual_open(Handle ph); +int EXPORT_PY_API qual_init(Handle ph, EN_InitHydOption saveFlag); +int EXPORT_PY_API qual_run(Handle ph, long *currentTime); +int EXPORT_PY_API qual_next(Handle ph, long *tStep); +int EXPORT_PY_API qual_step(Handle ph, long *timeLeft); +int EXPORT_PY_API qual_close(Handle ph); -int DLLEXPORT rprt_writeline(Handle ph, char *line); -int DLLEXPORT rprt_writeresults(Handle ph); -int DLLEXPORT rprt_reset(Handle ph); -int DLLEXPORT rprt_set(Handle ph, char *reportCommand); -int DLLEXPORT rprt_setlevel(Handle ph, EN_StatusReport code); -int DLLEXPORT rprt_getcount(Handle ph, EN_CountType code, int *count); -int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* value); +int EXPORT_PY_API rprt_writeline(Handle ph, char *line); +int EXPORT_PY_API rprt_writeresults(Handle ph); +int EXPORT_PY_API rprt_reset(Handle ph); +int EXPORT_PY_API rprt_set(Handle ph, char *reportCommand); +int EXPORT_PY_API rprt_setlevel(Handle ph, EN_StatusReport code); +int EXPORT_PY_API rprt_getcount(Handle ph, EN_CountType code, int *count); +int EXPORT_PY_API rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* value); -int DLLEXPORT anlys_getoption(Handle ph, EN_Option code, double *value); -int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, double value); -int DLLEXPORT anlys_getflowunits(Handle ph, int *code); -int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code); -int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value); -int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeParameter code, long value); -int DLLEXPORT anlys_getqualinfo(Handle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode); -int DLLEXPORT anlys_getqualtype(Handle ph, int *qualcode, int *tracenode); -int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode); +int EXPORT_PY_API anlys_getoption(Handle ph, EN_Option code, double *value); +int EXPORT_PY_API anlys_setoption(Handle ph, EN_Option code, double value); +int EXPORT_PY_API anlys_getflowunits(Handle ph, int *code); +int EXPORT_PY_API anlys_setflowunits(Handle ph, EN_FlowUnits code); +int EXPORT_PY_API anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value); +int EXPORT_PY_API anlys_settimeparam(Handle ph, EN_TimeParameter code, long value); +int EXPORT_PY_API anlys_getqualinfo(Handle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode); +int EXPORT_PY_API anlys_getqualtype(Handle ph, int *qualcode, int *tracenode); +int EXPORT_PY_API anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode); -int DLLEXPORT node_add(Handle ph, char *id, EN_NodeType nodeType); -int DLLEXPORT node_delete(Handle ph, int index, int actionCode); -int DLLEXPORT node_getindex(Handle ph, char *id, int *index); -int DLLEXPORT node_getid(Handle ph, int index, char *id); -int DLLEXPORT node_setid(Handle ph, int index, char *newid); -int DLLEXPORT node_gettype(Handle ph, int index, int *code); -int DLLEXPORT node_getvalue(Handle ph, int index, EN_NodeProperty code, double *value); -int DLLEXPORT node_setvalue(Handle ph, int index, EN_NodeProperty code, double value); -int DLLEXPORT node_getcoord(Handle ph, int index, double *x, double *y); -int DLLEXPORT node_setcoord(Handle ph, int index, double x, double y); +int EXPORT_PY_API node_add(Handle ph, char *id, EN_NodeType nodeType); +int EXPORT_PY_API node_delete(Handle ph, int index, int actionCode); +int EXPORT_PY_API node_getindex(Handle ph, char *id, int *index); +int EXPORT_PY_API node_getid(Handle ph, int index, char *id); +int EXPORT_PY_API node_setid(Handle ph, int index, char *newid); +int EXPORT_PY_API node_gettype(Handle ph, int index, int *code); +int EXPORT_PY_API node_getvalue(Handle ph, int index, EN_NodeProperty code, double *value); +int EXPORT_PY_API node_setvalue(Handle ph, int index, EN_NodeProperty code, double value); +int EXPORT_PY_API node_getcoord(Handle ph, int index, double *x, double *y); +int EXPORT_PY_API node_setcoord(Handle ph, int index, double x, double y); -int DLLEXPORT dmnd_getmodel(Handle ph, int *type, double *pmin, double *preq, double *pexp); -int DLLEXPORT dmnd_setmodel(Handle ph, int type, double pmin, double preq, double pexp); -int DLLEXPORT dmnd_getcount(Handle ph, int nodeIndex, int *numDemands); -int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, double *baseDemand); -int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, double baseDemand); -int DLLEXPORT dmnd_getpattern(Handle ph, int nodeIndex, int demandIndex, int *pattIndex); -int DLLEXPORT dmnd_setpattern(Handle ph, int nodeIndex, int demandIndex, int patIndex); -int DLLEXPORT dmnd_getname(Handle ph, int nodeIndex, int demandIdx, char *demandName); -int DLLEXPORT dmnd_setname(Handle ph, int nodeIndex, int demandIdx, char *demandName); +int EXPORT_PY_API dmnd_getmodel(Handle ph, int *type, double *pmin, double *preq, double *pexp); +int EXPORT_PY_API dmnd_setmodel(Handle ph, int type, double pmin, double preq, double pexp); +int EXPORT_PY_API dmnd_getcount(Handle ph, int nodeIndex, int *numDemands); +int EXPORT_PY_API dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, double *baseDemand); +int EXPORT_PY_API dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, double baseDemand); +int EXPORT_PY_API dmnd_getpattern(Handle ph, int nodeIndex, int demandIndex, int *pattIndex); +int EXPORT_PY_API dmnd_setpattern(Handle ph, int nodeIndex, int demandIndex, int patIndex); +int EXPORT_PY_API dmnd_getname(Handle ph, int nodeIndex, int demandIdx, char *demandName); +int EXPORT_PY_API dmnd_setname(Handle ph, int nodeIndex, int demandIdx, char *demandName); -int DLLEXPORT link_add(Handle ph, char *id, EN_LinkType linkType, char *fromNode, char *toNode); -int DLLEXPORT link_delete(Handle ph, int index, int actionCode); -int DLLEXPORT link_getindex(Handle ph, char *id, int *index); -int DLLEXPORT link_getid(Handle ph, int index, char *id); -int DLLEXPORT link_setid(Handle ph, int index, char *newid); -int DLLEXPORT link_gettype(Handle ph, int index, int *code); -int DLLEXPORT link_settype(Handle ph, int *index, EN_LinkType type, int actionCode); -int DLLEXPORT link_getnodes(Handle ph, int index, int *node1, int *node2); -int DLLEXPORT link_setnodes(Handle ph, int index, int node1, int node2); -int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, double *value); -int DLLEXPORT link_setvalue(Handle ph, int index, int code, double v); +int EXPORT_PY_API link_add(Handle ph, char *id, EN_LinkType linkType, char *fromNode, char *toNode); +int EXPORT_PY_API link_delete(Handle ph, int index, int actionCode); +int EXPORT_PY_API link_getindex(Handle ph, char *id, int *index); +int EXPORT_PY_API link_getid(Handle ph, int index, char *id); +int EXPORT_PY_API link_setid(Handle ph, int index, char *newid); +int EXPORT_PY_API link_gettype(Handle ph, int index, int *code); +int EXPORT_PY_API link_settype(Handle ph, int *index, EN_LinkType type, int actionCode); +int EXPORT_PY_API link_getnodes(Handle ph, int index, int *node1, int *node2); +int EXPORT_PY_API link_setnodes(Handle ph, int index, int node1, int node2); +int EXPORT_PY_API link_getvalue(Handle ph, int index, EN_LinkProperty code, double *value); +int EXPORT_PY_API link_setvalue(Handle ph, int index, int code, double v); -int DLLEXPORT pump_gettype(Handle ph, int linkIndex, int *outType); -int DLLEXPORT pump_getheadcurveindex(Handle ph, int pumpIndex, int *curveIndex); -int DLLEXPORT pump_setheadcurveindex(Handle ph, int pumpIndex, int curveIndex); +int EXPORT_PY_API pump_gettype(Handle ph, int linkIndex, int *outType); +int EXPORT_PY_API pump_getheadcurveindex(Handle ph, int pumpIndex, int *curveIndex); +int EXPORT_PY_API pump_setheadcurveindex(Handle ph, int pumpIndex, int curveIndex); -int DLLEXPORT ptrn_add(Handle ph, char *id); -int DLLEXPORT ptrn_getindex(Handle ph, char *id, int *index); -int DLLEXPORT ptrn_getid(Handle ph, int index, char *id); -int DLLEXPORT ptrn_getlength(Handle ph, int index, int *len); -int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, double *value); -int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, double value); -int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, double *value); -int DLLEXPORT ptrn_set(Handle ph, int index, double *f, int len); +int EXPORT_PY_API ptrn_add(Handle ph, char *id); +int EXPORT_PY_API ptrn_getindex(Handle ph, char *id, int *index); +int EXPORT_PY_API ptrn_getid(Handle ph, int index, char *id); +int EXPORT_PY_API ptrn_getlength(Handle ph, int index, int *len); +int EXPORT_PY_API ptrn_getvalue(Handle ph, int index, int period, double *value); +int EXPORT_PY_API ptrn_setvalue(Handle ph, int index, int period, double value); +int EXPORT_PY_API ptrn_getavgvalue(Handle ph, int index, double *value); +int EXPORT_PY_API ptrn_set(Handle ph, int index, double *f, int len); -int DLLEXPORT curv_add(Handle ph, char *id); -int DLLEXPORT curv_getindex(Handle ph, char *id, int *index); -int DLLEXPORT curv_getid(Handle ph, int index, char *id); -int DLLEXPORT curv_getlength(Handle ph, int index, int *len); -int DLLEXPORT curv_gettype(Handle ph, int curveIndex, int *outType); -int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, double *x, double *y); -int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, double x, double y); -int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, double **xValues, double **yValues); -int DLLEXPORT curv_set(Handle ph, int index, double *x, double *y, int len); +int EXPORT_PY_API curv_add(Handle ph, char *id); +int EXPORT_PY_API curv_getindex(Handle ph, char *id, int *index); +int EXPORT_PY_API curv_getid(Handle ph, int index, char *id); +int EXPORT_PY_API curv_getlength(Handle ph, int index, int *len); +int EXPORT_PY_API curv_gettype(Handle ph, int curveIndex, int *outType); +int EXPORT_PY_API curv_getvalue(Handle ph, int curveIndex, int pointIndex, double *x, double *y); +int EXPORT_PY_API curv_setvalue(Handle ph, int curveIndex, int pointIndex, double x, double y); +int EXPORT_PY_API curv_get(Handle ph, int curveIndex, char* id, int *nValues, double **xValues, double **yValues); +int EXPORT_PY_API curv_set(Handle ph, int index, double *x, double *y, int len); -int DLLEXPORT scntl_add(Handle ph, int type, int linkIndex, double setting, int nodeIndex, double level, int *index); -int DLLEXPORT scntl_delete(Handle ph, int index); -int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, double *setting, int *nodeIndex, double *level); -int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, double setting, int nindex, double level); +int EXPORT_PY_API scntl_add(Handle ph, int type, int linkIndex, double setting, int nodeIndex, double level, int *index); +int EXPORT_PY_API scntl_delete(Handle ph, int index); +int EXPORT_PY_API scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, double *setting, int *nodeIndex, double *level); +int EXPORT_PY_API scntl_set(Handle ph, int cindex, int ctype, int lindex, double setting, int nindex, double level); -int DLLEXPORT rcntl_add(Handle ph, char *rule); -int DLLEXPORT rcntl_delete(Handle ph, int index); -int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, double *priority); -int DLLEXPORT rcntl_getid(Handle ph, int index, char* id); -int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, double *value); -int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, double value); -int DLLEXPORT rcntl_setpremiseindex(Handle ph, int ruleIndex, int premiseIndex, int objIndex); -int DLLEXPORT rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, int status); -int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, double value); -int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting); -int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting); -int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting); -int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting); -int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, double priority); +int EXPORT_PY_API rcntl_add(Handle ph, char *rule); +int EXPORT_PY_API rcntl_delete(Handle ph, int index); +int EXPORT_PY_API rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, double *priority); +int EXPORT_PY_API rcntl_getid(Handle ph, int index, char* id); +int EXPORT_PY_API rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, double *value); +int EXPORT_PY_API rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, double value); +int EXPORT_PY_API rcntl_setpremiseindex(Handle ph, int ruleIndex, int premiseIndex, int objIndex); +int EXPORT_PY_API rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, int status); +int EXPORT_PY_API rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, double value); +int EXPORT_PY_API rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting); +int EXPORT_PY_API rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting); +int EXPORT_PY_API rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting); +int EXPORT_PY_API rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting); +int EXPORT_PY_API rcntl_setrulepriority(Handle ph, int index, double priority); -void DLLEXPORT err_clear(Handle ph); -int DLLEXPORT err_check(Handle ph, char** msg_buffer); -void DLLEXPORT toolkit_free(void **memory); -int DLLEXPORT toolkit_getversion(int *version); +void EXPORT_PY_API err_clear(Handle ph); +int EXPORT_PY_API err_check(Handle ph, char** msg_buffer); +void EXPORT_PY_API toolkit_free(void **memory); +int EXPORT_PY_API toolkit_getversion(int *version); #if defined(__cplusplus) diff --git a/run/CMakeLists.txt b/run/CMakeLists.txt index 1e5c3b7..cd2b1a1 100644 --- a/run/CMakeLists.txt +++ b/run/CMakeLists.txt @@ -17,7 +17,6 @@ include_directories(include) source_group("CLI" FILES ${EPANET_CLI_SOURCES}) -add_definitions(-DWITH_GENX) # Creates the EPANET command line executable add_executable(runepanet ${EPANET_CLI_SOURCES}) diff --git a/src/epanet_py.c b/src/epanet_py.c index a5d2ff2..ec76631 100644 --- a/src/epanet_py.c +++ b/src/epanet_py.c @@ -32,7 +32,7 @@ extern char *geterrmsg(int, char *); void error_lookup(int errcode, char *errmsg, int len); -int DLLEXPORT proj_create(Handle *ph) +int EXPORT_PY_API proj_create(Handle *ph) { handle_t *handle = (handle_t *)calloc(1, sizeof(handle_t)); @@ -46,7 +46,7 @@ int DLLEXPORT proj_create(Handle *ph) return -1; } -int DLLEXPORT proj_delete(Handle *ph) +int EXPORT_PY_API proj_delete(Handle *ph) { handle_t *handle = (handle_t *)*ph; @@ -63,34 +63,34 @@ int DLLEXPORT proj_delete(Handle *ph) return 0; } -int DLLEXPORT proj_run(Handle ph, const char *input_path, +int EXPORT_PY_API proj_run(Handle ph, const char *input_path, const char *report_path, const char *output_path) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_runproject(pr->project, input_path, report_path, output_path, NULL)); } -int DLLEXPORT proj_init(Handle ph, const char *rptFile, const char *outFile, +int EXPORT_PY_API proj_init(Handle ph, const char *rptFile, const char *outFile, EN_FlowUnits unitsType, EN_HeadLossType headLossType) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_init(pr->project, rptFile, outFile, unitsType, headLossType)); } -int DLLEXPORT proj_open(Handle ph, const char *inpFile, const char *rptFile, +int EXPORT_PY_API proj_open(Handle ph, const char *inpFile, const char *rptFile, const char *binOutFile) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_open(pr->project, inpFile, rptFile, binOutFile)); } -int DLLEXPORT proj_savefile(Handle ph, const char *filename) +int EXPORT_PY_API proj_savefile(Handle ph, const char *filename) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_saveinpfile(pr->project, filename)); } -int DLLEXPORT proj_close(Handle ph) +int EXPORT_PY_API proj_close(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_close(pr->project)); @@ -99,55 +99,55 @@ int DLLEXPORT proj_close(Handle ph) -int DLLEXPORT hydr_solve(Handle ph) +int EXPORT_PY_API hydr_solve(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_solveH(pr->project)); } -int DLLEXPORT hydr_save(Handle ph) +int EXPORT_PY_API hydr_save(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_saveH(pr->project)); } -int DLLEXPORT hydr_open(Handle ph) +int EXPORT_PY_API hydr_open(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_openH(pr->project)); } -int DLLEXPORT hydr_init(Handle ph, EN_InitHydOption saveFlag) +int EXPORT_PY_API hydr_init(Handle ph, EN_InitHydOption saveFlag) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_initH(pr->project, saveFlag)); } -int DLLEXPORT hydr_run(Handle ph, long *currentTime) +int EXPORT_PY_API hydr_run(Handle ph, long *currentTime) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_runH(pr->project, currentTime)); } -int DLLEXPORT hydr_next(Handle ph, long *tStep) +int EXPORT_PY_API hydr_next(Handle ph, long *tStep) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_nextH(pr->project, tStep)); } -int DLLEXPORT hydr_close(Handle ph) +int EXPORT_PY_API hydr_close(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_closeH(pr->project)); } -int DLLEXPORT hydr_savefile(Handle ph, char *filename) +int EXPORT_PY_API hydr_savefile(Handle ph, char *filename) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_savehydfile(pr->project, filename)); } -int DLLEXPORT hydr_usefile(Handle ph, char *filename) +int EXPORT_PY_API hydr_usefile(Handle ph, char *filename) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_usehydfile(pr->project, filename)); @@ -156,43 +156,43 @@ int DLLEXPORT hydr_usefile(Handle ph, char *filename) -int DLLEXPORT qual_solve(Handle ph) +int EXPORT_PY_API qual_solve(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_solveQ(pr->project)); } -int DLLEXPORT qual_open(Handle ph) +int EXPORT_PY_API qual_open(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_openQ(pr->project)); } -int DLLEXPORT qual_init(Handle ph, EN_InitHydOption saveFlag) +int EXPORT_PY_API qual_init(Handle ph, EN_InitHydOption saveFlag) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_initQ(pr->project, saveFlag)); } -int DLLEXPORT qual_run(Handle ph, long *currentTime) +int EXPORT_PY_API qual_run(Handle ph, long *currentTime) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_runQ(pr->project, currentTime)); } -int DLLEXPORT qual_next(Handle ph, long *tStep) +int EXPORT_PY_API qual_next(Handle ph, long *tStep) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_nextQ(pr->project, tStep)); } -int DLLEXPORT qual_step(Handle ph, long *timeLeft) +int EXPORT_PY_API qual_step(Handle ph, long *timeLeft) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_stepQ(pr->project, timeLeft)); } -int DLLEXPORT qual_close(Handle ph) +int EXPORT_PY_API qual_close(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_closeQ(pr->project)); @@ -201,43 +201,43 @@ int DLLEXPORT qual_close(Handle ph) -int DLLEXPORT rprt_writeline(Handle ph, char *line) +int EXPORT_PY_API rprt_writeline(Handle ph, char *line) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_writeline(pr->project, line)); } -int DLLEXPORT rprt_writeresults(Handle ph) +int EXPORT_PY_API rprt_writeresults(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_report(pr->project)); } -int DLLEXPORT rprt_reset(Handle ph) +int EXPORT_PY_API rprt_reset(Handle ph) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_resetreport(pr->project)); } -int DLLEXPORT rprt_set(Handle ph, char *reportCommand) +int EXPORT_PY_API rprt_set(Handle ph, char *reportCommand) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setreport(pr->project, reportCommand)); } -int DLLEXPORT rprt_setlevel(Handle ph, EN_StatusReport code) +int EXPORT_PY_API rprt_setlevel(Handle ph, EN_StatusReport code) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setstatusreport(pr->project, code)); } -int DLLEXPORT rprt_getcount(Handle ph, EN_CountType code, int *count) +int EXPORT_PY_API rprt_getcount(Handle ph, EN_CountType code, int *count) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcount(pr->project, code, count)); } -int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* value) +int EXPORT_PY_API rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getstatistic(pr->project, code, value)); @@ -246,55 +246,55 @@ int DLLEXPORT rprt_anlysstats(Handle ph, EN_AnalysisStatistic code, double* valu -int DLLEXPORT anlys_getoption(Handle ph, EN_Option code, double *value) +int EXPORT_PY_API anlys_getoption(Handle ph, EN_Option code, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getoption(pr->project, (int)code, value)); } -int DLLEXPORT anlys_setoption(Handle ph, EN_Option code, double value) +int EXPORT_PY_API anlys_setoption(Handle ph, EN_Option code, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setoption(pr->project, (int)code, value)); } -int DLLEXPORT anlys_getflowunits(Handle ph, int *code) +int EXPORT_PY_API anlys_getflowunits(Handle ph, int *code) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getflowunits(pr->project, code)); } -int DLLEXPORT anlys_setflowunits(Handle ph, EN_FlowUnits code) +int EXPORT_PY_API anlys_setflowunits(Handle ph, EN_FlowUnits code) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setflowunits(pr->project, code)); } -int DLLEXPORT anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value) +int EXPORT_PY_API anlys_gettimeparam(Handle ph, EN_TimeParameter code, long *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_gettimeparam(pr->project, code, value)); } -int DLLEXPORT anlys_settimeparam(Handle ph, EN_TimeParameter code, long value) +int EXPORT_PY_API anlys_settimeparam(Handle ph, EN_TimeParameter code, long value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_settimeparam(pr->project, code, value)); } -int DLLEXPORT anlys_getqualinfo(Handle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode) +int EXPORT_PY_API anlys_getqualinfo(Handle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getqualinfo(pr->project, qualcode, chemname, chemunits, tracenode)); } -int DLLEXPORT anlys_getqualtype(Handle ph, int *qualcode, int *tracenode) +int EXPORT_PY_API anlys_getqualtype(Handle ph, int *qualcode, int *tracenode) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getqualtype(pr->project, qualcode, tracenode)); } -int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode) +int EXPORT_PY_API anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemname, char *chemunits, char *tracenode) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setqualtype(pr->project, qualcode, chemname, chemunits, tracenode)); @@ -303,61 +303,61 @@ int DLLEXPORT anlys_setqualtype(Handle ph, EN_QualityType qualcode, char *chemna -int DLLEXPORT node_add(Handle ph, char *id, EN_NodeType nodeType) +int EXPORT_PY_API node_add(Handle ph, char *id, EN_NodeType nodeType) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_addnode(pr->project, id, nodeType)); } -int DLLEXPORT node_delete(Handle ph, int index, int actionCode) +int EXPORT_PY_API node_delete(Handle ph, int index, int actionCode) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_deletenode(pr->project, index, actionCode)); } -int DLLEXPORT node_getindex(Handle ph, char *id, int *index) +int EXPORT_PY_API node_getindex(Handle ph, char *id, int *index) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getnodeindex(pr->project, id, index)); } -int DLLEXPORT node_getid(Handle ph, int index, char *id) +int EXPORT_PY_API node_getid(Handle ph, int index, char *id) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getnodeid(pr->project, index, id)); } -int DLLEXPORT node_setid(Handle ph, int index, char *newid) +int EXPORT_PY_API node_setid(Handle ph, int index, char *newid) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getnodeid(pr->project, index, newid)); } -int DLLEXPORT node_gettype(Handle ph, int index, int *code) +int EXPORT_PY_API node_gettype(Handle ph, int index, int *code) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getnodetype(pr->project, index, code)); } -int DLLEXPORT node_getvalue(Handle ph, int index, EN_NodeProperty code, double *value) +int EXPORT_PY_API node_getvalue(Handle ph, int index, EN_NodeProperty code, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getnodevalue(pr->project, index, (int)code, value)); } -int DLLEXPORT node_setvalue(Handle ph, int index, EN_NodeProperty code, double value) +int EXPORT_PY_API node_setvalue(Handle ph, int index, EN_NodeProperty code, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setnodevalue(pr->project, index, (int)code, value)); } -int DLLEXPORT node_getcoord(Handle ph, int index, double *x, double *y) +int EXPORT_PY_API node_getcoord(Handle ph, int index, double *x, double *y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcoord(pr->project, index, x, y)); } -int DLLEXPORT node_setcoord(Handle ph, int index, double x, double y) +int EXPORT_PY_API node_setcoord(Handle ph, int index, double x, double y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcoord(pr->project, index, x, y)); @@ -366,55 +366,55 @@ int DLLEXPORT node_setcoord(Handle ph, int index, double x, double y) -int DLLEXPORT dmnd_getmodel(Handle ph, int *type, double *pmin, double *preq, double *pexp) +int EXPORT_PY_API dmnd_getmodel(Handle ph, int *type, double *pmin, double *preq, double *pexp) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getdemandmodel(pr->project, type, pmin, preq, pexp)); } -int DLLEXPORT dmnd_setmodel(Handle ph, int type, double pmin, double preq, double pexp) +int EXPORT_PY_API dmnd_setmodel(Handle ph, int type, double pmin, double preq, double pexp) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setdemandmodel(pr->project, type, pmin, preq, pexp)); } -int DLLEXPORT dmnd_getcount(Handle ph, int nodeIndex, int *numDemands) +int EXPORT_PY_API dmnd_getcount(Handle ph, int nodeIndex, int *numDemands) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getnumdemands(pr->project, nodeIndex, numDemands)); } -int DLLEXPORT dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, double *baseDemand) +int EXPORT_PY_API dmnd_getbase(Handle ph, int nodeIndex, int demandIndex, double *baseDemand) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getbasedemand(pr->project, nodeIndex, demandIndex, baseDemand)); } -int DLLEXPORT dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, double baseDemand) +int EXPORT_PY_API dmnd_setbase(Handle ph, int nodeIndex, int demandIndex, double baseDemand) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setbasedemand(pr->project, nodeIndex, demandIndex, baseDemand)); } -int DLLEXPORT dmnd_getpattern(Handle ph, int nodeIndex, int demandIndex, int *patIndex) +int EXPORT_PY_API dmnd_getpattern(Handle ph, int nodeIndex, int demandIndex, int *patIndex) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getdemandpattern(pr->project, nodeIndex, demandIndex, patIndex)); } -int DLLEXPORT dmnd_setpattern(Handle ph, int nodeIndex, int demandIndex, int patIndex) +int EXPORT_PY_API dmnd_setpattern(Handle ph, int nodeIndex, int demandIndex, int patIndex) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setdemandpattern(pr->project, nodeIndex, demandIndex, patIndex)); } -int DLLEXPORT dmnd_getname(Handle ph, int nodeIndex, int demandIdx, char *demandName) +int EXPORT_PY_API dmnd_getname(Handle ph, int nodeIndex, int demandIdx, char *demandName) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getdemandname(pr->project, nodeIndex, demandIdx, demandName)); } -int DLLEXPORT dmnd_setname(Handle ph, int nodeIndex, int demandIdx, char *demandName) +int EXPORT_PY_API dmnd_setname(Handle ph, int nodeIndex, int demandIdx, char *demandName) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setdemandname(pr->project, nodeIndex, demandIdx, demandName)); @@ -423,67 +423,67 @@ int DLLEXPORT dmnd_setname(Handle ph, int nodeIndex, int demandIdx, char *demand -int DLLEXPORT link_add(Handle ph, char *id, EN_LinkType linkType, char *fromNode, char *toNode) +int EXPORT_PY_API link_add(Handle ph, char *id, EN_LinkType linkType, char *fromNode, char *toNode) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_addlink(pr->project, id, linkType, fromNode, toNode)); } -int DLLEXPORT link_delete(Handle ph, int index, int actionCode) +int EXPORT_PY_API link_delete(Handle ph, int index, int actionCode) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_deletelink(pr->project, index, actionCode)); } -int DLLEXPORT link_getindex(Handle ph, char *id, int *index) +int EXPORT_PY_API link_getindex(Handle ph, char *id, int *index) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getlinkindex(pr->project, id, index)); } -int DLLEXPORT link_getid(Handle ph, int index, char *id) +int EXPORT_PY_API link_getid(Handle ph, int index, char *id) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getlinkid(pr->project, index, id)); } -int DLLEXPORT link_setid(Handle ph, int index, char *newid) +int EXPORT_PY_API link_setid(Handle ph, int index, char *newid) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setlinkid(pr->project, index, newid)); } -int DLLEXPORT link_gettype(Handle ph, int index, int *code) +int EXPORT_PY_API link_gettype(Handle ph, int index, int *code) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getlinktype(pr->project, index, code)); } -int DLLEXPORT link_settype(Handle ph, int *index, EN_LinkType type, int actionCode) +int EXPORT_PY_API link_settype(Handle ph, int *index, EN_LinkType type, int actionCode) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setlinktype(pr->project, index, type, actionCode)); } -int DLLEXPORT link_getnodes(Handle ph, int index, int *node1, int *node2) +int EXPORT_PY_API link_getnodes(Handle ph, int index, int *node1, int *node2) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getlinknodes(pr->project, index, node1, node2)); } -int DLLEXPORT link_setnodes(Handle ph, int index, int node1, int node2) +int EXPORT_PY_API link_setnodes(Handle ph, int index, int node1, int node2) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setlinknodes(pr->project, index, node1, node2)); } -int DLLEXPORT link_getvalue(Handle ph, int index, EN_LinkProperty code, double *value) +int EXPORT_PY_API link_getvalue(Handle ph, int index, EN_LinkProperty code, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getlinkvalue(pr->project, index, code, value)); } -int DLLEXPORT link_setvalue(Handle ph, int index, int code, double value) +int EXPORT_PY_API link_setvalue(Handle ph, int index, int code, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setlinkvalue(pr->project, index, code, value)); @@ -492,19 +492,19 @@ int DLLEXPORT link_setvalue(Handle ph, int index, int code, double value) -int DLLEXPORT pump_gettype(Handle ph, int linkIndex, int *outType) +int EXPORT_PY_API pump_gettype(Handle ph, int linkIndex, int *outType) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpumptype(pr->project, linkIndex, outType)); } -int DLLEXPORT pump_getheadcurveindex(Handle ph, int pumpIndex, int *curveIndex) +int EXPORT_PY_API pump_getheadcurveindex(Handle ph, int pumpIndex, int *curveIndex) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getheadcurveindex(pr->project, pumpIndex, curveIndex)); } -int DLLEXPORT pump_setheadcurveindex(Handle ph, int pumpIndex, int curveIndex) +int EXPORT_PY_API pump_setheadcurveindex(Handle ph, int pumpIndex, int curveIndex) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setheadcurveindex(pr->project, pumpIndex, curveIndex)); @@ -513,49 +513,49 @@ int DLLEXPORT pump_setheadcurveindex(Handle ph, int pumpIndex, int curveIndex) -int DLLEXPORT ptrn_add(Handle ph, char *id) +int EXPORT_PY_API ptrn_add(Handle ph, char *id) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_addpattern(pr->project, id)); } -int DLLEXPORT ptrn_getindex(Handle ph, char *id, int *index) +int EXPORT_PY_API ptrn_getindex(Handle ph, char *id, int *index) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpatternindex(pr->project, id, index)); } -int DLLEXPORT ptrn_getid(Handle ph, int index, char *id) +int EXPORT_PY_API ptrn_getid(Handle ph, int index, char *id) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpatternid(pr->project, index, id)); } -int DLLEXPORT ptrn_getlength(Handle ph, int index, int *len) +int EXPORT_PY_API ptrn_getlength(Handle ph, int index, int *len) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpatternlen(pr->project, index, len)); } -int DLLEXPORT ptrn_getvalue(Handle ph, int index, int period, double *value) +int EXPORT_PY_API ptrn_getvalue(Handle ph, int index, int period, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpatternvalue(pr->project, index, period, value)); } -int DLLEXPORT ptrn_setvalue(Handle ph, int index, int period, double value) +int EXPORT_PY_API ptrn_setvalue(Handle ph, int index, int period, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpatternvalue(pr->project, index, period, value)); } -int DLLEXPORT ptrn_getavgvalue(Handle ph, int index, double *value) +int EXPORT_PY_API ptrn_getavgvalue(Handle ph, int index, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getaveragepatternvalue(pr->project, index, value)); } -int DLLEXPORT ptrn_set(Handle ph, int index, double *values, int len) +int EXPORT_PY_API ptrn_set(Handle ph, int index, double *values, int len) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpattern(pr->project, index, values, len)); @@ -564,55 +564,55 @@ int DLLEXPORT ptrn_set(Handle ph, int index, double *values, int len) -int DLLEXPORT curv_add(Handle ph, char *id) +int EXPORT_PY_API curv_add(Handle ph, char *id) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_addcurve(pr->project, id)); } -int DLLEXPORT curv_getindex(Handle ph, char *id, int *index) +int EXPORT_PY_API curv_getindex(Handle ph, char *id, int *index) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurveindex(pr->project, id, index)); } -int DLLEXPORT curv_getid(Handle ph, int index, char *id) +int EXPORT_PY_API curv_getid(Handle ph, int index, char *id) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurveid(pr->project, index, id)); } -int DLLEXPORT curv_getlength(Handle ph, int index, int *len) +int EXPORT_PY_API curv_getlength(Handle ph, int index, int *len) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurvelen(pr->project, index, len)); } -int DLLEXPORT curv_gettype(Handle ph, int index, int *type) +int EXPORT_PY_API curv_gettype(Handle ph, int index, int *type) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurvetype(pr->project, index, type)); } -int DLLEXPORT curv_getvalue(Handle ph, int curveIndex, int pointIndex, double *x, double *y) +int EXPORT_PY_API curv_getvalue(Handle ph, int curveIndex, int pointIndex, double *x, double *y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurvevalue(pr->project, curveIndex, pointIndex, x, y)); } -int DLLEXPORT curv_setvalue(Handle ph, int curveIndex, int pointIndex, double x, double y) +int EXPORT_PY_API curv_setvalue(Handle ph, int curveIndex, int pointIndex, double x, double y) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcurvevalue(pr->project, curveIndex, pointIndex, x, y)); } -int DLLEXPORT curv_get(Handle ph, int curveIndex, char* id, int *nValues, double **xValues, double **yValues) +int EXPORT_PY_API curv_get(Handle ph, int curveIndex, char* id, int *nValues, double **xValues, double **yValues) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcurve(pr->project, curveIndex, id, nValues, xValues, yValues)); } -int DLLEXPORT curv_set(Handle ph, int index, double *x, double *y, int len) +int EXPORT_PY_API curv_set(Handle ph, int index, double *x, double *y, int len) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcurve(pr->project, index, x, y, len)); @@ -621,25 +621,25 @@ int DLLEXPORT curv_set(Handle ph, int index, double *x, double *y, int len) -int DLLEXPORT scntl_add(Handle ph, int type, int linkIndex, double setting, int nodeIndex, double level, int *index) +int EXPORT_PY_API scntl_add(Handle ph, int type, int linkIndex, double setting, int nodeIndex, double level, int *index) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_addcontrol(pr->project, type, linkIndex, setting, nodeIndex, level, index)); } -int DLLEXPORT scntl_delete(Handle ph, int index) +int EXPORT_PY_API scntl_delete(Handle ph, int index) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_deletecontrol(pr->project, index)); } -int DLLEXPORT scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, double *setting, int *nodeIndex, double *level) +int EXPORT_PY_API scntl_get(Handle ph, int controlIndex, int *controlType, int *linkIndex, double *setting, int *nodeIndex, double *level) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getcontrol(pr->project, controlIndex, controlType, linkIndex, setting, nodeIndex, level)); } -int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, double setting, int nindex, double level) +int EXPORT_PY_API scntl_set(Handle ph, int cindex, int ctype, int lindex, double setting, int nindex, double level) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setcontrol(pr->project, cindex, ctype, lindex, setting, nindex, level)); @@ -648,85 +648,85 @@ int DLLEXPORT scntl_set(Handle ph, int cindex, int ctype, int lindex, double set -int DLLEXPORT rcntl_add(Handle ph, char *rule) +int EXPORT_PY_API rcntl_add(Handle ph, char *rule) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_addrule(pr->project, rule)); } -int DLLEXPORT rcntl_delete(Handle ph, int index) +int EXPORT_PY_API rcntl_delete(Handle ph, int index) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_deleterule(pr->project, index)); } -int DLLEXPORT rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, double *priority) +int EXPORT_PY_API rcntl_get(Handle ph, int index, int *nPremises, int *nThenActions, int *nElseActions, double *priority) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getrule(pr->project, index, nPremises, nThenActions, nElseActions, priority)); } -int DLLEXPORT rcntl_getid(Handle ph, int index, char *id) +int EXPORT_PY_API rcntl_getid(Handle ph, int index, char *id) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getruleID(pr->project, index, id)); } -int DLLEXPORT rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, double *value) +int EXPORT_PY_API rcntl_getpremise(Handle ph, int ruleIndex, int premiseIndex, int *logop, int *object, int *objIndex, int *variable, int *relop, int *status, double *value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getpremise(pr->project, ruleIndex, premiseIndex, logop, object, objIndex, variable, relop, status, value)); } -int DLLEXPORT rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, double value) +int EXPORT_PY_API rcntl_setpremise(Handle ph, int ruleIndex, int premiseIndex, int logop, int object, int objIndex, int variable, int relop, int status, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpremise(pr->project, ruleIndex, premiseIndex, logop, object, objIndex, variable, relop, status, value)); } -int DLLEXPORT rcntl_setpremiseindex(Handle ph, int ruleIndex, int premiseIndex, int objIndex) +int EXPORT_PY_API rcntl_setpremiseindex(Handle ph, int ruleIndex, int premiseIndex, int objIndex) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpremiseindex(pr->project, ruleIndex, premiseIndex, objIndex)); } -int DLLEXPORT rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, int status) +int EXPORT_PY_API rcntl_setpremisestatus(Handle ph, int ruleIndex, int premiseIndex, int status) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpremisestatus(pr->project, ruleIndex, premiseIndex, status)); } -int DLLEXPORT rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, double value) +int EXPORT_PY_API rcntl_setpremisevalue(Handle ph, int ruleIndex, int premiseIndex, double value) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setpremisevalue(pr->project, ruleIndex, premiseIndex, value)); } -int DLLEXPORT rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting) +int EXPORT_PY_API rcntl_getthenaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getthenaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting) +int EXPORT_PY_API rcntl_setthenaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setthenaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting) +int EXPORT_PY_API rcntl_getelseaction(Handle ph, int ruleIndex, int actionIndex, int *linkIndex, int *status, double *setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_getelseaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting) +int EXPORT_PY_API rcntl_setelseaction(Handle ph, int ruleIndex, int actionIndex, int linkIndex, int status, double setting) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setelseaction(pr->project, ruleIndex, actionIndex, linkIndex, status, setting)); } -int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, double priority) +int EXPORT_PY_API rcntl_setrulepriority(Handle ph, int index, double priority) { handle_t *pr = (handle_t *)ph; return error_set(pr->error, EN_setrulepriority(pr->project, index, priority)); @@ -735,13 +735,13 @@ int DLLEXPORT rcntl_setrulepriority(Handle ph, int index, double priority) -void DLLEXPORT err_clear(Handle ph) +void EXPORT_PY_API err_clear(Handle ph) { handle_t *pr = (handle_t *)ph; error_clear(pr->error); } -int DLLEXPORT err_check(Handle ph, char** msg_buffer) +int EXPORT_PY_API err_check(Handle ph, char** msg_buffer) // // Purpose: Returns the error message or NULL. // @@ -767,12 +767,12 @@ int DLLEXPORT err_check(Handle ph, char** msg_buffer) return errorcode; } -int DLLEXPORT toolkit_getversion(int *version) +int EXPORT_PY_API toolkit_getversion(int *version) { return EN_getversion(version); } -void DLLEXPORT toolkit_free(void **memory) +void EXPORT_PY_API toolkit_free(void **memory) { free(*memory); *memory = NULL;