diff --git a/README.md b/README.md index 64fb8c3..0941b69 100644 --- a/README.md +++ b/README.md @@ -370,6 +370,58 @@ fn main() { +### ruapu with Pascal + + + + + +
+ +Compile ruapu library + +```shell +cd pascal +sudo apt install fpc +cmake . +make +fpc ruapu.lpr +``` + + + +Use ruapu in Pascal + +```pascal +program ruapu; + +uses ruapu_pascal; + +var + has_avx2: integer; + supported: PPAnsiChar; +begin + // initialize ruapu once + ruapu_init(); + + // now, tell me if this cpu has avx2 + has_avx2 := ruapu_supports('avx2'); + + // loop all supported features + supported := ruapu_rua(); + while supported^ <> nil do + begin + writeln(supported^); + inc(supported); + end; + + readln(); +end. + +``` + +
+
Github-hosted runner result (Linux) diff --git a/pascal/CMakeLists.txt b/pascal/CMakeLists.txt new file mode 100644 index 0000000..c060345 --- /dev/null +++ b/pascal/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.0) + +project(ruapu) + +include_directories(../) + +option(BUILD_SHARED_LIBS "Build shared libraries" ON) + +add_library(ruapu + ruapu-binding.c +) + diff --git a/pascal/Readme.md b/pascal/Readme.md new file mode 100644 index 0000000..7b1ada8 --- /dev/null +++ b/pascal/Readme.md @@ -0,0 +1,9 @@ +How to use: + +```shell +sudo apt install fpc +cmake . +make +fpc ruapu.lpr +./ruapu +``` \ No newline at end of file diff --git a/pascal/ruapu-binding.c b/pascal/ruapu-binding.c new file mode 100644 index 0000000..eabc77d --- /dev/null +++ b/pascal/ruapu-binding.c @@ -0,0 +1,30 @@ + +#ifndef DLL_EXPORT +#ifdef _WIN32 +#ifdef _WINDLL +#define DLL_EXPORT __declspec(dllexport) +#else +#define DLL_EXPORT +#endif +#else +#define DLL_EXPORT __attribute__((visibility("default"))) +#endif +#endif + +#define RUAPU_IMPLEMENTATION +#include "ruapu.h" + +DLL_EXPORT void ruapu_init_c() +{ + ruapu_init(); +} + +DLL_EXPORT int ruapu_supports_c(const char* isa) +{ + return ruapu_supports(isa); +} + +DLL_EXPORT const char* const* ruapu_rua_c() +{ + return ruapu_rua(); +} diff --git a/pascal/ruapu.lpr b/pascal/ruapu.lpr new file mode 100644 index 0000000..1bcf956 --- /dev/null +++ b/pascal/ruapu.lpr @@ -0,0 +1,25 @@ +program ruapu; + +uses ruapu_pascal; + +var + has_avx2: integer; + supported: PPAnsiChar; +begin + // initialize ruapu once + ruapu_init(); + + // now, tell me if this cpu has avx2 + has_avx2 := ruapu_supports('avx2'); + + // loop all supported features + supported := ruapu_rua(); + while supported^ <> nil do + begin + writeln(supported^); + inc(supported); + end; + + readln(); +end. + diff --git a/pascal/ruapu_pascal.pas b/pascal/ruapu_pascal.pas new file mode 100644 index 0000000..63dc99e --- /dev/null +++ b/pascal/ruapu_pascal.pas @@ -0,0 +1,31 @@ +unit ruapu_pascal; + +{$mode ObjFPC}{$H+} + +interface +uses + Classes, SysUtils; + +const +{$IFDEF MSWINDOWS} + ruapu_lib = 'ruapu.dll'; +{$ELSE} +{$IFDEF DARWIN} + ruapu_lib = 'libruapu.dylib'; +{$ENDIF} +{$IFDEF ANDROID} + ruapu_lib = 'libruapu.so'; +{$ENDIF} +{$IFDEF linux} + ruapu_lib = 'libruapu.so'; +{$ENDIF} +{$ENDIF} + +procedure ruapu_init(); cdecl; external ruapu_lib name 'ruapu_init_c'; +function ruapu_supports(const isa: PAnsiChar): Integer; cdecl; external ruapu_lib name 'ruapu_supports_c'; +function ruapu_rua(): PPAnsiChar; cdecl; external ruapu_lib name 'ruapu_rua_c'; + +implementation + +end. +