From 9201d978d0c4d4f4bdffd4e686ef116d7fdaa982 Mon Sep 17 00:00:00 2001 From: czjstmax Date: Sun, 21 Dec 2025 21:24:46 +0100 Subject: Fixed `#include` directives for `heads/` folder in `rbc.c` Signed-off-by: czjstmax --- src/heads/kat.h | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 src/heads/kat.h (limited to 'src/heads/kat.h') diff --git a/src/heads/kat.h b/src/heads/kat.h new file mode 100644 index 0000000..f5a3a00 --- /dev/null +++ b/src/heads/kat.h @@ -0,0 +1,175 @@ +// kat.cfg (kat.h) +// with love by czjstmax +// header version 2 + +#pragma once + +#include +#include +#include + +#ifndef KAT +#define KAT + +struct kat_api { + int (*create)(const char*); + int (*add)(const char*, const char*, const char*); + int (*read)(const char*, const char*, char*, size_t); + int (*del)(const char*, const char*); + int (*edit)(const char*, const char*, const char*); + int (*addComment)(const char*, const char*); +}; + +// Creates a file +static inline int katcreate(const char *path) { + FILE *f = fopen(path, "w"); + if (!f) return 1; + fclose(f); + return 0; // success +} + +// Appends a key=val to file +static inline int katadd(const char *key, const char *val, const char *path) { + FILE *f = fopen(path, "a"); + if (f) { + fprintf(f, "%s=%s\n", key, val); + fclose(f); + return 0; + } + return 1; +} + +// Appends a comment to file +static inline int kataddcomment(const char *str, const char *path) { + FILE *f = fopen(path, "a"); + if (f) { + fprintf(f, "#%s\n", str); + fclose(f); + return 0; + } + return 1; +} + +// Reads a key from file +static inline int katreadkey(const char *key, const char *path, char *buffer, size_t bufsize) { + FILE *f = fopen(path, "r"); + if (!f) return 1; + + char line[1024]; + size_t key_len = strlen(key); + + while (fgets(line, sizeof(line), f)) { + // TODO: skip leading whitespace maybe? + // check if line starts with key and '=' right after + if (strncmp(line, key, key_len) == 0 && line[key_len] == '=') { + if (line[0] == '#' || line[0] == ';' || line[0] == '\n') continue; + // copy everything after '=' until newline or buffer full (aka bad) + char *val_start = line + key_len + 1; + size_t len = strcspn(val_start, "\r\n"); // length until newline + if (len >= bufsize) len = bufsize - 1; + strncpy(buffer, val_start, len); + buffer[len] = '\0'; + fclose(f); + return 0; // success + } + } + + fclose(f); + return 1; +} + +// Deletes a key from file +static inline int katdelkey(const char *key, const char *path) { + FILE *f = fopen(path, "r"); + if (!f) return 1; + + char temp_path[1024]; + snprintf(temp_path, sizeof(temp_path), "%s.tmp", path); + FILE *temp = fopen(temp_path, "w"); + if (!temp) { + fclose(f); + return 1; + } + + char line[1024]; + size_t key_len = strlen(key); + int deleted = 0; + + while (fgets(line, sizeof(line), f)) { + // skip line if it matches 'key=' + if (strncmp(line, key, key_len) == 0 && line[key_len] == '=') { + deleted = 1; + continue; + } + fputs(line, temp); + } + + fclose(f); + fclose(temp); + + if (deleted) { + // replace original file with temp + if (remove(path) != 0) return 1; + if (rename(temp_path, path) != 0) return 1; + } else { + remove(temp_path); + } + + return deleted ? 0 : 1; // 0 if deleted, 1 if not found +} + +// Edits a key's value from file +static inline int kateditkey(const char *key, const char *new_val, const char *path) { + FILE *f = fopen(path, "r"); + if (!f) return 1; + + char temp_path[1024]; + snprintf(temp_path, sizeof(temp_path), "%s.tmp", path); + FILE *temp = fopen(temp_path, "w"); + if (!temp) { + fclose(f); + return 1; + } + + char line[1024]; + size_t key_len = strlen(key); + int found = 0; + + while (fgets(line, sizeof(line), f)) { + // skip leading whitespace for accurate matching + char *start = line; + while (*start == ' ' || *start == '\t') start++; + + if (strncmp(start, key, key_len) == 0 && start[key_len] == '=') { + // replace line with new key=val + fprintf(temp, "%s=%s\n", key, new_val); + found = 1; + } else { + fputs(line, temp); + } + } + + if (!found) { + // key not found, add it at the end + fprintf(temp, "%s=%s\n", key, new_val); + } + + fclose(f); + fclose(temp); + + if (remove(path) != 0) return 1; + if (rename(temp_path, path) != 0) return 1; + + return 0; +} + +struct kat_api kat = { + .create = katcreate, + .add = katadd, + .read = katreadkey, + .del = katdelkey, + .edit = kateditkey, + .addComment = kataddcomment, +}; + +#endif -- cgit v1.3.1