3c99d84a1a7a22ad474f8a980966a8db6f3c5b73 — octaspire 7 months ago 723ae98 v0.482.0
Add python script for MSVC build, update and fix some code

* Replace Microsoft Windows .bat file for doing
  Visual Studio 2017 build with a python script.

  This adds Python 2.7 as a tool dependency in Windows,
  but it has the benefit, that the user doesn't have to
  download, extract and set up all the dependencies.

  The script does everything required to compile Dern,
  all the plugins and examples using Visual Studio 2017; it
  downloads all the library headers and libraries,
  extracts them, copies files, generates few .lib files,
  and then builds Dern, plugins and examples.

* Make rest of the Dern plugins to compile with Visual Studio.

* Make some external code to compile with Visual Studio.
M dev/include/octaspire/dern/octaspire_dern_config.h => dev/include/octaspire/dern/octaspire_dern_config.h +2 -2
@@ 18,8 18,8 @@ #define OCTASPIRE_DERN_CONFIG_H
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_MAJOR "0"
- #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "481"
- #define OCTASPIRE_DERN_CONFIG_VERSION_PATCH "1"
+ #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "482"
+ #define OCTASPIRE_DERN_CONFIG_VERSION_PATCH "0"
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_STR "Octaspire Dern version " \
      OCTASPIRE_DERN_CONFIG_VERSION_MAJOR "." \

D release/how-to-build/windows-msvc.bat => release/how-to-build/windows-msvc.bat +0 -78
@@ 1,78 0,0 @@-@ECHO OFF
- 
- @ECHO -----------------------------------------------------------------
- @ECHO stand alone unit test runner:
- @ECHO -----------------------------------------------------------------
- cl /nologo /W3 /DOCTASPIRE_DERN_AMALGAMATED_UNIT_TEST_IMPLEMENTATION octaspire-dern-amalgamated.c /link /out:octaspire-dern-unit-test-runner.exe
- @ECHO.
- @ECHO RUN WITH:
- @ECHO octaspire-dern-unit-test-runner.exe
- @ECHO.
- @ECHO BUILD WITH:
- @ECHO cl /W3 /DOCTASPIRE_DERN_AMALGAMATED_UNIT_TEST_IMPLEMENTATION octaspire-dern-amalgamated.c /link /out:octaspire-dern-unit-test-runner.exe
- 
- 
- @ECHO -----------------------------------------------------------------
- @ECHO embedding example
- @ECHO -----------------------------------------------------------------
- cl /nologo /W2 /I. /DOCTASPIRE_DERN_CONFIG_BINARY_PLUGINS examples\embedding-example.c /link /out:embedding-example.exe
- @ECHO.
- @ECHO RUN WITH:
- @ECHO embedding-example.exe
- @ECHO.
- @ECHO BUILD WITH:
- @ECHO cl /W2 /I. /DOCTASPIRE_DERN_CONFIG_BINARY_PLUGINS examples\embedding-example.c /link /out:embedding-example.exe
- 
- 
- @ECHO -----------------------------------------------------------------
- @ECHO interactive Dern REPL:
- @ECHO -----------------------------------------------------------------
- cl /nologo /W2 /DOCTASPIRE_DERN_AMALGAMATED_REPL_IMPLEMENTATION /DOCTASPIRE_DERN_CONFIG_BINARY_PLUGINS octaspire-dern-amalgamated.c /link /out:octaspire-dern-repl.exe
- @ECHO.
- @ECHO RUN WITH:
- @ECHO octaspire-dern-repl.exe
- @ECHO.
- @ECHO BUILD WITH:
- @ECHO cl /W2 /DOCTASPIRE_DERN_AMALGAMATED_REPL_IMPLEMENTATION /DOCTASPIRE_DERN_CONFIG_BINARY_PLUGINS octaspire-dern-amalgamated.c /link /out:octaspire-dern-repl.exe
- 
- 
- @ECHO -----------------------------------------------------------------
- @ECHO binary library example
- @ECHO -----------------------------------------------------------------
- cl /nologo /W2 /I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD examples\mylib.c /link /out:libmylib.dll
- @ECHO.
- @ECHO RUN WITH:
- @ECHO octaspire-dern-repl.exe examples\use-mylib.dern
- @ECHO.
- @ECHO BUILD WITH:
- @ECHO cl /W2 /I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD examples\mylib.c /link /out:libmylib.dll
- 
- 
- @ECHO -----------------------------------------------------------------
- @ECHO Dern socket plugin
- @ECHO -----------------------------------------------------------------
- cl /nologo /W2 /I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_socket.c /link ws2_32.lib /out:libdern_socket.dll
- @ECHO.
- @ECHO RUN WITH:
- @ECHO octaspire-dern-repl.exe -I examples examples\irc-client-ncurses.dern
- @ECHO octaspire-dern-repl.exe -I examples examples\irc-client-nuklear.dern
- @ECHO.
- @ECHO BUILD WITH:
- @ECHO cl /W2 /I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_socket.c /link ws2_32.lib /out:libdern_socket.dll
- 
- 
- @ECHO -----------------------------------------------------------------
- @ECHO Dern ncurses plugin
- @ECHO -----------------------------------------------------------------
- cl /nologo /W2 /I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_ncurses.c /link pdcurses.lib /out:libdern_ncurses.dll
- @ECHO.
- @ECHO INSTALL DEPENDENCIES LIKE THIS:
- @ECHO 1. Go to https://pdcurses.sourceforge.io
- @ECHO 2. Download file 'pdc34dllw.zip' into 'release'-directory
- @ECHO 3. Run command: unzip pdc34dllw.zip
- @ECHO.
- @ECHO RUN WITH:
- @ECHO octaspire-dern-repl.exe examples\dern-ncurses-example.dern
- @ECHO.
- @ECHO BUILD WITH:
- @ECHO cl /nologo /W2 /I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_ncurses.c /link pdcurses.lib /out:libdern_ncurses.dll

A release/how-to-build/windows-msvc.py => release/how-to-build/windows-msvc.py +280 -0
@@ 0,0 1,280 @@
+ ###############################################################################
+ # Copyright 2017 - 2019 www.octaspire.com                                     #
+ #                                                                             #
+ # Licensed under the Apache License, Version 2.0 (the "License");             #
+ # you may not use this file except in compliance with the License.            #
+ # You may obtain a copy of the License at                                     #
+ #                                                                             #
+ #  http://www.apache.org/licenses/LICENSE-2.0                                 #
+ #                                                                             #
+ # Unless required by applicable law or agreed to in writing, software         #
+ # distributed under the License is distributed on an "AS IS" BASIS,           #
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.    #
+ # See the License for the specific language governing permissions and         #
+ # limitations under the License.                                              #
+ # --------------------------------------------------------------------------- #
+ # This python program is tested with Python 2.7.15 in Microsoft Windows 10.   #
+ #                                                                             #
+ # It first downloads, extracts and sets up all dependencies for building      #
+ # Octaspire Dern and all the plugins and examples in Windows. Then it builds  #
+ # Octaspire Dern and all the plugins and examples.                            #
+ #                                                                             #
+ # Required software: Python 2.7, git and Visual Studio 2017                   #
+ #                    (community edition).                                     #
+ #                                                                             #
+ # Usage: 1. Start 'Developer Command Prompt for VS 2017'.                     #
+ #        2. git clone https://github.com/octaspire/dern.git                   #
+ #        3. cd dern\release                                                   #
+ #        4. python how-to-build\windows-msvc.py                               #
+ ###############################################################################
+ import getopt
+ import os
+ import re
+ import shutil
+ import sys
+ import urllib
+ import zipfile
+ 
+ ###############################################################################
+ # Helper functions                                                            #
+ ###############################################################################
+ def octaspire_copydir(p):
+     sourceFiles = os.listdir(p)
+     for f in sourceFiles:
+         shutil.copy(p + '/' + f, '.')
+ 
+ def octaspire_depend(prefix, f, dirName, copyFromPath):
+     print('- Dependency {}'.format(dirName))
+     if not os.path.isfile(f):
+         print('\tDownloading {}'.format(f))
+         urllib.urlretrieve(prefix + f, f)
+     if not os.path.isdir(dirName):
+         print('\tExtracting {}'.format(f))
+         zip_file = zipfile.ZipFile(f, 'r')
+         zip_file.extractall()
+         zip_file.close()
+     if len(copyFromPath) > 0:
+         print('\tCopying from {}'.format(copyFromPath))
+         octaspire_copydir(copyFromPath)
+     print('')
+ 
+ def octaspire_depend_sourceforge(url, f, dirName, copyFromPath):
+     print('- Dependency {}'.format(dirName))
+     if not os.path.isfile(f):
+         print('\tDownloading {}'.format(f))
+         urllib.urlretrieve(url, f)
+     if not os.path.isdir(dirName):
+         print('\tExtracting {}'.format(f))
+         zip_file = zipfile.ZipFile(f, 'r')
+         zip_file.extractall(dirName)
+         zip_file.close()
+     if len(copyFromPath) > 0:
+         print('\tCopying from {}'.format(copyFromPath))
+         octaspire_copydir(copyFromPath)
+     print('')
+ 
+ def octaspire_build(resultName, desc, buildCommand, *runExamples):
+     print('- Building   {}\n\t     {}'.format(resultName, desc))
+     print('-----------------------------------------------------')
+     os.system(buildCommand)
+     print('-----------------------------------------------------')
+     if not os.path.isfile(resultName):
+         print('\t ERROR {} FAILED TO BUILD'.format(resultName))
+         sys.exit(1)
+     for a in runExamples:
+         print('             Run or test like this: {}'.format(a))
+     print('')
+ 
+ def octaspire_create_lib_file(dllFileName):
+     defFileName = dllFileName.replace('.dll', '.def')
+     tmpFileName = dllFileName.replace('.dll', '.tmp')
+     libFileName = dllFileName.replace('.dll', '.lib')
+     print('- Generating .lib for {}'.format(dllFileName))
+     print('-----------------------------------------------------')
+     os.system('dumpbin /exports {} /OUT:{}'.format(dllFileName, tmpFileName))
+     ordinalSeen = False
+     defFile = open(defFileName, 'w')
+     defFile.write('EXPORTS\n')
+     for line in open(tmpFileName):
+         if ordinalSeen:
+             if 'Summary' in line:
+                 break
+             else:
+                 columns = line.split()
+                 if len(columns) >= 4:
+                     defFile.write('{}\n'.format(columns[3]))
+         elif re.match(r'.*ordinal.*hint.*RVA.*name.*', line):
+             ordinalSeen = True
+     defFile.close()
+     os.system('lib /def:{} /OUT:{}'.format(defFileName, libFileName))
+     print('-----------------------------------------------------')
+ 
+ def octaspire_usage():
+     print('\nUsage: python {} [OPTION]\n'.format(os.path.basename(__file__)))
+     print('where optional options are:')
+     print('-g - Build with Debug information.')
+     print('-h - Show help and exit.')
+ 
+ ###############################################################################
+ # main function                                                               #
+ ###############################################################################
+ def main(argv):
+     cl             = 'cl /nologo /W2 '
+     cflags         = '/DOCTASPIRE_DERN_CONFIG_BINARY_PLUGINS '
+     cflagsChipmunk = '/DNDEBUG '
+     try:
+         opts, args = getopt.getopt(argv, 'g')
+     except getopt.GetoptError:
+         octaspire_usage()
+         sys.exit(1)
+     for opt, arg in opts:
+         if opt == '-g':
+             cflags += '/DEBUG /Z7 '
+             cflagsChipmunk = ''
+             print('- Building in debug configuration.\n')
+         elif opt == '-h':
+             octaspire_usage()
+             sys.exit(0)
+     ###########################################################################
+     # Get dependencies and create .lib files                                  #
+     ###########################################################################
+     # Get dependency: PDCurses library
+     octaspire_depend_sourceforge(
+         'https://sourceforge.net/projects/pdcurses/files/pdcurses/3.4/pdc34dllw.zip/download',
+         'pdc34dllw.zip',
+         'pdc34dllw',
+         'pdc34dllw')
+     # Get dependency: SDL2
+     octaspire_depend(
+         'https://www.libsdl.org/release/',
+         'SDL2-devel-2.0.9-VC.zip',
+         'SDL2-2.0.9',
+         'SDL2-2.0.9/lib/x86/')
+     # Get dependency: SDL2_ttf libraries
+     octaspire_depend(
+         'https://www.libsdl.org/projects/SDL_ttf/release/',
+         'SDL2_ttf-2.0.14-win32-x86.zip',
+         'SDL2_ttf-2.0.14-win32-x86',
+         '')
+     octaspire_create_lib_file('SDL2_image.dll')
+     octaspire_create_lib_file('SDL2_mixer.dll')
+     octaspire_create_lib_file('SDL2_ttf.dll')
+     # Get dependency: SDL2_ttf headers
+     octaspire_depend(
+         'https://www.libsdl.org/projects/SDL_ttf/release/',
+         'SDL2_ttf-2.0.14.zip',
+         'SDL2_ttf-2.0.14',
+         '')
+     # Get dependency: SDL2_mixer libraries
+     octaspire_depend(
+         'https://www.libsdl.org/projects/SDL_mixer/release/',
+         'SDL2_mixer-2.0.4-win32-x86.zip',
+         'SDL2_mixer-2.0.4-win32-x86',
+         '')
+     # Get dependency: SDL2_mixer headers
+     octaspire_depend(
+         'https://www.libsdl.org/projects/SDL_mixer/release/',
+         'SDL2_mixer-2.0.4.zip',
+         'SDL2_mixer-2.0.4',
+         '')
+     # Get dependency: SDL2_image libraries
+     octaspire_depend(
+         'https://www.libsdl.org/projects/SDL_image/release/',
+         'SDL2_image-2.0.4-win32-x86.zip',
+         'SDL2_image-2.0.4-win32-x86',
+         '')
+     # Get dependency: SDL2_image headers
+     octaspire_depend(
+         'https://www.libsdl.org/projects/SDL_image/release/',
+         'SDL2_image-2.0.4.zip',
+         'SDL2_image-2.0.4',
+         '')
+     ###########################################################################
+     # Build programs, plugins and examples                                    #
+     ###########################################################################
+     # Build Unit test runner
+     octaspire_build(
+         'octaspire-dern-unit-test-runner.exe',
+         'stand alone unit test runner',
+         cl + cflags + '/DOCTASPIRE_DERN_AMALGAMATED_UNIT_TEST_IMPLEMENTATION octaspire-dern-amalgamated.c /link /out:octaspire-dern-unit-test-runner.exe',
+         'octaspire-dern-unit-test-runner.exe')
+     # Build interactive Dern REPL
+     octaspire_build(
+         'octaspire-dern-repl.exe',
+         'interactive Dern REPL',
+         cl + cflags + '/DOCTASPIRE_DERN_AMALGAMATED_REPL_IMPLEMENTATION octaspire-dern-amalgamated.c /link /out:octaspire-dern-repl.exe',
+         'octaspire-dern-repl.exe')
+     # Build Dern ncurses plugin
+     octaspire_build(
+         'libdern_ncurses.dll',
+         'Dern ncurses plugin (uses pdcurses)',
+         cl + cflags + '/I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_ncurses.c /link pdcurses.lib /out:libdern_ncurses.dll',
+         'octaspire-dern-repl.exe examples\dern-ncurses-example.dern')
+     # Build Dern SDL2 plugin
+     octaspire_build(
+         'libdern_sdl2.dll',
+         'Dern SDL2 plugin (uses SDL2, SDL2_image, SDL2_mixer and SDL2_ttf)',
+         cl + cflags + '/I. /ISDL2-2.0.9\include /ISDL2_image-2.0.4 /ISDL2_mixer-2.0.4 /ISDL2_ttf-2.0.14 /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_OPENGL2_LIBRARY /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_IMAGE_LIBRARY /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_MIXER_LIBRARY /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_TTF_LIBRARY /Dmain=SDL_main /LD plugins\dern_sdl2.c /link SDL2.lib SDL2_mixer.lib SDL2_ttf.lib SDL2_image.lib opengl32.lib glu32.lib /out:libdern_sdl2.dll',
+         'octaspire-dern-repl.exe examples\dern-sdl2-example.dern')
+     # Build Dern Nuklear plugin
+     octaspire_build(
+         'libdern_nuklear.dll',
+         'Dern Nuklear plugin',
+         cl + cflags + '/I. /Iplugins/external/nuklear /ISDL2-2.0.9\include /ISDL2_image-2.0.4 /ISDL2_mixer-2.0.4 /ISDL2_ttf-2.0.14 /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_OPENGL2_LIBRARY /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_IMAGE_LIBRARY /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_MIXER_LIBRARY /DOCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_TTF_LIBRARY /LD plugins\dern_nuklear.c /link SDL2.lib SDL2_mixer.lib SDL2_ttf.lib SDL2_image.lib opengl32.lib glu32.lib /out:libdern_nuklear.dll',
+         'octaspire-dern-repl.exe examples\dern-nuklear-example.dern')
+     # Build Dern socket plugin
+     octaspire_build(
+         'libdern_socket.dll',
+         'Dern socket plugin',
+         cl + cflags + '/I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_socket.c /link ws2_32.lib /out:libdern_socket.dll',
+         'octaspire-dern-repl.exe -I examples examples\irc-client-ncurses.dern',
+         'octaspire-dern-repl.exe -I examples examples\irc-client-nuklear.dern')
+     # Build Dern easing plugin
+     octaspire_build(
+         'libdern_easing.dll',
+         'Dern easing plugin',
+         cl + cflags + '/I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_easing.c /link /out:libdern_easing.dll',
+         'octaspire-dern-repl.exe examples\dern-easing-example.dern')
+     # Build Dern animation plugin
+     octaspire_build(
+         'libdern_animation.dll',
+         'Dern animation plugin',
+         cl + cflags + '/I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_animation.c /link /out:libdern_animation.dll',
+         'octaspire-dern-repl.exe examples\dern-animation-example.dern')
+     # Build Dern dir plugin
+     octaspire_build(
+         'libdern_dir.dll',
+         'Dern directory plugin',
+         cl + cflags + '/W2 /I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_dir.c /link /out:libdern_dir.dll',
+         'octaspire-dern-repl.exe examples\dern-dir-example.dern')
+     print('Building Chipmunk library...')
+     os.system(cl + cflagsChipmunk + '/Iplugins/external/chipmunk/include /Iplugins/external/chipmunk/include/chipmunk /LD plugins/external/chipmunk/src/*.c /link /out:libchipmunk.dll')
+     # Build Dern chipmunk plugin
+     octaspire_build(
+         'libdern_chipmunk.dll',
+         'Dern chipmunk plugin',
+         cl + cflags + '/I. /Iplugins/external/chipmunk/include/ /Iplugins/external/chipmunk/include/chipmunk /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\dern_chipmunk.c plugins\external\sqlite3\sqlite3.c /link chipmunk.lib /out:libdern_chipmunk.dll',
+         'octaspire-dern-repl.exe examples\dern-chipmunk-example.dern')
+     #print('Compiling SQLite3...')
+     #os.system(cl + cflags + '/Iplugins/external/sqlite3 plugins/external/sqlite3/sqlite3.c')
+     # Build Dern SQLite3 plugin
+     octaspire_build(
+         'libdern_sqlite3.dll',
+         'Dern SQLite3 plugin',
+         cl + cflags + '/I. /Iplugins/external/sqlite3/ /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD plugins\external\sqlite3\sqlite3.c plugins\dern_sqlite3.c /link /out:libdern_sqlite3.dll',
+         'octaspire-dern-repl.exe examples\dern-sqlite3-example.dern')
+     # Build embedding example
+     octaspire_build(
+         'embedding-example.exe',
+         'embedding example',
+         cl + cflags + '/I. /DOCTASPIRE_DERN_CONFIG_BINARY_PLUGINS examples\embedding-example.c /link /out:embedding-example.exe',
+         'embedding-example.exe')
+     # Build binary library example
+     octaspire_build(
+         'libmylib.dll',
+         'binary library example',
+         cl + cflags + '/I. /DOCTASPIRE_DERN_AMALGAMATED_IMPLEMENTATION /LD examples\mylib.c /link /out:libmylib.dll',
+         'octaspire-dern-repl.exe examples\use-mylib.dern')
+ 
+ if __name__ == '__main__':
+     main(sys.argv[1:])

M release/octaspire-dern-amalgamated.c => release/octaspire-dern-amalgamated.c +2 -2
@@ 26336,8 26336,8 @@ #define OCTASPIRE_DERN_CONFIG_H
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_MAJOR "0"
- #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "481"
- #define OCTASPIRE_DERN_CONFIG_VERSION_PATCH "1"
+ #define OCTASPIRE_DERN_CONFIG_VERSION_MINOR "482"
+ #define OCTASPIRE_DERN_CONFIG_VERSION_PATCH "0"
  
  #define OCTASPIRE_DERN_CONFIG_VERSION_STR "Octaspire Dern version " \
      OCTASPIRE_DERN_CONFIG_VERSION_MAJOR "." \

M release/plugins/dern_animation.c => release/plugins/dern_animation.c +27 -0
@@ 125,6 125,9 @@ static octaspire_map_t    * dern_animation_private_animations = 0;
  static octaspire_string_t * dern_animation_private_lib_name   = 0;
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_animation_add(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 375,6 378,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_animation_remove(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 438,6 444,9 @@ return octaspire_dern_vm_create_new_value_integer(vm, numRemoved);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_animation_loop(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 530,6 539,9 @@ return octaspire_dern_vm_create_new_value_integer(vm, loopCount);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_animation_playing(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 624,6 636,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, isPlaying);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_animation_update(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 731,6 746,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_animation_has_any(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 756,6 774,9 @@ !octaspire_map_is_empty(dern_animation_private_animations));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_animation_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,


@@ 861,6 882,9 @@ return true;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_animation_mark_all(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv)


@@ 893,6 917,9 @@ return true;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_animation_clean(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv)

M release/plugins/dern_chipmunk.c => release/plugins/dern_chipmunk.c +123 -0
@@ 197,6 197,9 @@ return result;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceNew(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 251,6 254,9 @@ space);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyNew(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 325,6 331,9 @@ body);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyNewStatic(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 367,6 376,9 @@ body);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyNewKinematic(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 409,6 421,9 @@ body);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpCircleShapeNew(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 525,6 540,9 @@ shape);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBoxShapeNew(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 652,6 670,9 @@ shape);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSegmentShapeNew(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 792,6 813,9 @@ shape);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpShapeSetFriction(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 869,6 893,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceSetGravity(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 950,6 977,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceReindexStatic(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1005,6 1035,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceGetGravity(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1072,6 1105,9 @@ return result.cData;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceGetStaticBody(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1138,6 1174,9 @@ cpSpaceGetStaticBody(space));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyGetVelocity(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1207,6 1246,9 @@ return result.cData;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyGetType(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1287,6 1329,9 @@ }
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodySetVelocity(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1370,6 1415,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodySetAngularVelocity(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1445,6 1493,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodySetPosition(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1525,6 1576,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyGetAngle(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1577,6 1631,9 @@ return octaspire_dern_vm_create_new_value_real(vm, angle);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyGetPosition(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1644,6 1701,9 @@ return result.cData;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyApplyImpulseAtLocalPoint(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1748,6 1808,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyApplyImpulseAtWorldPoint(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1852,6 1915,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyApplyForceAtLocalPoint(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1956,6 2022,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpBodyApplyForceAtWorldPoint(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2060,6 2129,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceStep(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2131,6 2203,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceAddBody(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2204,6 2279,9 @@ return cDataOrError.cData;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceAddShape(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2277,6 2355,9 @@ return cDataOrError.cData;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_chipmunk_private_do_wildcard_callback(
      cpArbiter              *       arb,
      cpSpace                *       space,


@@ 2424,6 2505,9 @@ stackLength == octaspire_dern_vm_get_stack_length(context->vm));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_chipmunk_private_wildcard_post_solve_handler(
      cpArbiter * arb,
      cpSpace   * space,


@@ 2443,6 2527,9 @@ stackLength == octaspire_dern_vm_get_stack_length(context->vm));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_chipmunk_private_wildcard_separate_handler(
      cpArbiter * arb,
      cpSpace   * space,


@@ 2462,6 2549,9 @@ stackLength == octaspire_dern_vm_get_stack_length(context->vm));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceAddWildCardHandler(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2601,6 2691,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_removeWildCardHandlers(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2638,6 2731,9 @@ dern_chipmunk_private_collision_wildcard_contexts));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceRemoveBody(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2714,6 2810,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpSpaceContainsBody(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2790,6 2889,9 @@ cpSpaceContainsBody(space, body));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpv(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2876,6 2978,9 @@ return result.cData;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpv_get_x(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2934,6 3039,9 @@ return octaspire_dern_vm_create_new_value_real(vm, vect->x);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_chipmunk_cpv_get_y(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2992,6 3100,9 @@ return octaspire_dern_vm_create_new_value_real(vm, vect->y);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_chipmunk_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,


@@ 4076,6 4187,9 @@ return true;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void * dern_chipmunk_to_string(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,


@@ 4160,6 4274,9 @@ }
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void * dern_chipmunk_compare(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,


@@ 4240,6 4357,9 @@ }
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_chipmunk_mark_all(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv)


@@ 4269,6 4389,9 @@ return true;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_chipmunk_clean(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv)

M release/plugins/dern_dir.c => release/plugins/dern_dir.c +6 -0
@@ 31,6 31,9 @@ #endif
  #endif
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_dir_get_listing(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 217,6 220,9 @@ return result;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_dir_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,

M release/plugins/dern_easing.c => release/plugins/dern_easing.c +18 -1
@@ 613,7 613,9 @@ static octaspire_vector_t * dern_easing_private_easings = 0;
  
  
- 
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_easing_add(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2217,6 2219,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_easing_update(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2536,6 2541,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_easing_has_any(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2561,6 2569,9 @@ !octaspire_vector_is_empty(dern_easing_private_easings));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_easing_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,


@@ 2620,6 2631,9 @@ return true;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_easing_mark_all(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv)


@@ 2643,6 2657,9 @@ return true;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_easing_clean(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv)

M release/plugins/dern_nuklear.c => release/plugins/dern_nuklear.c +66 -0
@@ 53,6 53,9 @@ octaspire_allocator_free(allocator, context);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_sdl_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 128,6 131,9 @@ ctx);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_begin(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 286,6 292,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_label(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 447,6 456,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_label_wrap(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 561,6 573,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_button_label(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 642,6 657,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_checkbox_label(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 747,6 765,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_slider_int(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 885,6 906,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_slider_float(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1023,6 1047,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_option_label(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1149,6 1176,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_edit_string(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1424,6 1454,9 @@ return octaspire_dern_vm_create_new_value_string(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_edit_focus(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1510,6 1543,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_progress(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1631,6 1667,9 @@ (int32_t)current);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_layout_row_dynamic(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1727,6 1766,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_layout_row_static(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1841,6 1883,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_layout_row(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2030,6 2075,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_end(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2089,6 2137,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_input_begin(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2148,6 2199,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_sdl_handle_event(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2233,6 2287,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_input_end(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2292,6 2349,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_sdl_render(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2328,6 2388,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_nuklear_rgba(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2438,6 2501,9 @@ context);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_nuklear_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,

M release/plugins/dern_sdl2.c => release/plugins/dern_sdl2.c +228 -0
@@ 898,6 898,9 @@ octaspire_vector_clear(dern_sdl2_private_controllers);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_sdl2_window_clean_up_callback(void *payload)
  {
      octaspire_helpers_verify_not_null(payload);


@@ 905,6 908,9 @@ SDL_DestroyWindow((SDL_Window*)payload);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_sdl2_event_clean_up_callback(void *payload)
  {
      octaspire_helpers_verify_not_null(payload);


@@ 919,6 925,9 @@ octaspire_allocator_free(allocator, context);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_sdl2_renderer_clean_up_callback(void *payload)
  {
      octaspire_helpers_verify_not_null(payload);


@@ 1011,6 1020,9 @@ }
  #endif
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_sdl2_texture_clean_up_callback(void *payload)
  {
      octaspire_helpers_verify_not_null(payload);


@@ 1032,6 1044,9 @@ }
  
  #ifdef OCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_TTF_LIBRARY
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_sdl2_font_clean_up_callback(void *payload)
  {
      octaspire_helpers_verify_not_null(payload);


@@ 1057,6 1072,9 @@ #endif
  
  #ifdef OCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_MIXER_LIBRARY
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_sdl2_music_clean_up_callback(void *payload)
  {
      octaspire_helpers_verify_not_null(payload);


@@ 1079,6 1097,9 @@ #endif
  
  #ifdef OCTASPIRE_DERN_SDL2_PLUGIN_USE_SDL_MIXER_LIBRARY
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  void dern_sdl2_sound_clean_up_callback(void *payload)
  {
      octaspire_helpers_verify_not_null(payload);


@@ 1100,6 1121,9 @@ }
  #endif
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_Init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1344,6 1368,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_GetTicks(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1372,6 1399,9 @@ SDL_GetTicks());
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_TimerUpdate(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1401,6 1431,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_TimerReset(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1430,6 1463,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_TimerGetSeconds(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1458,6 1494,9 @@ octaspire_sdl2_timer_get_seconds(dern_sdl2_private_timer));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_Delay(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1511,6 1550,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_PollEvent(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1807,6 1849,9 @@ }
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_GetModState(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 1922,6 1967,9 @@ return result;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_CreateTexture(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2188,6 2236,9 @@ (void*)dern_sdl2_private_next_free_texture_uid);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_QueryTexture(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2335,6 2386,9 @@ }
  #endif
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_CreateTextureFromFontAndText(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2551,6 2605,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_CreateSound(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2695,6 2752,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_CreateMusic(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2839,6 2899,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_PlayMusic(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 2967,6 3030,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_PlaySound(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 3094,6 3160,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_CreateWindow(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 3436,6 3505,9 @@ window);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_CreateFont(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 3597,6 3669,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_CreateRenderer(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 3753,6 3828,9 @@ renderer);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_RenderClear(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 3820,6 3898,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_RenderPresent(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 3880,6 3961,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_GL_SwapWindow(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 3947,6 4031,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glColor4ub(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4107,6 4194,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glClearColor(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4223,6 4313,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glReadPixel(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4323,6 4416,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glClear(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4357,6 4453,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glPushMatrix(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4391,6 4490,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glPopMatrix(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4425,6 4527,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glLoadIdentity(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4459,6 4564,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glTranslatef(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4555,6 4663,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gluLookAt(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4617,6 4728,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_screen_to_world(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4778,6 4892,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gluPerspective(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 4894,6 5011,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glViewport(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5010,6 5130,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glClearDepth(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5066,6 5189,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glRotatef(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5182,6 5308,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glVertex3(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5278,6 5407,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glTexCoord2f(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5355,6 5487,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_ortho_enter(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5431,6 5566,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_ortho_line_smooth_enable(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5497,6 5635,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_ortho_circle(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5576,6 5717,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_ortho_circle_rotated(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5669,6 5813,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_ortho_square_box_rotated(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5763,6 5910,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_ortho_star_rotated(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5854,6 6004,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_gl_ortho_line(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 5927,6 6080,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glMatrixMode(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 6008,6 6164,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glBegin(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 6113,6 6272,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glEnable(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 6418,6 6580,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glDisable(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 6723,6 6888,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_glEnd(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 6757,6 6925,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_load_texture_base64(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 6915,6 7086,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_SetRenderDrawColor(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7015,6 7189,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_RenderDrawPoint(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7112,6 7289,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_RenderDrawLine(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7211,6 7391,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_RenderDrawRect(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7311,6 7494,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_RenderCopy(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7563,6 7749,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_RenderFillRect(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7663,6 7852,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_SetRenderDrawBlendMode(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7777,6 7969,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_GetWindowSurface(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7857,6 8052,9 @@ surface);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_GetPixelFormat(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 7927,6 8125,9 @@ surface->format);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_FillRect(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8108,6 8309,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_UpdateWindowSurface(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8177,6 8381,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_MapRGB(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8263,6 8470,9 @@ SDL_MapRGB(pixelFormat, colorComponents[0], colorComponents[1], colorComponents[2]));
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_NumJoysticks(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8299,6 8509,9 @@ return octaspire_dern_vm_create_new_value_integer(vm, result);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_Quit(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8335,6 8548,9 @@ true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_has_img(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8365,6 8581,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_has_mix(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8395,6 8614,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sdl2_has_ttf(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 8425,6 8647,9 @@ #endif
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_sdl2_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,


@@ 9255,6 9480,9 @@ return true;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_sdl2_clean(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv)

M release/plugins/dern_sqlite3.c => release/plugins/dern_sqlite3.c +12 -0
@@ 93,6 93,9 @@ sqlite3_close((sqlite3*)payload);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sqlite3_open(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 165,6 168,9 @@ return result;
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sqlite3_close(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 236,6 242,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  octaspire_dern_value_t *dern_sqlite3_exec(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_value_t * const arguments,


@@ 381,6 390,9 @@ return octaspire_dern_vm_create_new_value_boolean(vm, true);
  }
  
+ #ifdef _MSC_VER
+ extern __declspec(dllexport)
+ #endif
  bool dern_sqlite3_init(
      octaspire_dern_vm_t * const vm,
      octaspire_dern_environment_t * const targetEnv,

M release/plugins/external/chipmunk/src/cpHastySpace.c => release/plugins/external/chipmunk/src/cpHastySpace.c +3 -3
@@ 54,7 54,7 @@ } pthread_cond_t;
  typedef CRITICAL_SECTION pthread_mutex_t;
  
- typedef struct {} pthread_condattr_t; // Dummy;
+ typedef void pthread_condattr_t; // Dummy;
  
  int pthread_cond_destroy(pthread_cond_t* cv)
  {


@@ 149,7 149,7 @@ return result == WAIT_TIMEOUT ? ETIMEDOUT : 0;
  }
  
- typedef struct {} pthread_mutexattr_t; //< Dummy
+ typedef void pthread_mutexattr_t; //< Dummy
  
  int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr)
  {


@@ 175,7 175,7 @@ return 0;
  }
  
- typedef struct {} pthread_attr_t;
+ typedef void pthread_attr_t;
  
  typedef struct
  {

M release/plugins/external/nuklear/nuklear_sdl_gl2.h => release/plugins/external/nuklear/nuklear_sdl_gl2.h +4 -0
@@ 13,7 13,11 @@ #ifndef NK_SDL_GL2_H_
  #define NK_SDL_GL2_H_
  
+ #ifdef _MSC_VER
+ #include "SDL.h"
+ #else
  #include <SDL2/SDL.h>
+ #endif
  NK_API struct nk_context*   nk_sdl_init(SDL_Window *win);
  NK_API void                 nk_sdl_font_stash_begin(struct nk_font_atlas **atlas);
  NK_API void                 nk_sdl_font_stash_end(void);