From e027131489d39a687ca3be1ca823eb7015339b55 Mon Sep 17 00:00:00 2001 From: Maxwell Jeffress Date: Fri, 19 Sep 2025 17:47:22 +1000 Subject: [PATCH] Initial commit --- README.md | 3 + compileall.sh | 15 +++ compiling.md | 9 ++ exec.so | Bin 0 -> 83552 bytes exec/README.md | 9 ++ exec/exec.cpp | 16 +++ exec/ground_lib.h | 193 +++++++++++++++++++++++++++++++++ file.so | Bin 0 -> 94280 bytes file/README.md | 13 +++ file/file.cpp | 43 ++++++++ file/ground_lib.h | 193 +++++++++++++++++++++++++++++++++ ground_lib.h | 193 +++++++++++++++++++++++++++++++++ httpserver/ground_lib.h | 193 +++++++++++++++++++++++++++++++++ httpserver/httpserver.cpp | 17 +++ httpserver/httpserver.so | Bin 0 -> 79072 bytes httpserver/libraries/httplib.h | 0 math.so | Bin 0 -> 101496 bytes math/README.md | 45 ++++++++ math/ground_lib.h | 193 +++++++++++++++++++++++++++++++++ math/math.cpp | 79 ++++++++++++++ request.so | Bin 0 -> 269000 bytes request/README.md | 13 +++ request/ground_lib.h | 193 +++++++++++++++++++++++++++++++++ request/request.cpp | 52 +++++++++ 24 files changed, 1472 insertions(+) create mode 100644 README.md create mode 100755 compileall.sh create mode 100644 compiling.md create mode 100755 exec.so create mode 100644 exec/README.md create mode 100644 exec/exec.cpp create mode 100644 exec/ground_lib.h create mode 100755 file.so create mode 100644 file/README.md create mode 100644 file/file.cpp create mode 100644 file/ground_lib.h create mode 100644 ground_lib.h create mode 100644 httpserver/ground_lib.h create mode 100644 httpserver/httpserver.cpp create mode 100755 httpserver/httpserver.so create mode 100644 httpserver/libraries/httplib.h create mode 100755 math.so create mode 100644 math/README.md create mode 100644 math/ground_lib.h create mode 100644 math/math.cpp create mode 100755 request.so create mode 100644 request/README.md create mode 100644 request/ground_lib.h create mode 100644 request/request.cpp diff --git a/README.md b/README.md new file mode 100644 index 0000000..029644d --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Ground Libraries + +These are some libraries coded in C++ for Ground. All are avaliable for anyone to use. diff --git a/compileall.sh b/compileall.sh new file mode 100755 index 0000000..17422ff --- /dev/null +++ b/compileall.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +echo "This script is designed for Linux systems" +echo "Please ensure CPR is installed on your system before continuing" +echo "On Arch Linux: sudo pacman -S cpr" + +echo "Compiling exec library" +g++ -shared -fPIC -o exec.so exec/exec.cpp +echo "Compiling file library" +g++ -shared -fPIC -o file.so file/file.cpp +echo "Compiling math library" +g++ -shared -fPIC -o math.so math/math.cpp +echo "Compiling request library" +g++ -shared -fPIC -lcpr -o request.so request/request.cpp +echo "Done" diff --git a/compiling.md b/compiling.md new file mode 100644 index 0000000..54bd42e --- /dev/null +++ b/compiling.md @@ -0,0 +1,9 @@ +## Compiling External Libraries + +On Linux: + +`g++ -shared -fPIC -o filename.so filename.cpp` + +On macOS: + +`g++ -shared -fPIC -o filename.dylib filename.cpp` diff --git a/exec.so b/exec.so new file mode 100755 index 0000000000000000000000000000000000000000..fa3acc383c6068b07ec0c79383f3b759597cb3d9 GIT binary patch literal 83552 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 JD_~=d{|Ai}JH!A0 literal 0 HcmV?d00001 diff --git a/exec/README.md b/exec/README.md new file mode 100644 index 0000000..bf10e3f --- /dev/null +++ b/exec/README.md @@ -0,0 +1,9 @@ +# exec library + +This library allows executing third party executables via the C++ "system" command. + +## Functions + +### fun -int !exec -string &command + +Runs a command on a system. Returns the status code of that command. diff --git a/exec/exec.cpp b/exec/exec.cpp new file mode 100644 index 0000000..d0f6f83 --- /dev/null +++ b/exec/exec.cpp @@ -0,0 +1,16 @@ +#include "ground_lib.h" + +GroundValue exec(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_STRING); + int exec = system(GET_STRING(args[0])); + return GROUND_INT_VAL(exec); +} + +GROUND_LIBRARY_INTERFACE() + +GROUND_LIBRARY_INIT() + REGISTER_GROUND_FUNCTION(exec); +GROUND_LIBRARY_INIT_END() + +GROUND_LIBRARY_CLEANUP() +GROUND_LIBRARY_CLEANUP_END() diff --git a/exec/ground_lib.h b/exec/ground_lib.h new file mode 100644 index 0000000..7567cf1 --- /dev/null +++ b/exec/ground_lib.h @@ -0,0 +1,193 @@ +#ifndef GROUND_LIB_H +#define GROUND_LIB_H + +#include +#include +#include +#include + +// Ground types - must match the interpreter +typedef enum { + GROUND_INT, + GROUND_DOUBLE, + GROUND_BOOL, + GROUND_STRING, + GROUND_CHAR +} GroundType; + +typedef struct { + GroundType type; + union { + int int_val; + double double_val; + int bool_val; + char* string_val; + char char_val; + } data; +} GroundValue; + +// Helper macros for creating GroundValue objects +#define GROUND_INT_VAL(x) ({ GroundValue v; v.type = GROUND_INT; v.data.int_val = (x); v; }) +#define GROUND_DOUBLE_VAL(x) ({ GroundValue v; v.type = GROUND_DOUBLE; v.data.double_val = (x); v; }) +#define GROUND_BOOL_VAL(x) ({ GroundValue v; v.type = GROUND_BOOL; v.data.bool_val = (x) ? 1 : 0; v; }) +#define GROUND_CHAR_VAL(x) ({ GroundValue v; v.type = GROUND_CHAR; v.data.char_val = (x); v; }) + +// Helper function for creating string values +inline GroundValue ground_string_val(const std::string& str) { + GroundValue v; + v.type = GROUND_STRING; + char* result_str = new char[str.length() + 1]; + std::strcpy(result_str, str.c_str()); + v.data.string_val = result_str; + return v; +} + +// Helper function for creating string values from C strings +inline GroundValue ground_cstring_val(const char* str) { + GroundValue v; + v.type = GROUND_STRING; + if (str) { + size_t len = std::strlen(str); + char* result_str = new char[len + 1]; + std::strcpy(result_str, str); + v.data.string_val = result_str; + } else { + v.data.string_val = nullptr; + } + return v; +} + +// Helper macros for type checking +#define IS_INT(v) ((v).type == GROUND_INT) +#define IS_DOUBLE(v) ((v).type == GROUND_DOUBLE) +#define IS_BOOL(v) ((v).type == GROUND_BOOL) +#define IS_STRING(v) ((v).type == GROUND_STRING) +#define IS_CHAR(v) ((v).type == GROUND_CHAR) + +// Helper macros for extracting values +#define GET_INT(v) ((v).data.int_val) +#define GET_DOUBLE(v) ((v).data.double_val) +#define GET_BOOL(v) ((v).data.bool_val != 0) +#define GET_STRING(v) ((v).data.string_val) +#define GET_CHAR(v) ((v).data.char_val) + +// Helper macros for argument validation +#define REQUIRE_ARGS(count) \ + if (arg_count < (count)) { \ + std::cerr << "Error: Expected at least " << (count) << " arguments, got " << arg_count << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +#define REQUIRE_TYPE(arg_index, expected_type) \ + if (args[arg_index].type != expected_type) { \ + std::cerr << "Error: Argument " << (arg_index + 1) << " must be of type " << #expected_type << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +// Convenience macro for checking both arg count and types +#define VALIDATE_ARGS_1(type1) \ + REQUIRE_ARGS(1); \ + REQUIRE_TYPE(0, type1); + +#define VALIDATE_ARGS_2(type1, type2) \ + REQUIRE_ARGS(2); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); + +#define VALIDATE_ARGS_3(type1, type2, type3) \ + REQUIRE_ARGS(3); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); \ + REQUIRE_TYPE(2, type3); + +// Function registration helpers +class GroundLibrary { +private: + std::vector function_names; + std::vector function_pointers; + +public: + void register_function(const std::string& name, void* ptr) { + function_names.push_back(name); + function_pointers.push_back(ptr); + } + + const char** get_function_names() { + static std::vector names; + names.clear(); + for (const auto& name : function_names) { + names.push_back(name.c_str()); + } + names.push_back(nullptr); // Null terminator + return names.data(); + } + + void* get_function(const char* name) { + for (size_t i = 0; i < function_names.size(); i++) { + if (function_names[i] == name) { + return function_pointers[i]; + } + } + return nullptr; + } +}; + +// Global library instance +extern GroundLibrary ground_lib_registry; + +// Macro to register functions easily +#define REGISTER_GROUND_FUNCTION(func_name) \ + ground_lib_registry.register_function(#func_name, (void*)func_name) + +// Macro to define the library interface +#define GROUND_LIBRARY_INTERFACE() \ + GroundLibrary ground_lib_registry; \ + extern "C" { \ + const char** ground_get_functions() { \ + return ground_lib_registry.get_function_names(); \ + } \ + void* ground_get_function(const char* name) { \ + return ground_lib_registry.get_function(name); \ + } \ + } + +// Optional initialization macro +#define GROUND_LIBRARY_INIT() \ + extern "C" { \ + void ground_lib_init() { + +#define GROUND_LIBRARY_INIT_END() \ + } \ + } + +// Optional cleanup macro +#define GROUND_LIBRARY_CLEANUP() \ + extern "C" { \ + void ground_lib_cleanup() { + +#define GROUND_LIBRARY_CLEANUP_END() \ + } \ + } + +// Utility function to print GroundValue for debugging +inline void debug_print_ground_value(const GroundValue& v) { + switch (v.type) { + case GROUND_INT: + std::cout << "INT: " << v.data.int_val << std::endl; + break; + case GROUND_DOUBLE: + std::cout << "DOUBLE: " << v.data.double_val << std::endl; + break; + case GROUND_BOOL: + std::cout << "BOOL: " << (v.data.bool_val ? "true" : "false") << std::endl; + break; + case GROUND_STRING: + std::cout << "STRING: " << (v.data.string_val ? v.data.string_val : "(null)") << std::endl; + break; + case GROUND_CHAR: + std::cout << "CHAR: '" << v.data.char_val << "'" << std::endl; + break; + } +} + +#endif // GROUND_LIB_H diff --git a/file.so b/file.so new file mode 100755 index 0000000000000000000000000000000000000000..6716b8a55fd0db8177bfc3c592df663db866fcb0 GIT binary patch literal 94280 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 literal 0 HcmV?d00001 diff --git a/file/README.md b/file/README.md new file mode 100644 index 0000000..d33c9cd --- /dev/null +++ b/file/README.md @@ -0,0 +1,13 @@ +# file library + +This library allows reading from and writing to files on the system. + +## Functions + +### fun -string !readFile -string &fileName + +This function reads all content from a file and returns it. + +### fun -bool !writeFile -string &fileName -string &content + +This function overwrites a file with specified content. If successful, returns true. If not successful, returns false, and prints out a reason why it didn't work. diff --git a/file/file.cpp b/file/file.cpp new file mode 100644 index 0000000..285fa6c --- /dev/null +++ b/file/file.cpp @@ -0,0 +1,43 @@ +#include "ground_lib.h" + +#include +#include + +GroundValue readFile(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_STRING); + + std::ifstream ffile(GET_STRING(args[0])); + + std::string tmp; + std::string out; + + while (std::getline(ffile, tmp)) { + out += tmp + "\n"; + } + + return ground_string_val(out); +} + +GroundValue writeFile(GroundValue* args, int arg_count) { + VALIDATE_ARGS_2(GROUND_STRING, GROUND_STRING); + + std::ofstream file(GET_STRING(args[0])); + if (file.good()) { + file << GET_STRING(args[1]); + } else { + std::cout << "File isn't good for writing in" << std::endl; + return GROUND_BOOL_VAL(false); + } + + return GROUND_BOOL_VAL(true); +} + +GROUND_LIBRARY_INTERFACE() + +GROUND_LIBRARY_INIT() + REGISTER_GROUND_FUNCTION(readFile); + REGISTER_GROUND_FUNCTION(writeFile); +GROUND_LIBRARY_INIT_END() + +GROUND_LIBRARY_CLEANUP() +GROUND_LIBRARY_CLEANUP_END() diff --git a/file/ground_lib.h b/file/ground_lib.h new file mode 100644 index 0000000..7567cf1 --- /dev/null +++ b/file/ground_lib.h @@ -0,0 +1,193 @@ +#ifndef GROUND_LIB_H +#define GROUND_LIB_H + +#include +#include +#include +#include + +// Ground types - must match the interpreter +typedef enum { + GROUND_INT, + GROUND_DOUBLE, + GROUND_BOOL, + GROUND_STRING, + GROUND_CHAR +} GroundType; + +typedef struct { + GroundType type; + union { + int int_val; + double double_val; + int bool_val; + char* string_val; + char char_val; + } data; +} GroundValue; + +// Helper macros for creating GroundValue objects +#define GROUND_INT_VAL(x) ({ GroundValue v; v.type = GROUND_INT; v.data.int_val = (x); v; }) +#define GROUND_DOUBLE_VAL(x) ({ GroundValue v; v.type = GROUND_DOUBLE; v.data.double_val = (x); v; }) +#define GROUND_BOOL_VAL(x) ({ GroundValue v; v.type = GROUND_BOOL; v.data.bool_val = (x) ? 1 : 0; v; }) +#define GROUND_CHAR_VAL(x) ({ GroundValue v; v.type = GROUND_CHAR; v.data.char_val = (x); v; }) + +// Helper function for creating string values +inline GroundValue ground_string_val(const std::string& str) { + GroundValue v; + v.type = GROUND_STRING; + char* result_str = new char[str.length() + 1]; + std::strcpy(result_str, str.c_str()); + v.data.string_val = result_str; + return v; +} + +// Helper function for creating string values from C strings +inline GroundValue ground_cstring_val(const char* str) { + GroundValue v; + v.type = GROUND_STRING; + if (str) { + size_t len = std::strlen(str); + char* result_str = new char[len + 1]; + std::strcpy(result_str, str); + v.data.string_val = result_str; + } else { + v.data.string_val = nullptr; + } + return v; +} + +// Helper macros for type checking +#define IS_INT(v) ((v).type == GROUND_INT) +#define IS_DOUBLE(v) ((v).type == GROUND_DOUBLE) +#define IS_BOOL(v) ((v).type == GROUND_BOOL) +#define IS_STRING(v) ((v).type == GROUND_STRING) +#define IS_CHAR(v) ((v).type == GROUND_CHAR) + +// Helper macros for extracting values +#define GET_INT(v) ((v).data.int_val) +#define GET_DOUBLE(v) ((v).data.double_val) +#define GET_BOOL(v) ((v).data.bool_val != 0) +#define GET_STRING(v) ((v).data.string_val) +#define GET_CHAR(v) ((v).data.char_val) + +// Helper macros for argument validation +#define REQUIRE_ARGS(count) \ + if (arg_count < (count)) { \ + std::cerr << "Error: Expected at least " << (count) << " arguments, got " << arg_count << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +#define REQUIRE_TYPE(arg_index, expected_type) \ + if (args[arg_index].type != expected_type) { \ + std::cerr << "Error: Argument " << (arg_index + 1) << " must be of type " << #expected_type << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +// Convenience macro for checking both arg count and types +#define VALIDATE_ARGS_1(type1) \ + REQUIRE_ARGS(1); \ + REQUIRE_TYPE(0, type1); + +#define VALIDATE_ARGS_2(type1, type2) \ + REQUIRE_ARGS(2); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); + +#define VALIDATE_ARGS_3(type1, type2, type3) \ + REQUIRE_ARGS(3); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); \ + REQUIRE_TYPE(2, type3); + +// Function registration helpers +class GroundLibrary { +private: + std::vector function_names; + std::vector function_pointers; + +public: + void register_function(const std::string& name, void* ptr) { + function_names.push_back(name); + function_pointers.push_back(ptr); + } + + const char** get_function_names() { + static std::vector names; + names.clear(); + for (const auto& name : function_names) { + names.push_back(name.c_str()); + } + names.push_back(nullptr); // Null terminator + return names.data(); + } + + void* get_function(const char* name) { + for (size_t i = 0; i < function_names.size(); i++) { + if (function_names[i] == name) { + return function_pointers[i]; + } + } + return nullptr; + } +}; + +// Global library instance +extern GroundLibrary ground_lib_registry; + +// Macro to register functions easily +#define REGISTER_GROUND_FUNCTION(func_name) \ + ground_lib_registry.register_function(#func_name, (void*)func_name) + +// Macro to define the library interface +#define GROUND_LIBRARY_INTERFACE() \ + GroundLibrary ground_lib_registry; \ + extern "C" { \ + const char** ground_get_functions() { \ + return ground_lib_registry.get_function_names(); \ + } \ + void* ground_get_function(const char* name) { \ + return ground_lib_registry.get_function(name); \ + } \ + } + +// Optional initialization macro +#define GROUND_LIBRARY_INIT() \ + extern "C" { \ + void ground_lib_init() { + +#define GROUND_LIBRARY_INIT_END() \ + } \ + } + +// Optional cleanup macro +#define GROUND_LIBRARY_CLEANUP() \ + extern "C" { \ + void ground_lib_cleanup() { + +#define GROUND_LIBRARY_CLEANUP_END() \ + } \ + } + +// Utility function to print GroundValue for debugging +inline void debug_print_ground_value(const GroundValue& v) { + switch (v.type) { + case GROUND_INT: + std::cout << "INT: " << v.data.int_val << std::endl; + break; + case GROUND_DOUBLE: + std::cout << "DOUBLE: " << v.data.double_val << std::endl; + break; + case GROUND_BOOL: + std::cout << "BOOL: " << (v.data.bool_val ? "true" : "false") << std::endl; + break; + case GROUND_STRING: + std::cout << "STRING: " << (v.data.string_val ? v.data.string_val : "(null)") << std::endl; + break; + case GROUND_CHAR: + std::cout << "CHAR: '" << v.data.char_val << "'" << std::endl; + break; + } +} + +#endif // GROUND_LIB_H diff --git a/ground_lib.h b/ground_lib.h new file mode 100644 index 0000000..7567cf1 --- /dev/null +++ b/ground_lib.h @@ -0,0 +1,193 @@ +#ifndef GROUND_LIB_H +#define GROUND_LIB_H + +#include +#include +#include +#include + +// Ground types - must match the interpreter +typedef enum { + GROUND_INT, + GROUND_DOUBLE, + GROUND_BOOL, + GROUND_STRING, + GROUND_CHAR +} GroundType; + +typedef struct { + GroundType type; + union { + int int_val; + double double_val; + int bool_val; + char* string_val; + char char_val; + } data; +} GroundValue; + +// Helper macros for creating GroundValue objects +#define GROUND_INT_VAL(x) ({ GroundValue v; v.type = GROUND_INT; v.data.int_val = (x); v; }) +#define GROUND_DOUBLE_VAL(x) ({ GroundValue v; v.type = GROUND_DOUBLE; v.data.double_val = (x); v; }) +#define GROUND_BOOL_VAL(x) ({ GroundValue v; v.type = GROUND_BOOL; v.data.bool_val = (x) ? 1 : 0; v; }) +#define GROUND_CHAR_VAL(x) ({ GroundValue v; v.type = GROUND_CHAR; v.data.char_val = (x); v; }) + +// Helper function for creating string values +inline GroundValue ground_string_val(const std::string& str) { + GroundValue v; + v.type = GROUND_STRING; + char* result_str = new char[str.length() + 1]; + std::strcpy(result_str, str.c_str()); + v.data.string_val = result_str; + return v; +} + +// Helper function for creating string values from C strings +inline GroundValue ground_cstring_val(const char* str) { + GroundValue v; + v.type = GROUND_STRING; + if (str) { + size_t len = std::strlen(str); + char* result_str = new char[len + 1]; + std::strcpy(result_str, str); + v.data.string_val = result_str; + } else { + v.data.string_val = nullptr; + } + return v; +} + +// Helper macros for type checking +#define IS_INT(v) ((v).type == GROUND_INT) +#define IS_DOUBLE(v) ((v).type == GROUND_DOUBLE) +#define IS_BOOL(v) ((v).type == GROUND_BOOL) +#define IS_STRING(v) ((v).type == GROUND_STRING) +#define IS_CHAR(v) ((v).type == GROUND_CHAR) + +// Helper macros for extracting values +#define GET_INT(v) ((v).data.int_val) +#define GET_DOUBLE(v) ((v).data.double_val) +#define GET_BOOL(v) ((v).data.bool_val != 0) +#define GET_STRING(v) ((v).data.string_val) +#define GET_CHAR(v) ((v).data.char_val) + +// Helper macros for argument validation +#define REQUIRE_ARGS(count) \ + if (arg_count < (count)) { \ + std::cerr << "Error: Expected at least " << (count) << " arguments, got " << arg_count << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +#define REQUIRE_TYPE(arg_index, expected_type) \ + if (args[arg_index].type != expected_type) { \ + std::cerr << "Error: Argument " << (arg_index + 1) << " must be of type " << #expected_type << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +// Convenience macro for checking both arg count and types +#define VALIDATE_ARGS_1(type1) \ + REQUIRE_ARGS(1); \ + REQUIRE_TYPE(0, type1); + +#define VALIDATE_ARGS_2(type1, type2) \ + REQUIRE_ARGS(2); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); + +#define VALIDATE_ARGS_3(type1, type2, type3) \ + REQUIRE_ARGS(3); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); \ + REQUIRE_TYPE(2, type3); + +// Function registration helpers +class GroundLibrary { +private: + std::vector function_names; + std::vector function_pointers; + +public: + void register_function(const std::string& name, void* ptr) { + function_names.push_back(name); + function_pointers.push_back(ptr); + } + + const char** get_function_names() { + static std::vector names; + names.clear(); + for (const auto& name : function_names) { + names.push_back(name.c_str()); + } + names.push_back(nullptr); // Null terminator + return names.data(); + } + + void* get_function(const char* name) { + for (size_t i = 0; i < function_names.size(); i++) { + if (function_names[i] == name) { + return function_pointers[i]; + } + } + return nullptr; + } +}; + +// Global library instance +extern GroundLibrary ground_lib_registry; + +// Macro to register functions easily +#define REGISTER_GROUND_FUNCTION(func_name) \ + ground_lib_registry.register_function(#func_name, (void*)func_name) + +// Macro to define the library interface +#define GROUND_LIBRARY_INTERFACE() \ + GroundLibrary ground_lib_registry; \ + extern "C" { \ + const char** ground_get_functions() { \ + return ground_lib_registry.get_function_names(); \ + } \ + void* ground_get_function(const char* name) { \ + return ground_lib_registry.get_function(name); \ + } \ + } + +// Optional initialization macro +#define GROUND_LIBRARY_INIT() \ + extern "C" { \ + void ground_lib_init() { + +#define GROUND_LIBRARY_INIT_END() \ + } \ + } + +// Optional cleanup macro +#define GROUND_LIBRARY_CLEANUP() \ + extern "C" { \ + void ground_lib_cleanup() { + +#define GROUND_LIBRARY_CLEANUP_END() \ + } \ + } + +// Utility function to print GroundValue for debugging +inline void debug_print_ground_value(const GroundValue& v) { + switch (v.type) { + case GROUND_INT: + std::cout << "INT: " << v.data.int_val << std::endl; + break; + case GROUND_DOUBLE: + std::cout << "DOUBLE: " << v.data.double_val << std::endl; + break; + case GROUND_BOOL: + std::cout << "BOOL: " << (v.data.bool_val ? "true" : "false") << std::endl; + break; + case GROUND_STRING: + std::cout << "STRING: " << (v.data.string_val ? v.data.string_val : "(null)") << std::endl; + break; + case GROUND_CHAR: + std::cout << "CHAR: '" << v.data.char_val << "'" << std::endl; + break; + } +} + +#endif // GROUND_LIB_H diff --git a/httpserver/ground_lib.h b/httpserver/ground_lib.h new file mode 100644 index 0000000..7567cf1 --- /dev/null +++ b/httpserver/ground_lib.h @@ -0,0 +1,193 @@ +#ifndef GROUND_LIB_H +#define GROUND_LIB_H + +#include +#include +#include +#include + +// Ground types - must match the interpreter +typedef enum { + GROUND_INT, + GROUND_DOUBLE, + GROUND_BOOL, + GROUND_STRING, + GROUND_CHAR +} GroundType; + +typedef struct { + GroundType type; + union { + int int_val; + double double_val; + int bool_val; + char* string_val; + char char_val; + } data; +} GroundValue; + +// Helper macros for creating GroundValue objects +#define GROUND_INT_VAL(x) ({ GroundValue v; v.type = GROUND_INT; v.data.int_val = (x); v; }) +#define GROUND_DOUBLE_VAL(x) ({ GroundValue v; v.type = GROUND_DOUBLE; v.data.double_val = (x); v; }) +#define GROUND_BOOL_VAL(x) ({ GroundValue v; v.type = GROUND_BOOL; v.data.bool_val = (x) ? 1 : 0; v; }) +#define GROUND_CHAR_VAL(x) ({ GroundValue v; v.type = GROUND_CHAR; v.data.char_val = (x); v; }) + +// Helper function for creating string values +inline GroundValue ground_string_val(const std::string& str) { + GroundValue v; + v.type = GROUND_STRING; + char* result_str = new char[str.length() + 1]; + std::strcpy(result_str, str.c_str()); + v.data.string_val = result_str; + return v; +} + +// Helper function for creating string values from C strings +inline GroundValue ground_cstring_val(const char* str) { + GroundValue v; + v.type = GROUND_STRING; + if (str) { + size_t len = std::strlen(str); + char* result_str = new char[len + 1]; + std::strcpy(result_str, str); + v.data.string_val = result_str; + } else { + v.data.string_val = nullptr; + } + return v; +} + +// Helper macros for type checking +#define IS_INT(v) ((v).type == GROUND_INT) +#define IS_DOUBLE(v) ((v).type == GROUND_DOUBLE) +#define IS_BOOL(v) ((v).type == GROUND_BOOL) +#define IS_STRING(v) ((v).type == GROUND_STRING) +#define IS_CHAR(v) ((v).type == GROUND_CHAR) + +// Helper macros for extracting values +#define GET_INT(v) ((v).data.int_val) +#define GET_DOUBLE(v) ((v).data.double_val) +#define GET_BOOL(v) ((v).data.bool_val != 0) +#define GET_STRING(v) ((v).data.string_val) +#define GET_CHAR(v) ((v).data.char_val) + +// Helper macros for argument validation +#define REQUIRE_ARGS(count) \ + if (arg_count < (count)) { \ + std::cerr << "Error: Expected at least " << (count) << " arguments, got " << arg_count << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +#define REQUIRE_TYPE(arg_index, expected_type) \ + if (args[arg_index].type != expected_type) { \ + std::cerr << "Error: Argument " << (arg_index + 1) << " must be of type " << #expected_type << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +// Convenience macro for checking both arg count and types +#define VALIDATE_ARGS_1(type1) \ + REQUIRE_ARGS(1); \ + REQUIRE_TYPE(0, type1); + +#define VALIDATE_ARGS_2(type1, type2) \ + REQUIRE_ARGS(2); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); + +#define VALIDATE_ARGS_3(type1, type2, type3) \ + REQUIRE_ARGS(3); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); \ + REQUIRE_TYPE(2, type3); + +// Function registration helpers +class GroundLibrary { +private: + std::vector function_names; + std::vector function_pointers; + +public: + void register_function(const std::string& name, void* ptr) { + function_names.push_back(name); + function_pointers.push_back(ptr); + } + + const char** get_function_names() { + static std::vector names; + names.clear(); + for (const auto& name : function_names) { + names.push_back(name.c_str()); + } + names.push_back(nullptr); // Null terminator + return names.data(); + } + + void* get_function(const char* name) { + for (size_t i = 0; i < function_names.size(); i++) { + if (function_names[i] == name) { + return function_pointers[i]; + } + } + return nullptr; + } +}; + +// Global library instance +extern GroundLibrary ground_lib_registry; + +// Macro to register functions easily +#define REGISTER_GROUND_FUNCTION(func_name) \ + ground_lib_registry.register_function(#func_name, (void*)func_name) + +// Macro to define the library interface +#define GROUND_LIBRARY_INTERFACE() \ + GroundLibrary ground_lib_registry; \ + extern "C" { \ + const char** ground_get_functions() { \ + return ground_lib_registry.get_function_names(); \ + } \ + void* ground_get_function(const char* name) { \ + return ground_lib_registry.get_function(name); \ + } \ + } + +// Optional initialization macro +#define GROUND_LIBRARY_INIT() \ + extern "C" { \ + void ground_lib_init() { + +#define GROUND_LIBRARY_INIT_END() \ + } \ + } + +// Optional cleanup macro +#define GROUND_LIBRARY_CLEANUP() \ + extern "C" { \ + void ground_lib_cleanup() { + +#define GROUND_LIBRARY_CLEANUP_END() \ + } \ + } + +// Utility function to print GroundValue for debugging +inline void debug_print_ground_value(const GroundValue& v) { + switch (v.type) { + case GROUND_INT: + std::cout << "INT: " << v.data.int_val << std::endl; + break; + case GROUND_DOUBLE: + std::cout << "DOUBLE: " << v.data.double_val << std::endl; + break; + case GROUND_BOOL: + std::cout << "BOOL: " << (v.data.bool_val ? "true" : "false") << std::endl; + break; + case GROUND_STRING: + std::cout << "STRING: " << (v.data.string_val ? v.data.string_val : "(null)") << std::endl; + break; + case GROUND_CHAR: + std::cout << "CHAR: '" << v.data.char_val << "'" << std::endl; + break; + } +} + +#endif // GROUND_LIB_H diff --git a/httpserver/httpserver.cpp b/httpserver/httpserver.cpp new file mode 100644 index 0000000..961a340 --- /dev/null +++ b/httpserver/httpserver.cpp @@ -0,0 +1,17 @@ +#define CPPHTTPLIB_OPENSSL_SUPPORT +#include "ground_lib.h" +#include "libraries/httplib.h" + +GroundValue startHttpServer(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_INT); + +} + +GROUND_LIBRARY_INTERFACE() + +GROUND_LIBRARY_INIT() + REGISTER_GROUND_FUNCTION(startHttpServer); +GROUND_LIBRARY_INIT_END() + +GROUND_LIBRARY_CLEANUP() +GROUND_LIBRARY_CLEANUP_END() diff --git a/httpserver/httpserver.so b/httpserver/httpserver.so new file mode 100755 index 0000000000000000000000000000000000000000..5dd80af1699a966eb4004b0845dcc7b71192da45 GIT binary patch literal 79072 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 tOOob~w<7t+r=?IH)UV`F`V2@`9&2IV$ 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 P_)8URaFbvE1|R+h4178$ literal 0 HcmV?d00001 diff --git a/math/README.md b/math/README.md new file mode 100644 index 0000000..a9912cb --- /dev/null +++ b/math/README.md @@ -0,0 +1,45 @@ +# math library + +This library adds extra math functions to Ground. + +## Functions + +### fun -double !sinVal -double &input + +Gets the sin of input. + +### fun -double !cosVal -double &input + +Gets the cos of input. + +### fun -double !tanVal -double &input + +Gets the tan of input. + +### fun -double !sqrtVal -double &input + +Gets the square root of input. + +### fun -int !modVal -int &a -int &b + +Gets the remainder of a divided by b. + +### fun -double !floorVal -double &input + +Gets the floor of input. + +### fun -double !ceilVal -double &input + +Gets the ceil of input. + +### fun -double !roundVal -double &input + +Rounds the input to the nearest integer. + +### fun -int !randomInt -int &min -int &max + +Gets a random integer between min and max (inclusive). + +### fun -double !randomDouble -double &min -double &max + +Gets a random double between min and max (inclusive). \ No newline at end of file diff --git a/math/ground_lib.h b/math/ground_lib.h new file mode 100644 index 0000000..7567cf1 --- /dev/null +++ b/math/ground_lib.h @@ -0,0 +1,193 @@ +#ifndef GROUND_LIB_H +#define GROUND_LIB_H + +#include +#include +#include +#include + +// Ground types - must match the interpreter +typedef enum { + GROUND_INT, + GROUND_DOUBLE, + GROUND_BOOL, + GROUND_STRING, + GROUND_CHAR +} GroundType; + +typedef struct { + GroundType type; + union { + int int_val; + double double_val; + int bool_val; + char* string_val; + char char_val; + } data; +} GroundValue; + +// Helper macros for creating GroundValue objects +#define GROUND_INT_VAL(x) ({ GroundValue v; v.type = GROUND_INT; v.data.int_val = (x); v; }) +#define GROUND_DOUBLE_VAL(x) ({ GroundValue v; v.type = GROUND_DOUBLE; v.data.double_val = (x); v; }) +#define GROUND_BOOL_VAL(x) ({ GroundValue v; v.type = GROUND_BOOL; v.data.bool_val = (x) ? 1 : 0; v; }) +#define GROUND_CHAR_VAL(x) ({ GroundValue v; v.type = GROUND_CHAR; v.data.char_val = (x); v; }) + +// Helper function for creating string values +inline GroundValue ground_string_val(const std::string& str) { + GroundValue v; + v.type = GROUND_STRING; + char* result_str = new char[str.length() + 1]; + std::strcpy(result_str, str.c_str()); + v.data.string_val = result_str; + return v; +} + +// Helper function for creating string values from C strings +inline GroundValue ground_cstring_val(const char* str) { + GroundValue v; + v.type = GROUND_STRING; + if (str) { + size_t len = std::strlen(str); + char* result_str = new char[len + 1]; + std::strcpy(result_str, str); + v.data.string_val = result_str; + } else { + v.data.string_val = nullptr; + } + return v; +} + +// Helper macros for type checking +#define IS_INT(v) ((v).type == GROUND_INT) +#define IS_DOUBLE(v) ((v).type == GROUND_DOUBLE) +#define IS_BOOL(v) ((v).type == GROUND_BOOL) +#define IS_STRING(v) ((v).type == GROUND_STRING) +#define IS_CHAR(v) ((v).type == GROUND_CHAR) + +// Helper macros for extracting values +#define GET_INT(v) ((v).data.int_val) +#define GET_DOUBLE(v) ((v).data.double_val) +#define GET_BOOL(v) ((v).data.bool_val != 0) +#define GET_STRING(v) ((v).data.string_val) +#define GET_CHAR(v) ((v).data.char_val) + +// Helper macros for argument validation +#define REQUIRE_ARGS(count) \ + if (arg_count < (count)) { \ + std::cerr << "Error: Expected at least " << (count) << " arguments, got " << arg_count << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +#define REQUIRE_TYPE(arg_index, expected_type) \ + if (args[arg_index].type != expected_type) { \ + std::cerr << "Error: Argument " << (arg_index + 1) << " must be of type " << #expected_type << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +// Convenience macro for checking both arg count and types +#define VALIDATE_ARGS_1(type1) \ + REQUIRE_ARGS(1); \ + REQUIRE_TYPE(0, type1); + +#define VALIDATE_ARGS_2(type1, type2) \ + REQUIRE_ARGS(2); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); + +#define VALIDATE_ARGS_3(type1, type2, type3) \ + REQUIRE_ARGS(3); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); \ + REQUIRE_TYPE(2, type3); + +// Function registration helpers +class GroundLibrary { +private: + std::vector function_names; + std::vector function_pointers; + +public: + void register_function(const std::string& name, void* ptr) { + function_names.push_back(name); + function_pointers.push_back(ptr); + } + + const char** get_function_names() { + static std::vector names; + names.clear(); + for (const auto& name : function_names) { + names.push_back(name.c_str()); + } + names.push_back(nullptr); // Null terminator + return names.data(); + } + + void* get_function(const char* name) { + for (size_t i = 0; i < function_names.size(); i++) { + if (function_names[i] == name) { + return function_pointers[i]; + } + } + return nullptr; + } +}; + +// Global library instance +extern GroundLibrary ground_lib_registry; + +// Macro to register functions easily +#define REGISTER_GROUND_FUNCTION(func_name) \ + ground_lib_registry.register_function(#func_name, (void*)func_name) + +// Macro to define the library interface +#define GROUND_LIBRARY_INTERFACE() \ + GroundLibrary ground_lib_registry; \ + extern "C" { \ + const char** ground_get_functions() { \ + return ground_lib_registry.get_function_names(); \ + } \ + void* ground_get_function(const char* name) { \ + return ground_lib_registry.get_function(name); \ + } \ + } + +// Optional initialization macro +#define GROUND_LIBRARY_INIT() \ + extern "C" { \ + void ground_lib_init() { + +#define GROUND_LIBRARY_INIT_END() \ + } \ + } + +// Optional cleanup macro +#define GROUND_LIBRARY_CLEANUP() \ + extern "C" { \ + void ground_lib_cleanup() { + +#define GROUND_LIBRARY_CLEANUP_END() \ + } \ + } + +// Utility function to print GroundValue for debugging +inline void debug_print_ground_value(const GroundValue& v) { + switch (v.type) { + case GROUND_INT: + std::cout << "INT: " << v.data.int_val << std::endl; + break; + case GROUND_DOUBLE: + std::cout << "DOUBLE: " << v.data.double_val << std::endl; + break; + case GROUND_BOOL: + std::cout << "BOOL: " << (v.data.bool_val ? "true" : "false") << std::endl; + break; + case GROUND_STRING: + std::cout << "STRING: " << (v.data.string_val ? v.data.string_val : "(null)") << std::endl; + break; + case GROUND_CHAR: + std::cout << "CHAR: '" << v.data.char_val << "'" << std::endl; + break; + } +} + +#endif // GROUND_LIB_H diff --git a/math/math.cpp b/math/math.cpp new file mode 100644 index 0000000..df5ab68 --- /dev/null +++ b/math/math.cpp @@ -0,0 +1,79 @@ +#include "ground_lib.h" +#include +#include + +// Math functions +GroundValue sinVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_DOUBLE); + return GROUND_DOUBLE_VAL(sin(GET_DOUBLE(args[0]))); +} + +GroundValue cosVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_DOUBLE); + return GROUND_DOUBLE_VAL(cos(GET_DOUBLE(args[0]))); +} + +GroundValue tanVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_DOUBLE); + return GROUND_DOUBLE_VAL(tan(GET_DOUBLE(args[0]))); +} + +GroundValue sqrtVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_DOUBLE); + return GROUND_DOUBLE_VAL(sqrt(GET_DOUBLE(args[0]))); +} + +GroundValue modVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_2(GROUND_INT, GROUND_INT); + return GROUND_INT_VAL(GET_INT(args[0]) % GET_INT(args[1])); +} + +GroundValue floorVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_DOUBLE); + return GROUND_DOUBLE_VAL(floor(GET_DOUBLE(args[0]))); +} + +GroundValue ceilVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_DOUBLE); + return GROUND_DOUBLE_VAL(ceil(GET_DOUBLE(args[0]))); +} + +GroundValue roundVal(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_DOUBLE); + return GROUND_DOUBLE_VAL(round(GET_DOUBLE(args[0]))); +} + +GroundValue randomInt(GroundValue* args, int arg_count) { + VALIDATE_ARGS_2(GROUND_INT, GROUND_INT); + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> distrib(GET_INT(args[0]), GET_INT(args[1])); + return GROUND_INT_VAL(distrib(gen)); +} + +GroundValue randomDouble(GroundValue* args, int arg_count) { + VALIDATE_ARGS_2(GROUND_DOUBLE, GROUND_DOUBLE); + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution<> distrib(GET_DOUBLE(args[0]), GET_DOUBLE(args[1])); + return GROUND_DOUBLE_VAL(distrib(gen)); +} + +// Library setup +GROUND_LIBRARY_INTERFACE() + +GROUND_LIBRARY_INIT() + REGISTER_GROUND_FUNCTION(sinVal); + REGISTER_GROUND_FUNCTION(cosVal); + REGISTER_GROUND_FUNCTION(tanVal); + REGISTER_GROUND_FUNCTION(sqrtVal); + REGISTER_GROUND_FUNCTION(modVal); + REGISTER_GROUND_FUNCTION(floorVal); + REGISTER_GROUND_FUNCTION(ceilVal); + REGISTER_GROUND_FUNCTION(roundVal); + REGISTER_GROUND_FUNCTION(randomInt); + REGISTER_GROUND_FUNCTION(randomDouble); +GROUND_LIBRARY_INIT_END() + +GROUND_LIBRARY_CLEANUP() +GROUND_LIBRARY_CLEANUP_END() diff --git a/request.so b/request.so new file mode 100755 index 0000000000000000000000000000000000000000..77a6c2940abfced4fe18014f7fbb58a1eeb951a9 GIT binary patch literal 269000 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
    qig!*7w_)feX_Y&5oS9=;mRAK1f?B zbe?in>-cvhC^uR-LL&5hJ?HozpxkmsKMs^C&hRf?&>!mSoPLE1`U#)}a>jq)0q1zg zY3DfV?7BM1uh6SF!FK}YEZ%q9JI5O@aE^c1z&SqYuycIf8J(`Vlk|M=@0`B1i*i8y zh_m#6?jk)V7x}v2qCNC+K_BfRJ z&_(+}^^IpaE}%(b+31a1b~BT63!3k5zj+K6*$xxqkAqw;)_u6 z1P-z<+-EOHdr@uEcjXmUwsZE$EQo z1E&AG4`jT32)BT89`T%xj(kRfk{j_@;t$Cd?%Z&RdsDfobZ+l0@l;gYf%6rAb-JCP zG)F#jQE>%MrE_nr#P3CA8#o{FSEow@WjWGMA186ezwQ?j&x(=wHAJ5{MB?rZ9Pw^# zB_2#t+o)XVKBGc(9AG%wpes_|>P{q5fnWTT}fFxA-&QysHqiA z?+D%RQ4$ZQcB|5VJ&X%Tzv{H4_Y~Bi?>s8;9jI&sr^>k$Ha3txmT=X60(VLL7gTV9 zQ~X;_k$7)Z)Pn0L{=!}gG+8DSF$=|2sUc(8a2_GrdR{Qf2qSLyr{DirBYoOk3u?>>ni z)JytniO=h>35E3cqmmb#s^35;D8!edA{!jaaddy|mUwGa@`6+8{0#h%o(H`MK{kiMydf99*#Y3;PC164%PB z;oBwNiQ1u}H(4aUw6o-+OtM}|xK5k&vp8HsD<bp91A)2Za)rXdn<(MjTJ zeDtMwi%32|H3_#J$dFGI$>*Mg=gyaSW7^13{q$X!A0qv9+*|^umk(Wv3%R$8#@Xvh z4ybxRMD@Fg>US!|J9B~L|8Y;5e$~#Klf2c+w@9cUOizKkq*vv6Xq&{n3=)Ux7A|?5 z#Pca%ihn%GTMKUVfV)Qgh5c6;Sdo8B8;RdU_=Yzm-j(DYbWh=00vXcp#!WhK%fw%( z&s>RLhnrU5)HssZTH=e|lk_`@{y52jAR52^Cj9P3l79VON#CE!f8b*h55-M0a9xRh z;eLq+MM+$hexXrRpmeZ35lO1`JnJ$ zUXu9Ikup6Xu7#^}NaAAS4G>kHrHv*2J8g=p{`g|F#FyaaB{;~AaK=Rv*UHa7u9vu0 zes+3V;_)PxR64KiBJlv4zp4JX-zxD1R6eTxtc8II%VCmc9J%K$i7%#cN0n!t9uhzJ zy-a^|NkL0S7GqZu9xvrhg^K)5l-ZERd+bNyX zNv^7X8giTDU)(~{t8wjJYA3f*JM2q*?s!hp@3~3R!!RLS9!wZ8UrkG7IwuhR!(xd~ zq47)2EAGsZcwLf*`-nbZnZ$!>oucIYQJS~^Li6^4ME@Clz7 z=Rum6s`4@JlJVwIdrxw%ofsebWAsHA_iflQCB z{q&Z2IL$M|h|lm;iMJ+t)eZ-4k@zb^9m~^_BJn-fOMEo(>Ghe!pVFj17>Wz)(f2J` zZXrZ}nB<9e+)2Du(toF!Z~Orb82PN#tjB*@A@P;e-&HyM2?dMvTXZs=on`d8J-18z zsT(D(`ccyoiEGE58B-*FnATGuMuba*28R6aM1vP_eZ*g|=h-gtC>qBV|7rasemfea zfP>-{E|SLUZPdRC3C{?U^pDn+=~VT&n%c8=Ji7J+Nxz)h$w=a}0TO`e)Q&sHPDp$c z)t5@=F&E=kOarjJ0Qpn!xl9j;Dd853l6-b()+8Fx$i_S8?6{E2== z;^V3Pk0AaHsQqilqrUG+`a4O^C_YDqNL)MKy-oFA^ruW} zNcv&4?ru+f_RNrYQ|hO$5q|S9iC?7gPK{G*pyRiIb~5b^nI0tv=8l#0+VP^zHi@^U zcCO@YHxP8#-n8SzTIe8%=b@n%xW{ER=(dDQe56KS)TN%p`_uTin9{#$lEm+)^`5^L8~pe(pjZeo5_6E4T0bkkUhXfNLn;Eq6+M zWe=H7D0bl%wvqT@GPD~{_&2by!gOx_LDpB4!f8EHMC%bF;cqvT^do8B0^M1-7xqj1 z(+C+a3{S#k-X!q?(u=D0KZ4}#1X}ksA^NQ(&yz`>t9ec)#rqfOwLlyR_nC|FV)-5! z?=g*D<vLgs2t8gD0B(9Z{Rw^HNYKN-7A2=h&ml7IZ)H(0Hxn!#xco9z%N0Br4Bn=-^lmTDf}vQHh_>=x;|}C-H+c zpHbzkn<{bbJlywsiTja$Pth-ijAOhvqMCz@F9}_G{V1rQPOMW|1xL*IR1{M@wXMx-vWYH zl&7X2-T08iU!n0=rGGTd6SVU4r~Z<@y=MKplgc58-;H}#;zb($_L`0oKZpk1;8eRUX)STB9_be9?|HPY%%t?JY%J-IkzPghmmii% zd=AN5m7WVB5}!-+97VqX1T2me*HG_$)m=Tt+M!Bks0%sSljarL_3RpG@LhB*bsi+=Jw>X(e*RO*zb%bxD&B#6B)&s4Pg@V! z!E#=4ROYLlnqS3AdJJlbzn_-`;_z;bq@!$t0roo)t||8k9jh-3K_X<8*`H#~@nlDt*< zy=juf!$>cu+Cw*LZ%@%U0>gxGGhB=#{UKjiFNZa9?@J$v-~PAEsA?yj?w0se($9A# z{@$4qUqfWFv9mfDe)U=JPjZ`gXDQflB=p+U4RaPe5Py0@k@;*K5V~ZyS)Sji}Wv$ zo@zYt-~5Hdwd2b}pGdsrEwa9Dr*?Y>&5PQS99Hc=KTXm%r}16o_ipI;7;gaStCbx1 zyphCjru3+MdEG1VVs9DmL`vuBmJ-*FFCW5-$X`3Y%see|Z?fAQNPNNyByQELb9>E@ zxON`3hUD1V9~{f`ai}kbYwtr86-}@=2xfu?68j zLc>P>uh2e16Ti79J5+6$PQ^}=s-j~))|t| zQj#;OUF}~b@yT6e`a>u^rgjovK>1bl9?)R0oNuG@QR!^vLeAgrLY{lflziq=zff|! z--i-^Z>&rYh!NqeN)Bt*r_J0Y{myq~xh)|2DB`1)+rQM8^c_i0tMc_ZwTJGS`Sbg4 zN_wq5>h?v%hsHa2UAO?EUrKsiCAT~JN%~|OH=iK-CX}xn%I|2xzu6?|+fw@nu`k>< zXaHFL4X%;p1IKc{i$4Z^pQoD9;)$@{6_g^|8d#e030lQEZ z@7l|FmAv{gPvX;Q99RAER~S%mUbK@gv3MBt4frN&JjPZ~q9}#D#DXMv0%lQO4Vg@Ch!)qi`4FNW{yMkJcW33J40U zud}4@RpaLTr4nyO`g}ES*$E$zUOOJuHAq}LzI=aF;_({2(>H|@|1?DAOZAuS_elIb z%CC~o5p5-|9gj9Z!^8Aw$D^mIzAn-HHk``sEjLO3%|~*)c%SfRApyu|A)RX&M)+6P zOFW9!>8ic8Tq*H&wC@=}^!YBvmp5IEFV7#Bd_L2(XMdXi{7&tyEAcOd3c_@rqj_u} z!k>Cd;;XvI@>KLYH%q*T<{PShThn-Pk?bM{5ubGyNk5Y8G(ao}S4!jTQ)E}5#qyNAgy+hcKdd|4Y_a3rf$Zrc#exc2MTm zlkmlvlD~HR3ZZhFL*=IOTSjt5t3ON(mV8!f?BO4!{&GRHKT;Sa>9yn0&lwUwO695K zNso~d52kX1ZZ6zpCC5m=q~=#4?@0O^Z<6^{<@O5{EVhRWnth+f)Xuk%-HsY}WdJPa=8a7uBUql>H0`8Ee~GuGb<@*SZk;K=+Ht|-T}l6Fxa1FPg=;aK_-OXO z#+W6(mhuJFD%^gO=W9ssr{)ijPm%P8uao?hecI+ki65nUnM!wJ8o#1GQ?Wft*IgN~1UwDz#L%55Chk^f1uS?|w6KSbB9p`?F>)^{L|gxi%PaqYR+XV*ylDCtF2 z|J^W5;w?3DIP#2~FNGhH<={d5f7mGLBWYeSoA76bN?a?SDGbxXm3=93t$a?SaY}pM_WVjoU#3~t>x{-}DQT(33~QXl zYBcJM5iz5T31*9VT2hA9Y>62anw*wuj){v;Hp}mve`7Rd#~G(4rN$*E%>lwmqob{Q zy(uxyVzgS~lB^jKCPP46Mn=-KRKr-)*bye@BtFSj1AH0n1L<(aBG8nUk{)L<8=?eJ ziY~>RVoFJOP8^VIPMu~=L|P;m02xiqgmh+?OBf@}uv#GGoS|PzS{6iY0)`@H47#8+ zrKQhil&19AK$to!B`OP^3CU4e(U?QbVxUnbX@E5i>cEneI?a%57(HTKa+E2>U^FEg zqP>kNGL|4CRE#w)DOnGnfEIQ*CZ(h&N2C}GSy86xF;sNU_-fhsF*cBEWC8Cd zNixMi?-L)Fkz}I8MVQK0Y;+vdt|3%!z|65MRrXCEAEVJ?&VYtvj7v>0LaAD2S(2>g z2w-M(C>JUf$Z3i;pOuX)OeAw$>Z~M)YOFaUGX?7~+UlcEO3N@pR?Wubq)sQhQsd1t)RD+AZs6wbC$c1Q+ z*yT+#pcTz9PK8E=iPQTI7dag%OF$o}I=gXdW~#}Wlm@-GS~(Z(9*Qg=%WSfySt6=a zdeF?G{f!30fb`6aM5rm#3`h(hm~cC1=vqMMU5?IMb~tSggQl6Sw#*r!bj=xtEQ7!J zAQ|g@jN?V3MdOG-$paDSAp-k1*a5?QRQuQa8;z;vS;n~J%Kyq~-d@!>F2ClN^1` zsR>$stg2X783Rq$Wmf$X;;eC!kG2+kcn48qslB^hNpU1)8&H@c*M1|rMzqy8B?-scu_I!PFw?P5 zb^?si=|&TbG*)wh6gDIIti{JTG7aQ)dRlUlX|}-!`!)nZgk#(dawQl59}r5Hnun+ZC0VS76>;5lA^W zsX``U-Xf(qHx)As?HG`N$|=HOn~K8l>i05yRr6Ok-2*?Er+WvoEP3IerOKBdb1;Pu-1KN#_-fV5=Mh zr41A7kEzd4$!C*CTTX1raJe-(Uy)z6 z;tSPRn76AJFO_MK^D@19@lt;O@pvh}{{K>boyLp(UGE#336towRM6X|%BlT;s5lGg znLxSD2LRi`6yIVbYLUYQ%;lIe5$1%{FA4@xmr=`aD;cX|WfKyYTm${NnkB&+UZB*nxtf@2m2fJ}*oJMdGIst3lnuP46T)bM zV5clS4OUc~%nnLQy>A9Cr_5u`Gc(N@)+oJR?k0_oOU^Xot|AH&5Jd24bTsxjvC}BJ z)^M{mBGRVzGQf1$Xya}OONR-ecpbJmT}lzx!cC(k9s_GY;HLMZbU~kb`$_;+g($YwyiscX# zmNqLjIV~>1bzz_=t4y+LuF$Z&n0mc(u~XZD#5!(ExvnLb6)V_pSQgxUF&6OQA-%xvD7p z_OiXOFV`BQvRt<t0aac0 zP1CBs4>b^i<^jgUB-rs$qv{p&v9+42=10|3HB#UUMS+G6$u(FY&<>+aV{F=+s^$j9 z;!#G}d^3_|7a34hmCY4Y3vSIOB*C01!?sgg)!3m*#=sIs%$BO$KJ@{R0PIILBNRDE zRHLbjz0jl#S;uOqscL3y{UwS_|EkJBq{0-J9%o9j&K7n9)fjsQU{jS=fz@mh&@ib| z{y|GO!)VBTjM)Nq187b}&GKJNK()mT7?fq0Enr1i&EkjcVtC(bNTEIHYBXmD>y4_m zLa2UFDyvSZ#=&Z|MBBVYk39o4CSov%ONZ41O#UGbvHs0cvv`O>MP?t6UA>CNZwCIV zcDT3OIN86!NsN6Eu;X$@!QKc|=5Y9i5c!pP%`QqSV2x5cK^6trYZ;zCB( zmKBgav6YGyg#t>-m~@S>gbj6L7%XHhX|p4upurikz+gvhDA=mQ9vf^Ljxw4pabPGD zXEmZ_7Un?8Z)fB_W+=fp6Iz^@W<*2+E!5jsc-U$knzyqT(KrPsA962Qm_I?vgenUS zS;5d5ErGJLjbL#Ny+xRJLi&@yEE4|H%CxFYpV^4V`O9CK+d$hP&2Il&gG`y3GNjZy&Sc6=$xMb384S;>)#qR? zgLb;c=mAEld#whSxM(%;mRlJ<(M~NUp_FT`bgQ@Yad;PGOxas?yGQ5x_8((uc8^IhSs8V7oz1$KK zR}+zK^p#t}IP%q`ZJW)Q0#-K;CLek-`GAR&Q$Y{5oH(Nz0G0#MVKi@KZLOkoLY!n@ zsy9|+gfdiU6hiqxqY$Y?FklLYshMp#^E6vx{^|FOT4(4 zM>-QP4ugX;)4d9pMNVF*$}quRXA2Q%4o+5Jj22}oDvs;}hC?niR)7^|z>&5pX(#i+ z%MNkEV6l9PS(~l;v=zUbEcMkAsP|M;nbiu1v1 z`~OPW*`^t_EWxVZ)aX3B;_8Dw?Qq-$+8nfD2g6uuhH!Kd4;o*k`F4$@vf_C+cmu&SzcRrWpX9z>7U6}O-5B=u6%7BO6)3LjXqm5QP^@3 zNJ0m8=PHmddYgRF8(qkkD`i9}k_zUraQa-GhgBlX$v6BRzi@eC9rl@Vx6$D(?RWe= z-&^q}9;cCMzT$5ML|M|N!B&5U(-+Hs%inc8?(2|H%~$L#AMen(RFgRwwA655#96E^ zD2NA+t#ZL7_EhBn5)ByuZUYp%44eu2C77qi!4LwnH5tzEM8Ne8d>p}pqsR!^$a|Tp z$_ov5_@x6^k}ka-H@0O;Ej9z7a(Qr-L<3wu6=lDl;!0AY7IdPSdfQGw*=*R$;kJso zk|PJ&`4OA)O9Knlyd3laSGbr!&f2*eC=#`4!Gp-ERIcE75X7eCTt1hqrvyUR%uceO zYQ=)LVT?{c010P1p2SkcC2Gqlfvwu~zL}|M7Q9Ff?#%-0e$Y@06CCkC zEvCA+)Jaq}@rS$bI60K}qRNkH5m6?%`@kFT^h!@lLg5GF9Nd&zy&eXI!FT`R1}B>> zJ?N`!!n2YWdj{F8uIZRjRT*Frn!v;rOghJ=2y>!pq(W>XYmXUJgHKROTsGX1#x8Ix zxAg`$L)dDos(E!%^svn*j7F{*{QS zJO9Jky@IylOXeu@CSP$&DBj^K45g~q^TEDem=qgQ&_Z7IH6@O&WT22OG0_Y+5W)!x zn*n~!j^1e4EG*$sR*>Og4JBUm3CSGIpW1E~p!U`Zj>7HvOVlY=g17^Gj z77f~gKiEaVUWT;Rh6<^XSbSucm)TPd5`?2-ZXfboR%3Zm$Nlp1-`n@{%atRGuc9ht zWDYqH6$C@OlL~?z5ZJbqouhn`;Fydybb{!ZpMwgCeb zKu#|Iz0CJ|Z|8=vwk$ftUjD#{*voY|^Wo%8n9{?Y$?B|dxpY=XI@m@^XlylQ(`r9R z04XY8oMI)TjDccm1CimTHnReoEX zTdMYHSKO^Lq3l<3A6B?{dAu+pg{xtVX;Vq-F*U^s1J4}U*~(WQRFi#|yvArX^ZI;+M~`&8V=Jq!x{0lg(5AZzNWXUkR49bh)`*Vfof< zQ-gVdK^#IAmjrVSeR)YLv^02mpo504LOMq&0rFg(yD0Y-Xho&rifoKEYZ>UQD`9S2 z*>>6z11YZ700JGvrBws7nPhcYBgQoq<*8cvu&eSM_7W)h=IrgWT2Sf18Oi6Sm1 zAcJ+9C&W3OB=zwOtjg(dLMnaANap zC&Q_P5`B<{a#JlW2fo|vs5#P7qWnkuYE4|W5!a3j#gog|%k6mBCx(?vfJ=pjh*D#_ zZDU!ff+6#5R)Dtm?U|}Dh6;;A^Jdjb!trH$Auu6W^_>tjNT^wx@rqZ9%nX(+%d2PC zP}8ZdaK%_#6Ae8MZq2B0s~wIKAuvGvVxK%o1P8lA#9h5W=SLcRJnW0dj^yxE)eJE! z0a^(&iyWIRcuksU;~WmJC$jxy&()5Qq!Ji^LES}+Oaa^SDA8Dy^+qKu4-H`L0qYEF zCfvJf1dGHJFjb0}fOjuj{RJ2i8I}$MBn-0h(AQW8UFDUTD$J)#Kxua7C^RFYHnO!%v5qYX`5*mhq|6(KrwY7;Aly%evzv>i&MN9Q`isKZr@cGxK@4YB(7f)_oSi)x!NVwXr8LhmS4zP&U)Ea zu}-HGw#uobK`l(W9ZW)C&gDEC%s#4$CP#4Nd=V)(9=jFE0eJ5FhqSe9=8IG61Sv88{>b-lF}h!ns9@#2Mw39uQbL*L{%$qaIq_8 zk6lwZ7JgU?M>3Fis^IMXu@cn=ovfltu=8?Kq}8&0tXu&>ywE8jyQmYA+4U19l1{SA zj1Gkzy50I0c*s%SRy1~67j~m|0=}UJnI~y0whTa`W7@>dNrjf9jLsq7!gLh&NSv6C zLblSpQcv{4=I^=M+mc!2Psl+=g;J{^ImmTnA|I<=r_`Y&JIh3uEMN@9b9cmHMXmC zFcuY?zOF6z96E=Xuu4lh)ui!z+jba!Ut4X{lo``yje%g+rEZRzVTPM+_SzGnP!El|RxI$W42G_E(srm+IZK%;IZ*bOzM8i;80~?$b<)m6em2;!nTGmV* z3{tQ|kueespS3Kdcs&UIw1hgw;mmGE?e|wGII35fVt!?Xiw=~)LSZhhU6K>43aoXm zW~zh;bZJC{NrRe%m0UDzk(#Xf4C__3*Me(PgsGD(5?fixEzN&>wDM6Wn#ni|E~&86 zWutKU1m1B|K^=mH1g_$1WyZupoibG&Q!|{A*y>75QbfCs9s@r{&yCE=%@svAV|Hd* z<%%@fDmSg+Z`kKH<)@;8J=t1m)HW_S6LCdMA+L73x~p#E!n9Gg60X)JUyU1Ji3P@G zr_wgVpxT!D%TB3f%AvO5xE9@IW;Dft{HxZ5W@v0;+jU`AGP*Lu0fFlyj$q>TEueNc zkrEjez|dQb32DZxq>LnML>8Xet_tG{E@ShvUB>3;co`e20?EF|FfJMTw80n&Y65mM z8=Mst2Y}^|%2RUj$CyALF?z(fWVq3FjsX<&2K=C8Anmx?O9R%pXp5C9EP9~Cyp7Pv z#7&Y3@M8;LaRV2&T=pVKm$~4@I2w}gtknFB<5KZwF_Yqw;i7{C80+kJV~TBZ`f)%t ziEzRLgq$);ax5dpN(d%)&1MB@w%2^kRkX`nJ$XfsrkXY-N1!4H+F%^q4G(q4#W61* zrCM>3PEon3#w@Y(N*BCg4a3|U?-e!1SuAnzYhlB(#z2z>+*Qx0pcwsa4cPy(4cM`6 zKwkx_Ojx|2lE4rN9{L&lWS-SL4K5VPz@O!YOY$O8BGJ|ioDd4w0bvIyD{Y3^05|5# ziLdOR5;a=>&Hm{NS%JFXm!CtHGDM0^;)*4UF)IS<6m*$r>V~RA0|d$3Z47i(=)ty& z_MJ3!)?eWiLT%`;jvY(vhg6}*;!z4N)hcLewZ6xSYrmZISjQ6jAL+CD|0{hKH;VqT zJ_}2~TGMCcHPcn?u&8eM|E0r*#+(DER(g5ek7dC=~wBE%tF~j~nM#cKN%1Qfh)ZTduLiK0-N7L3LJ#6|Q>W_nngD z)&P__SjM0pf~@Ru$>;KP5h#PoT?#H%%LY7L3(^SoM`FYgBXLFq&lg3)Qj?ZjVl_=? znDqbb8K#=k$DwtTXsB$90G82e4_15)mMOThu6R!qD3of*wo46d$!LThZ8B*q@{X^4dDqH%Kk0cHE$3*EQLCVs$OPof_XbBn`9{C<1UR z-F6r<+H4&oF6)M^L1ki1;|z2RZUYB%aa$TIEiK4?(e6u&(XW6V-NwHO7PrRvufVQWGB9}52{H`Ieb85ooBswTmtxa$BEGQlLxHQqljKZ!EnR!YRR45p*w5-qs)owNF zygazsDNsn$DJ%utuYu}T7OOS7?+MM{V8EsaGcP7%uKKh@$d=3ALnuz@;2dx?%0L={ z?A=0LBUc@H1G6P%?Fzl7+?F_CHMzYkH{>*%-yycc1XYT@<_(-!NnD{NAG@U!RRp&A zV?}AUPZY264SY_=J#8&J+bORVsjuWtIY@e^R}o!Z<0TiSCp15(Weve$;HhP46Kf1{ z^=e952Al2Is-6UUv_`P=6_>->%Fk|aM73TS+h1vDCQd5gTS^qTXij*nB2>?C04q%C*b ztfU%Kc)5gdc`e!1T+~z?HMB1WLv5H+s^y&0!UANtdW)Nilcy>Sl3As7N6lA}*3LLo zEr>2JhkU>q&eeER>9@;EF(Derm`obS{fm~JXgLOkV2~zM)d&MOW12P5Y{3bSwCY5O z1@dZIYNpW62N+?IoHQ*JezG#foD!col`bJuza(yO_-$6~@5=g-cUl`J`)#c%6Ex4L zkuo7u4qhO&Dx;{EsgaCwYXqKKAtdZyss>=!=LrH3;P6B9O4p@ChZrerze7)Gttvj; z{;fpuL7E*l2CI38A@0s3!tYbVv|g!`wVRiE+??~%{PwaaVw;BD{xi*J`dY!pr9a!a zgf$bJc2z@0t2NgMsoce6I*eYhrKKIc05ZVXQLB#dI!)tcbtbkA#qvX;C|KI@u9-bN z`~1tf$Od^m6|R$mh^xGP;wad$NvM=x^?TIBJ=tQ9s+@lIA54XhI6G?Jk+W@@sVlBv zc|x`LKXvDrm}F*Vm^0ufBU7ir6{~Wq(%@>RQZ9l1$%?~1%66CeR%!)1sm^Au4qKQ| z+n4!OW_x!OO`~c%v*lM8myJ&io~(OUcL%qeTyw~}+`WYzKBz|d3s>=R3G!fv_+>YF zGm^Z<19~r~Nrp{8{33N0-cJGLf{S7L^*>`;{B$^b3YXMWM?&G~LVLV;tS<`9a_rk> z+HFz$r6ZNv5N2DCFrGW^?~2P$ASdNEMj;M77Ug&}qbfV2P|os7Vi@%0f4(#7T*lM1 z+&1V|t0-}D<1m$j?73W7<6O^8;Vh>`9W`1zI{PC%dw&|t8J)nryBd(r!z!bC(Rw5wQB3d!932^ zUbGry+ZVM%5z8zaqOIncqCNe?*FM0(KslhZH-$R;Z+}-UwK+g41zq ztS}XF0d7-|;W|DpA%X0!F8?Mek*fNdUF%{nIKEr4_Qn1q0UCol94#C*HLj;k*hJOU zZPK1vzG=vUpY2vRV`%1M&QwA6#DIY-=stv{qc}3|(n?#LV_~`yKecnA(ZPTXHjFrx zR+h*@B>js&@nrpwO}Hyy9_^V@_cN`D_1y|KqE8&NxdL(Tsnd*vW&(+D2X1V2TKCA==4NcDPx~pE?<#i2AxK)(Ze`>uY z%+$q|A^2-}WV2k`(ugfm{QjOL6Opdu+C1u1@t{W-3#I{ix!Y zR1cHw$&hM-0!j$Ugzd&uYZCnS7F_ybS72R!dSIux-1YZtZei=@Am%PV!?96_80t?^$~cnzsa0#1*7lFaI!am%MG)tsb8iv z)R0w?gso1G*UtGz{A=l`%yi=))GInY?s3&>LH;H!UZn)46LC`M12>CVO^Jk9%tCoi zA-J+qeT#Og<)@omj%f`2UEgvCQi&ZLFVFO{Gf!&u|6Us^ClSicS$V-I>4|+xEIUf$g$zxUXAm$f_R{L6Y&KVG54cHgWMu zS$h1viHsz;QY|hcL;PAK=t`!hp=vZHT4dbD+VMTycX9nvMG1h$=bI9jUa@+qI&ul7 zG4jXtNRzH+v@kl#<14DJ{=EcH+tB+Cx1?pJCX7sqx5Qayt8{5$L2aCtoo$3)Y0F51 z--k)E&NgOw>yne=q5bvCNb9G^&l%PPQ=dK<48UND?b9@q$(UgyGf8}SXsFS*pSN!K z$cUk#MxTDZKDLj3woiKdN1uNF5}q&t-t)83Q_#m-7dl}=$j}I*zMpTu0S=@-ddJ`Z zM(Xg5FC|Cv)Pbv`t4qEfJTc^^t1tf56`wI&SJyz-5HNS}h&B>`>*^Zon!qPFLD5v# z48E10k>fS+S@Ofb|NZ-~1pX_5|4QJ$5~%4CKnY$)H{q;K=K<2(6MWPSvzzEZ{-y(l zt`11zsq}pmgf~C^j|vgAhG90EH{sTt_@hH298P56expanKV?%YiY=+0Ocyk!O zfZ@3eKhOB&G2D~kD;VB|;rR^T%F%4;rR^T$M_U5d>*4OWOxq4w=&#~@hM{Xe1`93_zcFU znBkLIeorub2jf%1@I?$i$8Z=RY_5#qeObI089tuHtNTC(u>B`8+@0Y+GCm#*&#=X+ z)3s&z6O7)I;R_k=#qha|k2k}QF+7OjBN(4xhVN(e;S7&r^id4=VfX}wKg7x*mf>$O z{)r5~m*MFQzr^rthQH1D=PoNK~hQG|{S1|l~hUYUJ$13Ft7=B2B@GN9F zwh867GJGWCU&QeJES-B9K9kWGGyENfpJ4chDpGisFnm6vKgV!2*TL7y7~Yhn=OV+` zGyXan%rLJov9mdMhIeLsJQ(iF($kjVCL0%>&XeK27`+$6cQbl#hBsz-5X0YL=?P}I zC*vQ^@TQDU6vLw#p9u_y39!w@GW?Vc1zExHx{Oac!v`=to8iM*I&&DliqYpXJcz}c z$MBaJ{R)P!X7u?Ck74u$48NVx7cv}Y^2%*x_$md$vxwn-EMI#Weu3e|3~#~k6AaH| z{7V?#kI|oF_z8xWG5l$k{)-Hs#Q5uuNFr?iD;T{y!^boJ9t_{d=-V=U2*W)Y{veCj zi{U;D_h$HQj8725uVwVX4DZY6!x=u2(MK`-0K+FRyg$otEW-~mJdxpiJ(A9F50;*6 zhL2!)4#Q`$^yD%;n9=7kd<#p@3Wo1u^!W_Ghw(39_^XV*km2na|E&z~!tf%7k7NAz zGCYUj#SFie@j1cpi;TX6;g7R)o@4lQMqkG8J&gZFhO4!mc-^1{5 zhCj{tM=^XL!zVC2iSdbLcq3L0i41>?@kwX+P=;qSJcjYfVR$P>pUd#MEIoM)pU?0W z3=d^|@)^FJ;ROsI#_&RhKg#f}3_r{8B8K;5>DkNh-xz%{!%J8>oM5;c<5R-$K!%@V zxQX#8V|ZhRUu5{ljF0Y^3}E}ep5g8c_hx)N82%i?+cNwshI=x6D8s!N{xie989tri zK@4xr$}^bZuQ2*>hPPq#Q4BXSd;-IpFg~#iw=()fhQGB(dGHioZY_*aa7KEnqyynx{c8D7ZnUl{+b3@>E#MGQZ{(!ZDC0~mcV!@p(x zPcXbKqc3520pov;;omd*GKR-9`il(zfW@mLScbP}cp}4t8J^DY zDGbkM_$Lg{Vfb~d9C8`{D#P;_-huI1!SG)heLllyv+^lm_)Uzykm02a-^%dMSiD6H z@5u1I48NY?#SH(6;U^g0iN#yO@EaL^j^QNQ1-CMWuV?wa$Z%hV>rTi3w*PhvcV~Dw zi`RqUi7fqX8D5|9@nm=cXZSkCzkuPL z8UI3t&t~*n8ScgKB8HD+@$O}~H^Yk=Zf5uihA&}w3Bzg2R;2bE!y7UBGKQaL>AcAB zSVph=NCvR|pJwIY&hXKU-h<)C82`2mZ^>{^hFcl##qh@%?#=L{3=d-X9Sjd<_)?b6 zaE3q6@F<3lV)>oG@R5u@mf`t~K9S+QS$fhLzKP-44EJLEa~OU*qt9jdEJmNl@Di4u z6$~H4=<^x=9-}W{co@SA8U8B6w=%prOJ@3ql|1IP1&hTE0-h<)qv-G!R_*8~_GW;{f$BW_H8Sc&S zk6C(x82%2!gBku3!^0V_XX%Mzcsh%B0>jTS`dEfXGyaJTpTY2ShQG`BWHUT~(dRJy z9K&-NZeZ!mWB6{ye+9#DVR$~n%NYLxhM#2gg$%#Q@U09##L`p5@CO*am*GJSFJ`zu zOV0_0C$o4<7#`2)&oMlk;bjc(&iGtp_;8jU-6t}D?Y|+z-5H+7_;@h<4o2UW;W~zU zGJGlHNoM!($m9%W!{|oKB zPiD9W!yB{mY0L0sES;VVpTux4hX2g?doz46qYq+ue->{r!#`&9;S68K_(w6ki1C@g z@QDnMW%wY*Kat@>8GSm#7qED<8BVGQ@of&nCo=xI4ByH4=P`UPqhG=B1Qu^T!{1`` z1q@GOcp<~TXZTiz*I{@O!?&_{_cHuph8HvZ8ph`Y!*68yEn#?1Mt_dujDH!!UtshX z8QzTHI#Rk}`}bme+!cH?ndFV)(O+PcXwT zF+7~%wDl)qiDI~c(NAFbIEKeEJdWXs41bcPGo9gG7@p1W4vbF@!(Ui_cFXU<5SG=ISfC+@Yfih5{Aby z`g08L!^*Ra;hh+tiwqBBd~}~mB5eO-7$0|r_hIxN3~$c(w`KTDhI=ynG~@5Z@KX%; zX83RxZxF*fGx}hLKf&n38U6>Ok79T>OXmcJ|HX^E8U72ya~Ph&@LYzMu=2@c_)3(;oVqziW$C((Vt*=7^5#?_*)D=$MCZ(Uu6v6!RRkCybYt*QQ>0ye}m!f z4F81T9t@wt@U{#$GTf8lPcht!;kU4I@MgF>qYq+uF2jQveml!=IK!W0{G%A&gYlWb z@H31)mf;zUK9S-37@p4Xrx>4Xh975m4#S^f>Ca{OAV#0Z@Gutd3Wk5m@O*}o3S4k2 zVE7M=zL4RsF?=h--56fP@UaZv%kaBczKR*1#qxE6;g2%<5{8duID7TKkN=gxeV)$ANm;D7m zk4OxAV7Nqthhi9ynw1ud@IVZ=z;KZW`(PN4kd+pSaBmE^#Bja{cf~Lsbt%mg;r1BD zBMqfFBHRMQZ7`fJ!i_PECh?`QB3u{4XwqF8CBnbM_Cq3?W|szw@C6K`X>_T#2%pC= znkJWeituR+qe*h9hX{X+VKjLy)rs(745LYCY1yBc|NR*D#BhlS@5XQ!3>S;=HVk*g zaFGaa#xR$o4i@1H7)F(0skaE9$1olV zEcF!O(-FD((_ zp%_M$b!o8(55(|T3>S&84~EfHu(VKwdt(^45=!$$xGRRoVK`5O+hceu%`&0#_$vjdx-GI z7``3DIuSmMVIzjieiQYN;aCip{6F^2KfcPc{{M%;6baozFha^BnE{%PAHqP>sVomR zY9aJ71Dyy8h(Ium2y`+q4r8`Rj0|;=8Syb)q_hzAh{Rb&If-YRZXeuy% zSo|yEdBzWlFBOj(-!HyQJlFU>@!P~B#`lQdF5dEv^}l$Tc%$(h;&+JG8{a0rTs&cX zi+H(sjq%OmE5xgfZxmlCUS<4V@jJ!KjIR~{s`z~4tHoD|ml$6z9v3e*zC?Vrc!BW+ z;uYd~#%GJK5sw<5CSEC?Yy2AVyTl{LCyIYfyyb1{fAK2uM&p->e_g!Z_*n6^;tAu! z#lIn5V|=Li-Qv~82Z^r}uQEPB{2uW#<9)=xDL&tLFY)!_CC0PFza?I5{0P?tXWlDb zVEnN7x5e{}9~9pp9yPvS{66tqin z6UMiQe^0r;!ld_8s8`Wlz7DW9`UEeTmEYOFP;!@G`>Up8S#4K z+r)Q>CyZ|qe^$K4_-65);?>4CivLW!%J{wFyTr?kuN6;<&o{nWyiUBt_;T@|ix(ST zBL19sf$;_6zYxzeK3jaZc+~hb@n4GP8ox&TSK<-l6UCnwZ#iuJFJ3R+X#6tq7sTt0 zj}_k|o-jUK{MX_&#)pdU6|XivNc=bARmKO1zbIa2ypQ-x;`5F75^oSMF`gyDC|+QEfq1icp7Gh@hs2}Cr-}brJlFU&;%|sYj87DQQ@o|c`d_?7ywUh&;(rmZ zH$GPUuz14waPhy2*BBov{+4*P@j>E$6R$EpK>Tg-GUI*3-w~g0yq9>Zc!}{W@&6Go zHhyF@{D^pg@x$VO7tb?(Q2eNP)cAh!e~9NA-zWaAc*OV~@iy_6H?9B0_3Cm{qwyW$ zx&qu(Z+x40mUzPW7V+-lHO4oK>&ie=wegMO+2U2k?-f5myv+DoalI1VG~f7Yaa{#z zDlxuX{3P*W<4eSQi5D1OAg)*VoAQj$7S|R0rl|30;<^IdlxzGNaa~1jiWr|Lo+IA! zhV{RAu6U#I%f$5xSW~_6vEuraRa3(FaB;oL+*D(HsJLDUY^pXsNL;UWG*uZNAg(KZ zO=ZUWh<`wQzVTk-{l!a+XNiAMyx91WQSbrc1;!7HpDvzf{Gj+i@u>0r;vW*vHNH>$ z!{QO+d&JKWZ~3$Jzj#!<(fAJWGsWwTZxbIRo-n>eTvwf&YK(6d*Q+>9)y6l9>*`HY zmGOJU&lWE;zE)gUy_@D6UoAdZyu|o&@gd^H#+Qie6~v|j;|s)fCAKNg_-yfW#iPcj ziGN%?*Z4K!=ZQy*PZU32yycMfzqmeu(bQ=CGI709)>LnNtoU&8gz@3x`ZQisjq#!4 zBgLzY4-(g_G)+~;2Z-~d{l@!<)5o;mcrS6rJnc80CC(f``;8wVubKD+wBPt)aePGD zZ~UM*YX;hHe7`trNZN0FpE!F8wBPt1arT&Kf3x+!xIT^0)M$K%_@(0Y#ne0p%R%dZaeYFwsnPgl;(EodsowZl zab10CN*Et5ewBEQ@uA|A#H)=D5}zzyWqg46=fum5_Ywau@%hGkiC-;VVmwRy^Ww$E zkDyyKuMsaWepvhq;(5joicb-b8s9HIRXo@DKJjbCBgXfLUnkzuWc@E*BHn0xhqzt^ zXsS29O?;Yo!uS^P8^mjjZx){}UTu7%_zdwX(>9`RpO1t zFBAW|c)jtl;%mhd#)pf4L%hcLQ1QFPtBns5UngE=e1P~p;$_DBh<{UjzVTk->%~iq zXNiAHyx8~==AN1NiWe9^EdFirJmUw&H;6}#?-##MJlFU>@%zOi#`lOnAl~vv>wocT z@kZl2#J?k6Z+x5hM)8F4E#lu5uQ9$^{6X<*;~T}lCthXzUh#*-%Z#rT|GxNq0r;!ld_8s8`Wlz7DW9`UEeTVAvN z7f*;c8s8!QjCj5AZQ?t`6UMiQKPz5ie6#pY@oM86#eXJVW&B?8UE*cN*NP{_=Nn%w zUMF5+e7X3~#fyzE5r0m+!1x03Ux?=!pDn&yJZgNJ_%FqCjb9`FEAfc&iQ>o%mD&qshUlcDh-bef;@%hGk zi8qLs7|#;_t$4BVBYE(B;swSJi~mkM&-g*{m&K#T_ly5tJlFU>@mItn#`lQ7D&F!3 z>wob^@kZl2#Qz{(Z+x5he({9yE#j|<*BIX{en7n1_(t(RidPxGSNwJHGUIE-|0F)& z_-gT#c!}}l;!Wbk#+Qg66fZEoK)hKz&-iTdL*h~6)5QNQo@@LX@i)XH#wUuuDc;g( z{V(1k-e~+X@xO@I8y_ovSUh2TxcFbiYm5&Se@ndD_#pAWiB}mPApW*^nejg2?}*Pg z-b=hyyu^5x`2UC(8$WVB{D^pg@x$VO7tb?(Q2eNP)cAh!e~9NA-zWaAc*OV~@iy_6 zSFQiWBU$i9<2%H=iPsz7CazClHzka35$`TuV|=r?K55ugZG5A+J`vSaW&B=oeIli) z%=lVyeTt!JzVX%KJ;h6mFBjJ*f0~MoFA>+P=uHL27l^-4JkR)S@!sN5>fh!+??EPlFpp7Dd?1I458 zSmh`F!h=|4ww}kvw3hbcD#-mGa#ul4YHQ3nql~?u$g>_2{~3#a!8XB=cVqFE*fVcj z5__h#d#u~8*bDEL_9cTwUIsne8gI-wV_Z7D?wgc-VkK!Ki$+Y2m49OYK>m!y|5$o* ztl|@&<9S=ZdLE^2K-Rmmr|_WL)MsxzFXxOEs)p)O5VgUfYuS+Li zI_av|9fxFTWAP{ZzuVRpf4ndMKRs5_ioIqznnV(;?}Cbr2r71c zx?=Ye!`1fM^uxFwR`eU5uG*KV|8Z39W{J{OEml$7Ggi4$H&(pnoyuklPs;S9a$P9k zN*CasBvZfmi%MTvrFfsvvA}Jo2J{>X$hk{<hepb7K(OO%974XxinqMK~9xI*`CfNi}CTDOGnxx0Jji$weJ&F5ssE9xX( ze(0HB;m1tVI#l5I_BfeZN!O(6Mef+C5&4Bnr(8O9svD^Pb?N8)!P>Kj8unxgvBV!g z!2gE_Yn=wG9(D@`>sZbSQRV0R2Ug-?)_hNCfT`JMsH@@{tmi1A8=0$#!NZD`%E~=@ zhl4V*iCQ)`SZA{M0E zw<33{K&#keis)+b7nW=8;g8Y}U)IBlek(r^*pcVR=s2qOc=w=cvGPQ2X7xVqs`pLH z)oe*Ah{>KLxUsbjnIaM! z(eJ9S+~Zib&P>#+KW8MZNaU>08mp-Caou{l^l9sy_+N;u{)xp`w$LY4RbJ=BDhkMc zoeQG9&!_gHi!K#Olm$uZNfJx0YyhmID%_Kbb$SwuKSNAi!Sd?1#o2)pJ;53oRH^}9 z_yTA5T#97s*O>oU<$YFE`Lj{K)G^PNo)Rl>j>h7zrW#4n{Cd!YWa@TJXEb5HGEW;z zN1d_!nuJoZ&K~&Z^;P# zB=o&?PKVTy=Ikd-c$F(nG9>;MH7Wmlx15!y640cRJik}a%UH$L>UgiyT3x4kJym(~ zi`*k1)K$YYVxZ=Hzgd+oV4o-Pyq7G@^+>;mEp4T1k)_QIg;TF*LLCU5W*y}9a58n3 zqrL>jIqK?}O#Kn{sd{gTG=HRh9LXlrh-l7mYLiUe7B>5JA+tYOqWcv8=UHs8n{J~T z*m*s;;;Eu-*3tQHHAzjtbDul?4tOQTJ>UVNPX;?#_aKx15YR# z^VhVBenPqYnOvH5gC?^wXDZB_Qhc$U9C~K`f}rDUOEgb%Y5ixCr=QmKSTglO=$W72 zlc8sR13r&RRQZX0Nsc6AaIV)Dv|4n7S61aMuK_ags zT;-lpO4kia8+5}ib|zH$xtvg%BDnOg(w2<$w{?;JPA~m=q)&ZWq+)8T>w&6{UWF!( zaG&5v6jlB(!lL5|%{4{wrsT>4xS9M-zx0baqoXID>_=0~gvuF%G1T3XD^mn$7!&nu z7gbM)S``0N>LM)V`0|}z)I$WAGg8^FyNjwPUex!ae(9(!1TZHm*WYuS3ZtMWUewpw z$r@i-be5OxTZGswS=n!^i>oJIWmi)JYZqCljpO6HE`2)Na$fnGMO)blNLAJuuUxqw zUKD?OLi~SN9`-u3TV#B^p82jQ{#@#)>4cXsnff@2M8f-&aqNy~b&ba>Cg#m#gEf=w zVnApn>sJ_M6jf$#6;zzuc8bQ7&A$hJM+Ozy>+DG~^)pkq?9(h>zuWEUiwuL`+g}WW z9h$TsC6V+{L)zCv+8=59HveZPFsSGXgj+Qs{(4d6_e=

    6^YWtv1FlY5^0`FrKvdPtQ#3l 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 LYpe&XKO_Gi8YYK} literal 0 HcmV?d00001 diff --git a/request/README.md b/request/README.md new file mode 100644 index 0000000..12d185b --- /dev/null +++ b/request/README.md @@ -0,0 +1,13 @@ +# request library + +This library allows various web requests from within Ground. + +## Functions + +### fun -string !simpleRequest -string &url + +Makes a web request to a URL, and returns the contents. If the request is not successful, returns a response beginning with "Error code", and prints it to the console. + +### fun -bool !saveContents -string &url -string &location + +Makes a web request to a URL, and saves the contents to a file. If successful, returns true. If not, returns false. diff --git a/request/ground_lib.h b/request/ground_lib.h new file mode 100644 index 0000000..7567cf1 --- /dev/null +++ b/request/ground_lib.h @@ -0,0 +1,193 @@ +#ifndef GROUND_LIB_H +#define GROUND_LIB_H + +#include +#include +#include +#include + +// Ground types - must match the interpreter +typedef enum { + GROUND_INT, + GROUND_DOUBLE, + GROUND_BOOL, + GROUND_STRING, + GROUND_CHAR +} GroundType; + +typedef struct { + GroundType type; + union { + int int_val; + double double_val; + int bool_val; + char* string_val; + char char_val; + } data; +} GroundValue; + +// Helper macros for creating GroundValue objects +#define GROUND_INT_VAL(x) ({ GroundValue v; v.type = GROUND_INT; v.data.int_val = (x); v; }) +#define GROUND_DOUBLE_VAL(x) ({ GroundValue v; v.type = GROUND_DOUBLE; v.data.double_val = (x); v; }) +#define GROUND_BOOL_VAL(x) ({ GroundValue v; v.type = GROUND_BOOL; v.data.bool_val = (x) ? 1 : 0; v; }) +#define GROUND_CHAR_VAL(x) ({ GroundValue v; v.type = GROUND_CHAR; v.data.char_val = (x); v; }) + +// Helper function for creating string values +inline GroundValue ground_string_val(const std::string& str) { + GroundValue v; + v.type = GROUND_STRING; + char* result_str = new char[str.length() + 1]; + std::strcpy(result_str, str.c_str()); + v.data.string_val = result_str; + return v; +} + +// Helper function for creating string values from C strings +inline GroundValue ground_cstring_val(const char* str) { + GroundValue v; + v.type = GROUND_STRING; + if (str) { + size_t len = std::strlen(str); + char* result_str = new char[len + 1]; + std::strcpy(result_str, str); + v.data.string_val = result_str; + } else { + v.data.string_val = nullptr; + } + return v; +} + +// Helper macros for type checking +#define IS_INT(v) ((v).type == GROUND_INT) +#define IS_DOUBLE(v) ((v).type == GROUND_DOUBLE) +#define IS_BOOL(v) ((v).type == GROUND_BOOL) +#define IS_STRING(v) ((v).type == GROUND_STRING) +#define IS_CHAR(v) ((v).type == GROUND_CHAR) + +// Helper macros for extracting values +#define GET_INT(v) ((v).data.int_val) +#define GET_DOUBLE(v) ((v).data.double_val) +#define GET_BOOL(v) ((v).data.bool_val != 0) +#define GET_STRING(v) ((v).data.string_val) +#define GET_CHAR(v) ((v).data.char_val) + +// Helper macros for argument validation +#define REQUIRE_ARGS(count) \ + if (arg_count < (count)) { \ + std::cerr << "Error: Expected at least " << (count) << " arguments, got " << arg_count << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +#define REQUIRE_TYPE(arg_index, expected_type) \ + if (args[arg_index].type != expected_type) { \ + std::cerr << "Error: Argument " << (arg_index + 1) << " must be of type " << #expected_type << std::endl; \ + return GROUND_BOOL_VAL(false); \ + } + +// Convenience macro for checking both arg count and types +#define VALIDATE_ARGS_1(type1) \ + REQUIRE_ARGS(1); \ + REQUIRE_TYPE(0, type1); + +#define VALIDATE_ARGS_2(type1, type2) \ + REQUIRE_ARGS(2); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); + +#define VALIDATE_ARGS_3(type1, type2, type3) \ + REQUIRE_ARGS(3); \ + REQUIRE_TYPE(0, type1); \ + REQUIRE_TYPE(1, type2); \ + REQUIRE_TYPE(2, type3); + +// Function registration helpers +class GroundLibrary { +private: + std::vector function_names; + std::vector function_pointers; + +public: + void register_function(const std::string& name, void* ptr) { + function_names.push_back(name); + function_pointers.push_back(ptr); + } + + const char** get_function_names() { + static std::vector names; + names.clear(); + for (const auto& name : function_names) { + names.push_back(name.c_str()); + } + names.push_back(nullptr); // Null terminator + return names.data(); + } + + void* get_function(const char* name) { + for (size_t i = 0; i < function_names.size(); i++) { + if (function_names[i] == name) { + return function_pointers[i]; + } + } + return nullptr; + } +}; + +// Global library instance +extern GroundLibrary ground_lib_registry; + +// Macro to register functions easily +#define REGISTER_GROUND_FUNCTION(func_name) \ + ground_lib_registry.register_function(#func_name, (void*)func_name) + +// Macro to define the library interface +#define GROUND_LIBRARY_INTERFACE() \ + GroundLibrary ground_lib_registry; \ + extern "C" { \ + const char** ground_get_functions() { \ + return ground_lib_registry.get_function_names(); \ + } \ + void* ground_get_function(const char* name) { \ + return ground_lib_registry.get_function(name); \ + } \ + } + +// Optional initialization macro +#define GROUND_LIBRARY_INIT() \ + extern "C" { \ + void ground_lib_init() { + +#define GROUND_LIBRARY_INIT_END() \ + } \ + } + +// Optional cleanup macro +#define GROUND_LIBRARY_CLEANUP() \ + extern "C" { \ + void ground_lib_cleanup() { + +#define GROUND_LIBRARY_CLEANUP_END() \ + } \ + } + +// Utility function to print GroundValue for debugging +inline void debug_print_ground_value(const GroundValue& v) { + switch (v.type) { + case GROUND_INT: + std::cout << "INT: " << v.data.int_val << std::endl; + break; + case GROUND_DOUBLE: + std::cout << "DOUBLE: " << v.data.double_val << std::endl; + break; + case GROUND_BOOL: + std::cout << "BOOL: " << (v.data.bool_val ? "true" : "false") << std::endl; + break; + case GROUND_STRING: + std::cout << "STRING: " << (v.data.string_val ? v.data.string_val : "(null)") << std::endl; + break; + case GROUND_CHAR: + std::cout << "CHAR: '" << v.data.char_val << "'" << std::endl; + break; + } +} + +#endif // GROUND_LIB_H diff --git a/request/request.cpp b/request/request.cpp new file mode 100644 index 0000000..4a1bdf4 --- /dev/null +++ b/request/request.cpp @@ -0,0 +1,52 @@ +#include "ground_lib.h" + +#include +#include +#include + +void error(std::string status) { + std::cout << "Request error: " << status << std::endl; +} + +GroundValue simpleRequest(GroundValue* args, int arg_count) { + VALIDATE_ARGS_1(GROUND_STRING); + + cpr::Response r = cpr::Get(cpr::Url(GET_STRING(args[0]))); + + if (!(r.status_code >= 200 && r.status_code < 300)) { + error("Non zero HTTP code " + std::to_string(r.status_code)); + return ground_string_val("Error code " + std::to_string(r.status_code)); + } + + return ground_string_val(r.text); +} + +GroundValue saveContents(GroundValue* args, int arg_count) { + VALIDATE_ARGS_2(GROUND_STRING, GROUND_STRING); + + std::ofstream file(GET_STRING(args[1]), std::ios::binary); + + if (file.good()) { + cpr::Response r = cpr::Download(file, cpr::Url{GET_STRING(args[0])}); + + if (!(r.status_code >= 200 && r.status_code < 300)) { + error("Non zero HTTP code " + std::to_string(r.status_code)); + return GROUND_BOOL_VAL(false); + } + } else { + error(std::string("Cannot open file ") + GET_STRING(args[1]) + " for writing"); + return GROUND_BOOL_VAL(false); + } + + return GROUND_BOOL_VAL(true); +} + +GROUND_LIBRARY_INTERFACE() + +GROUND_LIBRARY_INIT() + REGISTER_GROUND_FUNCTION(simpleRequest); + REGISTER_GROUND_FUNCTION(saveContents); +GROUND_LIBRARY_INIT_END() + +GROUND_LIBRARY_CLEANUP() +GROUND_LIBRARY_CLEANUP_END()