From 58fc204f46a9ce34492ad632dcc4493a54fa04e6 Mon Sep 17 00:00:00 2001 From: yukkop Date: Wed, 12 Mar 2025 23:19:45 +0100 Subject: [PATCH] feat(c): extrude lib c --- package/c/lib/Makefile | 26 +++ package/c/lib/default.nix | 0 package/c/lib/lib/heclib.c | 0 package/c/lib/lib/heclib.h | 189 ++++++++++++++++++ package/c/lib/test/test.c | 12 ++ package/postgres/pg-neo-migration/hectic-chan | Bin 37312 -> 0 bytes .../postgres/pg-neo-migration/src/logger.c | 2 +- package/postgres/pg-neo-migration/src/macro.c | 2 + .../src/{macros.h => macro.h} | 18 +- .../postgres/pg-neo-migration/src/macros.c | 9 - package/postgres/pg-neo-migration/src/main.c | 34 ++-- 11 files changed, 266 insertions(+), 26 deletions(-) create mode 100644 package/c/lib/Makefile create mode 100644 package/c/lib/default.nix create mode 100644 package/c/lib/lib/heclib.c create mode 100644 package/c/lib/lib/heclib.h create mode 100644 package/c/lib/test/test.c delete mode 100755 package/postgres/pg-neo-migration/hectic-chan create mode 100644 package/postgres/pg-neo-migration/src/macro.c rename package/postgres/pg-neo-migration/src/{macros.h => macro.h} (70%) delete mode 100644 package/postgres/pg-neo-migration/src/macros.c diff --git a/package/c/lib/Makefile b/package/c/lib/Makefile new file mode 100644 index 0000000..6d0c6c8 --- /dev/null +++ b/package/c/lib/Makefile @@ -0,0 +1,26 @@ +CC = gcc +CFLAGS = -Wall -Wextra -std=c11 +LDFLAGS = -L. -lmylib # Link with your library + +# Source files +LIB_SRC = mylib.c +LIB_OBJ = $(LIB_SRC:.c=.o) +TEST_SRC = test/test.c +TEST_OBJ = $(TEST_SRC:.c=.o) +TEST_BIN = test + +# Build library +libmylib.a: $(LIB_OBJ) + ar rcs $@ $^ + +# Build test executable +$(TEST_BIN): $(TEST_OBJ) libmylib.a + $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) + +# Compile C files +%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +# Clean build artifacts +clean: + rm -f $(LIB_OBJ) $(TEST_OBJ) $(TEST_BIN) libmylib.a diff --git a/package/c/lib/default.nix b/package/c/lib/default.nix new file mode 100644 index 0000000..e69de29 diff --git a/package/c/lib/lib/heclib.c b/package/c/lib/lib/heclib.c new file mode 100644 index 0000000..e69de29 diff --git a/package/c/lib/lib/heclib.h b/package/c/lib/lib/heclib.h new file mode 100644 index 0000000..5d3e78e --- /dev/null +++ b/package/c/lib/lib/heclib.h @@ -0,0 +1,189 @@ +#ifndef EPRINTF_H +#define EPRINTF_H + +#include +#include +#include +#include +#include +#include + +// ------------- +// -- Helpers -- +// ------------- + +// Helper macros for argument counting +// NOTE(yukkop): this ugly macroses for avoid all posible warnings +#define PP_CAT(a, b) PP_CAT_I(a, b) +#define PP_CAT_I(a, b) a##b + +#define PP_NARG(...) PP_NARG_(__VA_ARGS__, PP_RSEQ_N()) +#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__) +#define PP_ARG_N(_1,_2,_3,_4,_5,_6,_7,_8,_9,N,...) N +#define PP_RSEQ_N() 9,8,7,6,5,4,3,2,1,0 + +// ------------ +// -- Colors -- +// ------------ + +// Color mode enumeration +typedef enum { + COLOR_MODE_AUTO, + COLOR_MODE_FORCE, + COLOR_MODE_DISABLE +} ColorMode; + +// Static color mode variable +static ColorMode color_mode = COLOR_MODE_AUTO; + +// Function to set color mode +void set_output_color_mode(ColorMode mode) { + color_mode = mode; +} + +// Macros for detecting terminal and color usage +#define IS_TERMINAL() (isatty(fileno(stderr))) +#define USE_COLOR() ((color_mode == COLOR_MODE_FORCE) || (color_mode == COLOR_MODE_AUTO && IS_TERMINAL())) + +#define COLOR_RED (USE_COLOR() ? "\033[1;31m" : "") +#define COLOR_RESET (USE_COLOR() ? "\033[0m" : "") + +// ------------ +// -- Errors -- +// ------------ + +// Define color macros based on output type +#define ERROR_PREFIX PP_CAT_I(COLOR_RED, "Error: ") +#define ERROR_SUFFIX PP_CAT_I(COLOR_RESET, "\n") + +// eprintf handling 1 or more arguments +#define eprintf_1(fmt) \ + fprintf(stderr, "%s" fmt "%s", ERROR_PREFIX, ERROR_SUFFIX) + +#define eprintf_2(fmt, ...) \ + fprintf(stderr, "%s" fmt "%s", ERROR_PREFIX, __VA_ARGS__, ERROR_SUFFIX) + +#define eprintf(...) \ + PP_CAT(eprintf_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) + +#define todo fprintf(stderr, "%sNot implimented yet%s", COLOR_RED, COLOR_RESET);exit(1) + +// ------------ +// -- Logger -- +// ------------ + +typedef enum { + LOG_LEVEL_DEBUG, + LOG_LEVEL_LOG, + LOG_LEVEL_INFO, + LOG_LEVEL_NOTICE, + LOG_LEVEL_WARN, + LOG_LEVEL_EXCEPTION +} LogLevel; + +const char* log_level_to_string(LogLevel level) { + switch (level) { + case LOG_LEVEL_DEBUG: return "DEBUG"; + case LOG_LEVEL_LOG: return "LOG"; + case LOG_LEVEL_INFO: return "INFO"; + case LOG_LEVEL_NOTICE: return "NOTICE"; + case LOG_LEVEL_WARN: return "WARN"; + case LOG_LEVEL_EXCEPTION: return "EXCEPTION"; + default: return "UNKNOWN"; + } +} + +LogLevel log_level_from_string(const char *level_str) { + if (!level_str) return LOG_LEVEL_INFO; + if (strcmp(level_str, "DEBUG") == 0) + return LOG_LEVEL_DEBUG; + else if (strcmp(level_str, "LOG") == 0) + return LOG_LEVEL_LOG; + else if (strcmp(level_str, "INFO") == 0) + return LOG_LEVEL_INFO; + else if (strcmp(level_str, "NOTICE") == 0) + return LOG_LEVEL_NOTICE; + else if (strcmp(level_str, "WARN") == 0) + return LOG_LEVEL_WARN; + else if (strcmp(level_str, "EXCEPTION") == 0) + return LOG_LEVEL_EXCEPTION; + else + return LOG_LEVEL_INFO; +} + +LogLevel current_log_level = LOG_LEVEL_INFO; + +void init_logger(void) { + current_log_level = log_level_from_string(getenv("LOG_LEVEL")); +} + +void log_message(LogLevel level, int line, const char *format, ...) { + if (level < current_log_level) { + return; + } + + time_t now = time(NULL); + struct tm tm_info; + localtime_r(&now, &tm_info); + char timeStr[20]; + strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", &tm_info); + + fprintf(stderr, "%s %d %s: ", timeStr, line, log_level_to_string(level)); + + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + + fprintf(stderr, "\n"); +} + +// DEBUG level +#define raise_debug_1(fmt) \ + log_message(LOG_LEVEL_DEBUG, __LINE__, fmt) +#define raise_debug_2(fmt, ...) \ + log_message(LOG_LEVEL_DEBUG, __LINE__, fmt, __VA_ARGS__) +#define raise_debug(...) \ + PP_CAT(raise_debug_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) + +// LOG level +#define raise_log_1(fmt) \ + log_message(LOG_LEVEL_LOG, __LINE__, fmt) +#define raise_log_2(fmt, ...) \ + log_message(LOG_LEVEL_LOG, __LINE__, fmt, __VA_ARGS__) +#define raise_log(...) \ + PP_CAT(raise_log_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) + +// INFO level +#define raise_info_1(fmt) \ + log_message(LOG_LEVEL_INFO, __LINE__, fmt) +#define raise_info_2(fmt, ...) \ + log_message(LOG_LEVEL_INFO, __LINE__, fmt, __VA_ARGS__) +#define raise_info(...) \ + PP_CAT(raise_info_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) + +// NOTICE level +#define raise_notice_1(fmt) \ + log_message(LOG_LEVEL_NOTICE, __LINE__, fmt) +#define raise_notice_2(fmt, ...) \ + log_message(LOG_LEVEL_NOTICE, __LINE__, fmt, __VA_ARGS__) +#define raise_notice(...) \ + PP_CAT(raise_notice_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) + +// WARN level +#define raise_warn_1(fmt) \ + log_message(LOG_LEVEL_WARN, __LINE__, fmt) +#define raise_warn_2(fmt, ...) \ + log_message(LOG_LEVEL_WARN, __LINE__, fmt, __VA_ARGS__) +#define raise_warn(...) \ + PP_CAT(raise_warn_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) + +// EXCEPTION level +#define raise_exception_1(fmt) \ + log_message(LOG_LEVEL_EXCEPTION, __LINE__, fmt) +#define raise_exception_2(fmt, ...) \ + log_message(LOG_LEVEL_EXCEPTION, __LINE__, fmt, __VA_ARGS__) +#define raise_exception(...) \ + PP_CAT(raise_exception_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) + +#endif // EPRINTF_H diff --git a/package/c/lib/test/test.c b/package/c/lib/test/test.c new file mode 100644 index 0000000..b31e5c3 --- /dev/null +++ b/package/c/lib/test/test.c @@ -0,0 +1,12 @@ +#include +#include +#include "heclib.h" + +void test_function() { +} + +int main(void) { + test_function(); + printf("All tests passed\n"); + return 0; +} diff --git a/package/postgres/pg-neo-migration/hectic-chan b/package/postgres/pg-neo-migration/hectic-chan deleted file mode 100755 index 5a1a25ffe46e13d0de147d0ee98cde070226b432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37312 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 U1PxF#Ffb&690(GCVl*xT0O0^qL;wH) diff --git a/package/postgres/pg-neo-migration/src/logger.c b/package/postgres/pg-neo-migration/src/logger.c index 9615f44..bfa36c5 100644 --- a/package/postgres/pg-neo-migration/src/logger.c +++ b/package/postgres/pg-neo-migration/src/logger.c @@ -3,7 +3,7 @@ #include #include #include -#include "macros.h" +#include "macro.h" typedef enum { LOG_LEVEL_DEBUG, diff --git a/package/postgres/pg-neo-migration/src/macro.c b/package/postgres/pg-neo-migration/src/macro.c new file mode 100644 index 0000000..1a98ff2 --- /dev/null +++ b/package/postgres/pg-neo-migration/src/macro.c @@ -0,0 +1,2 @@ +#include "macro.h" + diff --git a/package/postgres/pg-neo-migration/src/macros.h b/package/postgres/pg-neo-migration/src/macro.h similarity index 70% rename from package/postgres/pg-neo-migration/src/macros.h rename to package/postgres/pg-neo-migration/src/macro.h index b1649be..62d23a0 100644 --- a/package/postgres/pg-neo-migration/src/macros.h +++ b/package/postgres/pg-neo-migration/src/macro.h @@ -11,16 +11,24 @@ typedef enum { COLOR_MODE_DISABLE } ColorMode; -// Function to set the color mode -void set_output_color_mode(ColorMode mode); +// Static color mode variable +static ColorMode color_mode = COLOR_MODE_AUTO; + +// Function to set color mode +void set_output_color_mode(ColorMode mode) { + color_mode = mode; +} // Macros for detecting terminal and color usage #define IS_TERMINAL() (isatty(fileno(stderr))) #define USE_COLOR() ((color_mode == COLOR_MODE_FORCE) || (color_mode == COLOR_MODE_AUTO && IS_TERMINAL())) +#define COLOR_RED (USE_COLOR() ? "\033[1;31m" : "") +#define COLOR_RESET (USE_COLOR() ? "\033[0m" : "") + // Define color macros based on output type -#define ERROR_PREFIX (IS_TERMINAL() ? "\033[1;31mError: " : "Error: ") -#define ERROR_SUFFIX (IS_TERMINAL() ? "\033[0m\n" : "\n") +#define ERROR_PREFIX PP_CAT_I(COLOR_RED, "Error: ") +#define ERROR_SUFFIX PP_CAT_I(COLOR_RESET, "\n") // Helper macros for argument counting // NOTE(yukkop): this ugly macroses for avoid all posible warnings @@ -42,4 +50,6 @@ void set_output_color_mode(ColorMode mode); #define eprintf(...) \ PP_CAT(eprintf_, PP_NARG(__VA_ARGS__))(__VA_ARGS__) +#define todo fprintf(stderr, "%sNot implimented yet%s", COLOR_RED, COLOR_RESET);exit(1) + #endif // EPRINTF_H diff --git a/package/postgres/pg-neo-migration/src/macros.c b/package/postgres/pg-neo-migration/src/macros.c deleted file mode 100644 index 1b61d85..0000000 --- a/package/postgres/pg-neo-migration/src/macros.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "macros.h" - -// Static color mode variable -static ColorMode color_mode = COLOR_MODE_AUTO; - -// Function to set color mode -void set_output_color_mode(ColorMode mode) { - color_mode = mode; -} diff --git a/package/postgres/pg-neo-migration/src/main.c b/package/postgres/pg-neo-migration/src/main.c index 723dcc6..89c2897 100644 --- a/package/postgres/pg-neo-migration/src/main.c +++ b/package/postgres/pg-neo-migration/src/main.c @@ -2,10 +2,11 @@ #include #include #include "logger.c" -#include "macros.h" +#include "macro.h" #include #include #include +#include // TODO: check on the specific psql version int check_psql_installed(void) { @@ -58,7 +59,7 @@ void create_migration_inner(const char* migration_path, const char* type) { } char filename[1024 + 19]; - snprintf(filename, sizeof(filename), "%s/00-entry-point.sql", path); + snprintf(filename, sizeof(filename), "%s/0000-entry-point.sql", path); FILE *fp = fopen(filename, "w"); if (!fp) { @@ -101,9 +102,10 @@ void help_message(char name[]) { int main(int argc, char *argv[]) { srand(time(NULL)); init_logger(); - raise_log("init"); + todo; + if (check_psql_installed()) { exit(1); } if (argc < 2) { @@ -115,7 +117,9 @@ int main(int argc, char *argv[]) { char *migration_dir; char *db_url; char *migration_name; - char force = 0; + bool force = true; + char **set_vars = NULL; + int set_vars_count = 0; /* Process global options until a known subcommand is encountered */ int i = 1; @@ -171,11 +175,18 @@ int main(int argc, char *argv[]) { force = 1; } else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--set")) { if (i+1 < argc) { - set_vars = relloc(set_vars); + set_vars = realloc(set_vars, (set_vars_count+1) * sizeof(char*)); + set_vars[set_vars_count++] = argv[i+1]; + i++; } else { eprintf("%s requires an argument", argv[i]); } + } + if (!db_url) { + eprintf("Database URL is required for %s subcommand.\n", subcommand); + help_message(argv[0]); + exit(1); } } } else if (strcmp(subcommand, "fetch") == 0) { @@ -187,14 +198,13 @@ int main(int argc, char *argv[]) { } else { eprintf("%s requires an argument", argv[i]); } - + + if (!db_url) { + eprintf("Database URL is required for %s subcommand.\n", subcommand); + help_message(argv[0]); + exit(1); + } } } } - - if (!db_url) { - eprintf("Database URL is required for migrate subcommand.\n"); - help_message(argv[0]); - exit(1); - } }