From 96463c0d8952bae8d62adec02ce9e6b79d558938 Mon Sep 17 00:00:00 2001 From: dacctal Date: Thu, 2 Jul 2026 07:29:38 +0000 Subject: pkg_create checkpoint! --- src/main.c | 9 +++++++++ src/pkg_create.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++--------- src/str.c | 4 ++-- 3 files changed, 61 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index f67ef9d..1133b22 100644 --- a/src/main.c +++ b/src/main.c @@ -27,7 +27,16 @@ int main(int argc, char **argv) { (void)argc; init_vars(); package_t pkg = pkg_create(mstrslc(argv[1])); + printf("NAME:\t"); str_println(&pkg.name); + printf("URL:\t"); + str_println(&pkg.url); + printf("VER:\t"); + str_println(&pkg.version); + printf("TRG:\t"); + str_println(&pkg.target); + printf("SRC:\t"); + str_println(&pkg.src); pkg_free(&pkg); // cla_parse(argc, argv); free_vars(); diff --git a/src/pkg_create.c b/src/pkg_create.c index ebf0745..29482a9 100644 --- a/src/pkg_create.c +++ b/src/pkg_create.c @@ -44,13 +44,42 @@ static str get_pkgsrc(package_t pkg) { str_fmt(&pkg.name), str_fmt(&pkg.version)); } +static void assign_pkg_version(package_t *pkg, str *new_arg_str) { + if (str_find_char(new_arg_str, '@')) { + str tmp_arg = str_from_after_delim(new_arg_str, '@'); + if (str_find_char(new_arg_str, ',')) { + str tmp_trg = str_from_after_delim(&tmp_arg, ','); + pkg->version = str_from_after_delim(new_arg_str, '@'); + pkg->version.len -= tmp_trg.len; + str_free(&tmp_trg); + } else { + pkg->version = str_from_after_delim(new_arg_str, '@'); + } + if (str_find_char(&pkg->version, ',')) pkg->version.len--; + str_free(&tmp_arg); + pkg->name.len -= pkg->version.len + 1; + } else pkg->version = mstr("HEAD"); +} + +static void assign_pkg_target(package_t *pkg, str *new_arg_str) { + if (str_find_char(new_arg_str, ',')) { + str tmp_arg = str_from_after_delim(new_arg_str, ','); + if (str_find_char(new_arg_str, '@')) { + str tmp_ver = str_from_after_delim(&tmp_arg, '@'); + pkg->target = str_from_after_delim(new_arg_str, ','); + pkg->target.len -= tmp_ver.len; + str_free(&tmp_ver); + } else { + pkg->target = str_from_after_delim(new_arg_str, ','); + } + if (str_find_char(&pkg->target, '@')) pkg->target.len--; + str_free(&tmp_arg); + pkg->name.len -= pkg->target.len + 1; + } else pkg->target = mstr("default"); +} + package_t pkg_create(str_slc arg) { - str ver_buf = mstr("HEAD"); - package_t pkg = { - .version = ver_buf, - .is_local = false, - }; - str_free(&ver_buf); + package_t pkg = { .is_local = false, }; char cwd[MAX_PATH_LEN]; getcwd(cwd, MAX_PATH_LEN); @@ -62,9 +91,6 @@ package_t pkg_create(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) { @@ -73,6 +99,18 @@ package_t pkg_create(str_slc arg) { // } // } + assign_pkg_version(&pkg, &new_arg_str); + assign_pkg_target(&pkg, &new_arg_str); + if (str_find_char(&new_arg_str, '@')) { + str tmp = str_from_after_delim(&new_arg_str, '@'); + new_arg_str.len -= tmp.len + 1; + str_free(&tmp); + } + if (str_find_char(&new_arg_str, ',')) { + str tmp = str_from_after_delim(&new_arg_str, ','); + new_arg_str.len -= tmp.len + 1; + str_free(&tmp); + } 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, '/'); @@ -96,6 +134,9 @@ package_t pkg_create(str_slc arg) { log_error("'%.*s' is not a valid package", str_fmt(&arg)); exit(EXIT_FAILURE); } + if (str_find_char(&new_arg_str, ',') + && str_find_char(&new_arg_str, '@') + ) pkg.name.len--; pkg.src = get_pkgsrc(pkg); str_free(&cwd_str); str_free(&dest_dir); diff --git a/src/str.c b/src/str.c index 67fd709..e12719c 100644 --- a/src/str.c +++ b/src/str.c @@ -432,11 +432,11 @@ char str_last(const str *s) { return s->data[s->len - 1]; } -size_t str_find_char(const str *s, char c) { +ptrdiff_t str_find_char(const str *s, char c) { return str_slc_find_char(_strslc(s), c); } -size_t str_find_char_right(const str *s, char c) { +ptrdiff_t str_find_char_right(const str *s, char c) { return str_slc_find_char_right(_strslc(s), c); } -- cgit v1.2.3