diff options
| author | physick <mynameisgennadiy@vk.com> | 2026-07-28 20:29:45 +0500 |
|---|---|---|
| committer | physick <mynameisgennadiy@vk.com> | 2026-07-28 20:33:20 +0500 |
| commit | 7237c999918e44e2e76a6d2e2ae37ea709af08f6 (patch) | |
| tree | f15f39c2ba4092bd3bf7fd7b8548c51535ee3940 /src/resources | |
| parent | 48faa910496b1b3811c2b52f16d5a76f38ca3e48 (diff) | |
Added wren limiting fork support
Diffstat (limited to 'src/resources')
| -rw-r--r-- | src/resources/config.c | 100 | ||||
| -rw-r--r-- | src/resources/resources.h | 16 |
2 files changed, 116 insertions, 0 deletions
diff --git a/src/resources/config.c b/src/resources/config.c new file mode 100644 index 0000000..05b80cd --- /dev/null +++ b/src/resources/config.c @@ -0,0 +1,100 @@ +#include "resources.h" +#include <stdlib.h> +#include <stddef.h> +#include <raylib.h> +#include <stdio.h> +#include <string.h> + +Config config = { + .MaxOperations = DEFAULT_MAX_OPS, +}; + +bool startsWith(const char *str, const char *prefix) { + if (str == NULL || prefix == NULL) { + return false; + } + + size_t prefix_len = strlen(prefix); + + if (strlen(str) < prefix_len) { + return false; + } + + return strncmp(str, prefix, prefix_len) == 0; +} + +// Strips everything before '=' (including). Does not allocate. +char *stripName(char *line, size_t len) { + if (line == NULL) { + return NULL; + } + + for (size_t ptr = 0; ptr < len; ptr++) { + if (line[ptr] == '\0') { + return NULL; + } + if (line[ptr] == '=') { + return &line[ptr + 1]; + } + } + + return NULL; +} + +// Reads one line and assigns the param if found +void evaluateConfigLive(char *line) { + size_t len = strlen(line); + // Empty lines and comments + if (len <= 1 || line[0] == '#') return; + // Removing a new line + if (line[len-1] == '\n') { + line[len-1] = 0x0; + len -= 1; + } + + if (startsWith(line, "MaxOperations")) { + char *value = stripName(line, len); + + char *endptr; + unsigned long long parsed = strtoull(value, &endptr, 10); + if (value == endptr || *endptr != '\0') { + TraceLog(LOG_WARNING, "Failed to parse the value for MaxOperations. Provided value: '%s'", value); + return; + } + config.MaxOperations = parsed; + return; + } + +} + +bool ReadConfig(const char *location) { + FILE *file = fopen(location, "r"); + if (file == NULL) { + perror("Failed to open the config file"); + return false; + } + + fseek(file, 0, SEEK_END); + long size = ftell(file); + rewind(file); + + char* buffer = malloc(size + 1); + if (buffer == NULL) { + fclose(file); + perror("Failed to load the config file"); + return false; + } + + + while (fgets(buffer, size, file)) { + evaluateConfigLive(buffer); + } + + free(buffer); + fclose(file); + return true; +} + +Config *GetConfig() { + return &config; +} diff --git a/src/resources/resources.h b/src/resources/resources.h index d3ad840..8f6cd1d 100644 --- a/src/resources/resources.h +++ b/src/resources/resources.h @@ -1,8 +1,21 @@ +#include <stddef.h> #include <raylib.h> #ifndef RESOURCES_H #define RESOURCES_H +static const size_t DEFAULT_MAX_OPS = 2 * 1000 * 1000; +static const char *DEFAULT_CONFIG_LOCATION = "config.conf"; + +typedef struct { + // The maximum amount of operations performed by a VM on each check. + // + // Keep in mind that setting this parameter higher will make the infinite + // loops in your submission longer to detect. Lowering this parameter will make + // the limitation on the code runtime stricter. + size_t MaxOperations; +} Config; + void DrawBackground(); /// #670916 as RGBA @@ -18,6 +31,9 @@ static const Color COLORSCHEME_WHITE = { 233, 225, 185, 255 }; /// #48A56A as RGBA static const Color COLORSCHEME_GREEN = { 72, 165, 106, 255 }; +bool ReadConfig(const char *location); +Config *GetConfig(); + void LoadResources(); Font *GetMainFont(); Font *GetMonoFont(); |
