From 13dff67a36ce1e066d23062f3076581b4f3b34b8 Mon Sep 17 00:00:00 2001 From: Joshua Potter Date: Wed, 22 Nov 2023 13:43:34 -0700 Subject: [PATCH] Add all files. --- Makefile | 5 +++ flake.nix | 6 ++-- gen-flake | Bin 0 -> 20880 bytes include/dyn_array.h | 16 +++++++++ main.c | 64 ++++++++++++++++++++++++++++++++-- specs/clang/default/flake.nix | 36 +++++++++++++++++++ specs/clang/run.sh | 7 ++++ src/dyn_array.c | 44 +++++++++++++++++++++++ 8 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 Makefile create mode 100755 gen-flake create mode 100644 include/dyn_array.h create mode 100644 specs/clang/default/flake.nix create mode 100644 specs/clang/run.sh create mode 100644 src/dyn_array.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..85ac7e7 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +all: + @clang -g -lncurses -I include src/*.c main.c -o gen-flake + +bear: + @bear -- clang -g -lncurses -I include src/*.c main.c -o gen-flake diff --git a/flake.nix b/flake.nix index 27653ce..c281858 100644 --- a/flake.nix +++ b/flake.nix @@ -14,8 +14,7 @@ pkgs = nixpkgs.legacyPackages.${system}; codelldb = pkgs.writeShellScriptBin "codelldb" '' - #!/usr/bin/env bash - exec ${pkgs.vscode-extensions.vadimcn.vscode-lldb}/share/vscode/extensions/vadimcn.vscode-lldb/adapter/codelldb "$@" + exec ${pkgs.vscode-extensions.vadimcn.vscode-lldb}/share/vscode/extensions/vadimcn.vscode-lldb/adapter/codelldb "$@" ''; in { @@ -31,6 +30,9 @@ buildInputs = with pkgs; [ ncurses ]; + shellHook = '' + export GEN_FLAKE_SPEC_PATH="${./specs}" + ''; }; } ); diff --git a/gen-flake b/gen-flake new file mode 100755 index 0000000000000000000000000000000000000000..11e4692a1e295dc13b9b2e3ef148420fb0a7f63c GIT binary patch literal 20880 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 literal 0 HcmV?d00001 diff --git a/include/dyn_array.h b/include/dyn_array.h new file mode 100644 index 0000000..e5770ee --- /dev/null +++ b/include/dyn_array.h @@ -0,0 +1,16 @@ +#ifndef GEN_FLAKE_DYN_ARRAY_H +#define GEN_FLAKE_DYN_ARRAY_H + +#include + +struct DynArray; + +struct DynArray *dyn_array_new(size_t capacity); + +size_t dyn_array_size(struct DynArray *a); + +void dyn_array_push(struct DynArray *a, void *item); + +void dyn_array_free(struct DynArray *a); + +#endif /* GEN_FLAKE_DYN_ARRAY_H */ diff --git a/main.c b/main.c index 1f81122..697e4e0 100644 --- a/main.c +++ b/main.c @@ -1,7 +1,67 @@ -#include +#include #include +#include +#include +#include +#include +#include +#include + +#include "dyn_array.h" + +static int glob_specs(char *name, struct DynArray *entries) { + assert(name); + assert(entries); + + int name_length = strlen(name); + char *pattern = malloc(name_length + 3); + if (!pattern) { + goto cleanup; + } + memcpy(pattern, name, name_length); + memcpy(pattern + name_length + 1, "/*", 3); + + glob_t *pglob = 0; + + int retval = 0; + if ((retval = glob(pattern, GLOB_ONLYDIR | GLOB_MARK, 0, pglob))) { + goto cleanup; + } + + // GLOB_ONLYDIR is just a hint. We still need to actually verify the only + // results we are reading in are directories. + // TODO: + + globfree(pglob); + +cleanup: + if (pattern) { + free(pattern); + } + return retval; +} + +static void cleanup(int sig) { + endwin(); + + exit(EXIT_SUCCESS); +} int main(int argc, char **argv) { + int num = 0; - return EXIT_SUCCESS; + if (argc != 2) { + fprintf(stderr, "Usage: gen-flake \n"); + exit(EXIT_FAILURE); + } + + // Allow interrupting the program cleanly. + // TODO: How does this cleanup spec correctly? + signal(SIGINT, cleanup); + + initscr(); + keypad(stdscr, TRUE); // Enable keyboard mapping. + nonl(); // Disables NL to CR/NL conversion on output. + + cleanup(0); } diff --git a/specs/clang/default/flake.nix b/specs/clang/default/flake.nix new file mode 100644 index 0000000..0b6771f --- /dev/null +++ b/specs/clang/default/flake.nix @@ -0,0 +1,36 @@ +{ + description = '' + An opinionated clang flake. + ''; + + inputs = { + flake-utils.url = "github:numtide/flake-utils"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + + codelldb = pkgs.writeShellScriptBin "codelldb" '' + #!/usr/bin/env bash + exec ${pkgs.vscode-extensions.vadimcn.vscode-lldb}/share/vscode/extensions/vadimcn.vscode-lldb/adapter/codelldb "$@" + ''; + in + { + devShells.default = pkgs.mkShell.override { + # https://nixos.wiki/wiki/Using_Clang_instead_of_GCC + stdenv = pkgs.clangStdenv; + } { + packages = with pkgs; [ + bear + clang-tools + codelldb + ]; + buildInputs = with pkgs; [ + ncurses + ]; + }; + }); +} diff --git a/specs/clang/run.sh b/specs/clang/run.sh new file mode 100644 index 0000000..fcdce00 --- /dev/null +++ b/specs/clang/run.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +if [ -z "$VERSION" ]; then + VERSION="default" +fi + +cp "$VERSION/flake.nix" "$OUT" diff --git a/src/dyn_array.c b/src/dyn_array.c new file mode 100644 index 0000000..38593ea --- /dev/null +++ b/src/dyn_array.c @@ -0,0 +1,44 @@ +#include + +#include "dyn_array.h" + +struct DynArray { + void **buf; + // The size of @buf excluding `NUL`. + size_t size; + // The allocated size of @buf including `NUL`. + size_t _capacity; +}; + +struct DynArray *dyn_array_new(size_t capacity) { + struct DynArray *a = malloc(sizeof(struct DynArray)); + a->buf = calloc(capacity, sizeof(void *)); + a->size = 0; + a->_capacity = capacity; + return a; +} + +size_t dyn_array_size(struct DynArray *a) { + assert(a); + + return a->size; +} + +void dyn_array_push(struct DynArray *a, void *item) { + assert(a); + + if (a->size == a->_capacity) { + // We assume reallocation will work. + a->_capacity *= 2; + a = realloc(a, sizeof(void *) * a->_capacity); + } + a->size += 1; + a->buf[a->size] = item; +} + +void dyn_array_free(struct DynArray *a) { + assert(a); + + free(a->buf); + free(a); +}