diff --git a/flake.nix b/flake.nix index be5fd76..e6a239b 100644 --- a/flake.nix +++ b/flake.nix @@ -86,6 +86,9 @@ pg-schema = pkgs.callPackage ./package/postgres/pg-schema/default.nix rust.commonArgs; pg-migration = pkgs.callPackage ./package/postgres/pg-migration/default.nix rust.commonArgs; libhectic = pkgs.callPackage ./package/c/libhectic/default.nix {}; + hmpl = pkgs.callPackage ./package/c/hmpl/default.nix { + libhectic = self.packages.${system}.libhectic; + }; }; devShells.${system} = let diff --git a/package/c/hmpl/default.nix b/package/c/hmpl/default.nix new file mode 100644 index 0000000..2ea3e7d --- /dev/null +++ b/package/c/hmpl/default.nix @@ -0,0 +1,28 @@ +{ stdenv, gcc, lib, libhectic }: + +stdenv.mkDerivation { + pname = "libhectic"; + version = "1.0"; + src = ./.; + doCheck = true; + + buildInputs = [ libhectic ]; + + buildPhase = '' + mkdir -p target + ${gcc}/bin/cc -Wall -Wextra -g \ + -pedantic -fsanitize=address -c hmpl.c \ + -l:libhectic.a -o target/libhectic.o + ''; + + checkPhase = '' ''; + + installPhase = '' + mkdir -p $out/lib $out/include + ''; + + meta = { + description = "libhectic"; + license = lib.licenses.mit; + }; +} diff --git a/package/c/hmpl/hmpl.c b/package/c/hmpl/hmpl.c new file mode 100644 index 0000000..e69de29 diff --git a/package/c/libhectic/libhectic.h b/package/c/libhectic/libhectic.h index c3f7734..e9c33b0 100644 --- a/package/c/libhectic/libhectic.h +++ b/package/c/libhectic/libhectic.h @@ -81,6 +81,8 @@ typedef enum { LOG_LEVEL_EXCEPTION } LogLevel; +void logger_level_reset(); + void logger_level(LogLevel level); LogLevel log_level_from_string(const char *level_str); diff --git a/package/c/libhectic/test/test.c b/package/c/libhectic/test/test.c index 8dba2aa..f80085d 100644 --- a/package/c/libhectic/test/test.c +++ b/package/c/libhectic/test/test.c @@ -4,46 +4,37 @@ #include #include "libhectic.h" -// Reusable test function for any raise_* logging function. -// The logging function must have the signature: char* func(const char* message) -void test_raise_generic(const char* (*raise_func)(const char*), LogLevel log_level, const char* level_str) { - FILE *orig_stderr = stderr; - FILE *temp = tmpfile(); - char result_buffer[256]; - - if (!temp) { - perror("tmpfile"); - exit(EXIT_FAILURE); - } - stderr = temp; - - logger_level(log_level); - int line = __LINE__; - char* time_str = raise_func("message"); - logger_level_reset(); - - fflush(stderr); - fseek(temp, 0, SEEK_SET); - size_t nread = fread(result_buffer, 1, sizeof(result_buffer) - 1, temp); - result_buffer[nread] = '\0'; - - stderr = orig_stderr; - fclose(temp); - - char expected_buffer[256]; - sprintf(expected_buffer, "%s %d %s: message\n", time_str, line + 1, level_str, message); - assert(strcmp(result_buffer, expected_buffer) == 0); -} +#define TEST_RAISE_GENERIC(LOG_MACRO, LEVEL, LEVEL_STR) do { \ + FILE *orig_stderr = stderr; \ + FILE *temp = tmpfile(); \ + char result_buffer[256]; \ + if (!temp) { perror("tmpfile"); exit(EXIT_FAILURE); } \ + stderr = temp; \ + logger_level(LEVEL); \ + const char* time_str = LOG_MACRO("message"); \ + logger_level_reset(); \ + fflush(stderr); \ + fseek(temp, 0, SEEK_SET); \ + size_t nread = fread(result_buffer, 1, sizeof(result_buffer)-1, temp); \ + result_buffer[nread] = '\0'; \ + stderr = orig_stderr; \ + fclose(temp); \ + char expected_buffer[256]; \ + sprintf(expected_buffer, "%s %d " LEVEL_STR ": message\n", time_str, __LINE__); \ + printf("DEBUG: [%s] [%s]\n", result_buffer, expected_buffer); \ + assert(strcmp(result_buffer, expected_buffer) == 0); \ +} while(0) int main(void) { set_output_color_mode(COLOR_MODE_DISABLE); + raise_log("zalupa"); - test_raise_generic(raise_log, LOG_LEVEL_LOG, "LOG"); - test_raise_generic(raise_debug, LOG_LEVEL_DEBUG, "DEBUG"); - test_raise_generic(raise_warn, LOG_LEVEL_INFO, "INFO"); - test_raise_generic(raise_notice, LOG_LEVEL_NOTICE, "NOTICE"); - test_raise_generic(raise_warn, LOG_LEVEL_WARN, "WARN"); - test_raise_generic(raise_exception, LOG_LEVEL_EXCEPTION, "EXCEPTION"); + TEST_RAISE_GENERIC(raise_debug, LOG_LEVEL_DEBUG, "DEBUG"); + TEST_RAISE_GENERIC(raise_log, LOG_LEVEL_LOG, "LOG"); + TEST_RAISE_GENERIC(raise_info, LOG_LEVEL_INFO, "INFO"); + TEST_RAISE_GENERIC(raise_notice, LOG_LEVEL_NOTICE, "NOTICE"); + TEST_RAISE_GENERIC(raise_warn, LOG_LEVEL_WARN, "WARN"); + TEST_RAISE_GENERIC(raise_exception, LOG_LEVEL_EXCEPTION, "EXCEPTION"); return 0; }