From 2fe0443d7073e59b1e4d75f49f0a5a417678f4cd Mon Sep 17 00:00:00 2001 From: dacctal Date: Thu, 2 Jul 2026 03:54:29 +0000 Subject: ezntek: checkpoint! --- src/cla_parse.c | 76 ++++++++++++++++++++++++++++++------------- src/globs.c | 1 - src/help.c | 9 +++--- src/lua_globs.c | 4 ++- src/main.c | 4 ++- src/pkg/.clangd | 4 --- src/pkg/create.c | 98 ------------------------------------------------------- src/pkg_create.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pkg_free.c | 9 ++++++ src/str.c | 25 ++++++++------ 10 files changed, 189 insertions(+), 140 deletions(-) delete mode 100644 src/pkg/.clangd delete mode 100644 src/pkg/create.c create mode 100644 src/pkg_create.c create mode 100644 src/pkg_free.c (limited to 'src') diff --git a/src/cla_parse.c b/src/cla_parse.c index ab1e44c..4d824f4 100644 --- a/src/cla_parse.c +++ b/src/cla_parse.c @@ -31,7 +31,7 @@ #include "help.h" // #include "name_from_url.h" // #include "pkg_build.h" -#include "pkg/create.h" +#include "pkg.h" // #include "pkg_search.h" // #include "pkg_install.h" // #include "pkg_list.h" @@ -40,9 +40,8 @@ // #include "repo_add.h" // #include "update.h" -#define COMMAND(arg, large, small, code) \ - if (strcmp(arg, large) == 0 || strcmp(arg, small) == 0) \ - code +#define COMMAND(large, small) \ + (!strcmp(argv[i], large) || !strcmp(argv[i], small)) #define NOT_ENOUGH_ARGS(arg, next) \ log_error("Not enough arguments! Try: pkgit %s [%s]", (arg), (next)) @@ -59,7 +58,8 @@ void cmd_add(char **argv, int i) { void cmd_build(int argc, char **argv, int i) { if (argv[i + 1]) { for (int j = i + 1; j < argc; j++) { - if (argv[j][0] == '-') continue; + if (argv[j][0] == '-') + continue; printf("build pkg %s\n", argv[j]); // str_slc arg = mstrslc(argv[j]); // package_t pkg = pkg_create(arg); @@ -76,7 +76,8 @@ void cmd_build(int argc, char **argv, int i) { void cmd_install(int argc, char **argv, int i) { if (argv[i + 1]) { for (int j = i + 1; j < argc; j++) { - if (argv[j][0] == '-') continue; + if (argv[j][0] == '-') + continue; printf("install pkg %s\n", argv[j]); // str_slc arg = mstrslc(argv[j]); // package_t pkg = pkg_create(arg); @@ -90,7 +91,8 @@ void cmd_install(int argc, char **argv, int i) { void cmd_remove(int argc, char **argv, int i) { if (argv[i + 1]) { for (int j = i + 1; j < argc; j++) { - if (argv[j][0] == '-') continue; + if (argv[j][0] == '-') + continue; printf("remove pkg %s\n", argv[j]); // str_slc arg = mstrslc(argv[j]); // package_t pkg = pkg_create(arg); @@ -160,10 +162,14 @@ void flags_cmd(int argc, char **argv, int i) { void flags_parse(int argc, char **argv) { for (int i = 1; i < argc; i++) { - if (argv[i][0] != '-') continue; + if (argv[i][0] != '-') + continue; if (argv[i][1] == '-') { - COMMAND(argv[i], "--quiet", "-q", { flags.verbose = false; }); - COMMAND(argv[i], "--force", "-f", { flags.force = true; }); + if (COMMAND("--quiet", "-q")) + flags.verbose = false; + if (COMMAND("--force", "-f")) { + flags.force = true; + }; } else { flags_mod(argv, i); flags_cmd(argc, argv, i); @@ -173,22 +179,48 @@ void flags_parse(int argc, char **argv) { void cmds_parse(int argc, char **argv) { for (int i = 1; i < argc; i++) { - COMMAND(argv[i], "--add", "a", { cmd_add(argv, i); }); - COMMAND(argv[i], "--build", "b", { cmd_build(argc, argv, i); }); - COMMAND(argv[i], "--install", "i", { cmd_install(argc, argv, i); }); - COMMAND(argv[i], "--remove", "r", { cmd_remove(argc, argv, i); }); - COMMAND(argv[i], "--update", "u", {/*update();*/}); - COMMAND(argv[i], "--declare", "d", {/*declare();*/}); - COMMAND(argv[i], "--list", "l", {/*pkgs_list();*/}); - COMMAND(argv[i], "--search", "s", {/*search(argv[i + 1]);*/}); - COMMAND(argv[i], "--version", "v", { printf("%s\n", VERSION); }); - COMMAND(argv[i], "--help", "h", { help(); }); - COMMAND(argv[i], "--check", "c", {/*deps_resolve();*/}); + if (COMMAND("--add", "a")) { + cmd_add(argv, i); + } + if (COMMAND("--build", "b")) { + cmd_build(argc, argv, i); + } + if (COMMAND("--install", "i")) { + cmd_install(argc, argv, i); + } + if (COMMAND("--remove", "r")) { + cmd_remove(argc, argv, i); + } + if (COMMAND("--update", "u")) { + panic("not implemented"); + // update(); + } + if (COMMAND("--declare", "d")) { + // declare(); + } + if (COMMAND("--list", "l")) { + // pkgs_list(); + } + if (COMMAND("--search", "s")) { + // search(argv[i + 1]); + } + if (COMMAND("--version", "v")) { + printf(VERSION "\n"); + } + if (COMMAND("--help", "h")) { + help(); + } + if (COMMAND("--check", "c")) { + // deps_resolve + } } } void cla_parse(int argc, char **argv) { - if (!argv[1]) { + // default + flags.force = false; + flags.verbose = true; + if (argc == 1) { help(); return; } diff --git a/src/globs.c b/src/globs.c index 519e5f9..860bafb 100644 --- a/src/globs.c +++ b/src/globs.c @@ -35,7 +35,6 @@ void init_vars(void) { if (file_exists("/etc/pkgit/repos.lua")) { cfg.dir = mstr("/etc/pkgit"); cfg.name = mstr("/etc/pkgit/repos.lua"); - } else { const char *tmp = getenv("XDG_CONFIG_HOME"); if (tmp) { diff --git a/src/help.c b/src/help.c index 8580844..bacdcd9 100644 --- a/src/help.c +++ b/src/help.c @@ -62,13 +62,14 @@ void help(void) { printf(BOLD_YELLOW "'-_ " BOLD_MAGENTA "'" BOLD_YELLOW " _-' \n"); printf(BOLD_YELLOW " `'-.-'` " COLOR_RESET "\n"); } else { - printf("pkgit %s%s- package it!%s\n", ITALIC, GRAY, COLOR_RESET); - printf("%s%s%s\n", MAGENTA, VERSION, COLOR_RESET); + printf(BOLD "pkgit " COLOR_RESET ITALIC GRAY "- package it!" COLOR_RESET + "\n"); + printf("version " MAGENTA VERSION COLOR_RESET "\n"); } printf("\n"); printf(RED "subcommand flags" COLOR_RESET ":\n"); - for (size_t i = 0; i < sizeof(cmd_flags) / sizeof(cmd_flags[0]); i++) { + for (size_t i = 0; i < LENGTH(cmd_flags); i++) { printf(COLOR_RESET "\t" GREEN "%-2s" COLOR_RESET ", " YELLOW "%-12s" BLUE "%-16s" GRAY "# %s\n" COLOR_RESET, cmd_flags[i].short_flag, cmd_flags[i].long_flag, @@ -76,7 +77,7 @@ void help(void) { } printf("\n" RED "modifier flags" COLOR_RESET ":\n"); - for (size_t i = 0; i < sizeof(mod_flags) / sizeof(mod_flags[0]); i++) { + for (size_t i = 0; i < LENGTH(mod_flags); i++) { printf(COLOR_RESET "\t" GREEN "%-2s" COLOR_RESET ", " YELLOW "%-12s" BLUE "%-16s" GRAY "# %s\n" COLOR_RESET, mod_flags[i].short_flag, mod_flags[i].long_flag, diff --git a/src/lua_globs.c b/src/lua_globs.c index 5a8e51c..d6bd353 100644 --- a/src/lua_globs.c +++ b/src/lua_globs.c @@ -18,10 +18,12 @@ */ -#include "lua_globs.h" +#include + #include "files.h" #include "globs.h" #include "log.h" +#include "lua_globs.h" #include "str.h" lua_State *L = NULL; diff --git a/src/main.c b/src/main.c index 5ac5bde..f67ef9d 100644 --- a/src/main.c +++ b/src/main.c @@ -19,14 +19,16 @@ */ // #include "cla_parse.h" +#include "pkg.h" #include "globs.h" -#include "pkg_create.h" #include "str.h" int main(int argc, char **argv) { (void)argc; init_vars(); package_t pkg = pkg_create(mstrslc(argv[1])); + str_println(&pkg.name); + pkg_free(&pkg); // cla_parse(argc, argv); free_vars(); return 0; diff --git a/src/pkg/.clangd b/src/pkg/.clangd deleted file mode 100644 index 5022e8f..0000000 --- a/src/pkg/.clangd +++ /dev/null @@ -1,4 +0,0 @@ -CompileFlags: - Add: [-I/usr/include/luajit-2.1, -I../include] ---- -UseTab: Always diff --git a/src/pkg/create.c b/src/pkg/create.c deleted file mode 100644 index 9e3e765..0000000 --- a/src/pkg/create.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - - pkgit - package_t it! - - Copyright (C) 2026 dacctal - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -*/ - -#include -#include - -#include "files.h" -#include "globs.h" -#include "log.h" -#include "pkg_create.h" -#include "str.h" - -static str get_destdir(str_slc cwd, str_slc arg) { - str_slc name = str_slc_from_after_delim(arg, '/'); - if (str_slc_first(arg) == '.') - return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(&cwd)); - else - return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(&name)); -} - -static str get_pkgsrc(package_t pkg) { - if (pkg.is_local == 1) - return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), pkg.name); - else - return str_format("%.*s/%.*s/%.*s", str_fmt(&inst_dirs.src), - str_fmt(&pkg.name), str_fmt(&pkg.version)); -} - -package_t pkg_create(str_slc arg) { - package_t pkg = { - .version = mstr("HEAD"), - .is_local = false, - }; - - char cwd[MAX_PATH_LEN]; - getcwd(cwd, MAX_PATH_LEN); - - str_slc cwd_slc = mstrslc(cwd); - str cwd_str = mstr(cwd); - str dest_dir = get_destdir(cwd_slc, arg); - str new_arg_str = str_from_str_slc(arg); - - bool is_installed_locally = is_directory(dest_dir.data); - - pkg.version = str_from_after_delim(&new_arg_str, '@'); - pkg.target = str_from_after_delim(&new_arg_str, ','); - - bool is_in_repos = false; - // for (size_t i = 0; i < cached_repos_count; i++) { - // if (strcmp(new_arg, cached_repos[i].source_key) == 0) { - // is_in_repos = true; - // break; - // } - // } - - if (strncmp(arg.data, "http", 4) == 0 || strncmp(arg.data, "ssh", 3) == 0) { - pkg.url = new_arg_str; - pkg.name = str_from_after_delim(&new_arg_str, '/'); - } else if (str_slc_equal_cstr(arg, ".")) { - pkg.url = mstr(""); - pkg.name = str_from_after_delim(&cwd_str, '/'); - pkg.is_local = true; - } else if (is_in_repos) { - // for (size_t i = 0; i < cached_repos_count; i++) { - // if (strcmp(new_arg, cached_repos[i].source_key) == 0) { - // pkg.url = strdup(cached_repos[i].source_value); - // break; - // } - // } - pkg.name = new_arg_str; - } else if (is_installed_locally) { - pkg.url = mstr(""); - pkg.name = str_from_after_delim(&dest_dir, '/'); - pkg.is_local = true; - } else { - log_error("'%.*s' is not a valid package", str_fmt(&arg)); - exit(EXIT_FAILURE); - } - pkg.src = get_pkgsrc(pkg); - return pkg; -} diff --git a/src/pkg_create.c b/src/pkg_create.c new file mode 100644 index 0000000..9517868 --- /dev/null +++ b/src/pkg_create.c @@ -0,0 +1,99 @@ +/* + + pkgit - package_t it! + + Copyright (C) 2026 dacctal + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +*/ + +#include +#include + +#include "pkg.h" + +#include "files.h" +#include "globs.h" +#include "log.h" +#include "str.h" + +static str get_destdir(str_slc cwd, str_slc arg) { + str_slc name = str_slc_from_after_delim(arg, '/'); + if (str_slc_first(arg) == '.') + return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(&cwd)); + else + return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(&name)); +} + +static str get_pkgsrc(package_t pkg) { + if (pkg.is_local == 1) + return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), pkg.name); + else + return str_format("%.*s/%.*s/%.*s", str_fmt(&inst_dirs.src), + str_fmt(&pkg.name), str_fmt(&pkg.version)); +} + +package_t pkg_create(str_slc arg) { + package_t pkg = { + .version = mstr("HEAD"), + .is_local = false, + }; + + char cwd[MAX_PATH_LEN]; + getcwd(cwd, MAX_PATH_LEN); + + str_slc cwd_slc = mstrslc(cwd); + str cwd_str = mstr(cwd); + str dest_dir = get_destdir(cwd_slc, arg); + str new_arg_str = str_from_str_slc(arg); + + bool is_installed_locally = is_directory(dest_dir.data); + + pkg.version = str_from_after_delim(&new_arg_str, '@'); + pkg.target = str_from_after_delim(&new_arg_str, ','); + + bool is_in_repos = false; + // for (size_t i = 0; i < cached_repos_count; i++) { + // if (strcmp(new_arg, cached_repos[i].source_key) == 0) { + // is_in_repos = true; + // break; + // } + // } + + if (strncmp(arg.data, "http", 4) == 0 || strncmp(arg.data, "ssh", 3) == 0) { + pkg.url = new_arg_str; + pkg.name = str_from_after_delim(&new_arg_str, '/'); + } else if (str_slc_equal_cstr(arg, ".")) { + pkg.url = mstr(""); + pkg.name = str_from_after_delim(&cwd_str, '/'); + pkg.is_local = true; + } else if (is_in_repos) { + // for (size_t i = 0; i < cached_repos_count; i++) { + // if (strcmp(new_arg, cached_repos[i].source_key) == 0) { + // pkg.url = strdup(cached_repos[i].source_value); + // break; + // } + // } + pkg.name = new_arg_str; + } else if (is_installed_locally) { + pkg.url = mstr(""); + pkg.name = str_from_after_delim(&dest_dir, '/'); + pkg.is_local = true; + } else { + log_error("'%.*s' is not a valid package", str_fmt(&arg)); + exit(EXIT_FAILURE); + } + pkg.src = get_pkgsrc(pkg); + return pkg; +} diff --git a/src/pkg_free.c b/src/pkg_free.c new file mode 100644 index 0000000..2b1d670 --- /dev/null +++ b/src/pkg_free.c @@ -0,0 +1,9 @@ +#include "pkg.h" + +void pkg_free(package_t *pkg) { + str_free(&pkg->name); + str_free(&pkg->url); + str_free(&pkg->version); + str_free(&pkg->target); + str_free(&pkg->src); +} diff --git a/src/str.c b/src/str.c index c845ed5..67fd709 100644 --- a/src/str.c +++ b/src/str.c @@ -160,12 +160,13 @@ void str_ncopy_into(str *dest, const str *src, size_t count) { } void str_ncopy_cstr_into(str *dest, const char *src, size_t count) { - assert_str_is_valid(dest); assert(src); - dest->len = count; - if (dest->cap < count + 1) + if (!str_is_valid(dest)) + *dest = str_new_with_capacity(count + 1); + else if (dest->cap < count + 1) str_reserve_exact(dest, count + 1); memcpy(dest->data, src, count); + dest->len = count; dest->data[count] = 0; } @@ -743,15 +744,21 @@ ptrdiff_t str_slc_find_char_right(const str_slc s, char c) { } str str_from_after_delim(str *arg, char delimiter) { - size_t i = str_find_char_right(arg, delimiter); - str res = str_slice_to_str(arg, i + 1, arg->len); - return res; + return str_from_after_delim_str_slc(_strslc(arg), delimiter); +} + +str str_from_after_delim_str_slc(str_slc arg, char delimiter) { + size_t i = str_slc_find_char_right(arg, delimiter); + return str_slc_slice_to_str(arg, i + 1, arg.len); } str str_from_before_delim(str *arg, char delimiter) { - size_t i = str_find_char(arg, delimiter); - str res = str_slice_to_str(arg, i + 1, arg->len); - return res; + return str_from_before_delim_str_slc(_strslc(arg), delimiter); +} + +str str_from_before_delim_str_slc(str_slc arg, char delimiter) { + size_t i = str_slc_find_char(arg, delimiter); + return str_slc_slice_to_str(arg, i + 1, arg.len); } str_slc str_slc_from_after_delim(str_slc arg, char delimiter) { -- cgit v1.2.3