summaryrefslogtreecommitdiff
path: root/src/resources
diff options
context:
space:
mode:
authorphysick <mynameisgennadiy@vk.com>2026-07-28 20:29:45 +0500
committerphysick <mynameisgennadiy@vk.com>2026-07-28 20:33:20 +0500
commit7237c999918e44e2e76a6d2e2ae37ea709af08f6 (patch)
treef15f39c2ba4092bd3bf7fd7b8548c51535ee3940 /src/resources
parent48faa910496b1b3811c2b52f16d5a76f38ca3e48 (diff)
Added wren limiting fork support
Diffstat (limited to 'src/resources')
-rw-r--r--src/resources/config.c100
-rw-r--r--src/resources/resources.h16
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();