diff options
| author | dacctal <donotcontactmevia@email.invalid> | 2026-07-02 07:29:38 +0000 |
|---|---|---|
| committer | dacctal <donotcontactmevia@email.invalid> | 2026-07-02 07:29:38 +0000 |
| commit | 96463c0d8952bae8d62adec02ce9e6b79d558938 (patch) | |
| tree | d16f5bd78ea5b39b31ab88f1be071d80a1fd751e | |
| parent | 2c99a3d8d74f58e4cc7974c4092c82cd6095ff48 (diff) | |
pkg_create checkpoint!
| -rw-r--r-- | include/str.h | 15 | ||||
| -rw-r--r-- | src/main.c | 9 | ||||
| -rw-r--r-- | src/pkg_create.c | 59 | ||||
| -rw-r--r-- | src/str.c | 4 |
4 files changed, 63 insertions, 24 deletions
diff --git a/include/str.h b/include/str.h index 8623312..3a4aefb 100644 --- a/include/str.h +++ b/include/str.h @@ -415,13 +415,13 @@ char str_last(const str *s); * Finds a character c in s, from the left to the right. * Returns -1 on failure */ -size_t str_find_char(const str *s, char c); +ptrdiff_t str_find_char(const str *s, char c); /** * Finds a character c in s from the right to the left. * Returns s->len on failure. */ -size_t str_find_char_right(const str *s, char c); +ptrdiff_t str_find_char_right(const str *s, char c); void str_print(const str *s); @@ -481,37 +481,26 @@ str_slc str_slc_slice(const str_slc s, ptrdiff_t begin, ptrdiff_t end); str str_slc_slice_to_str(const str_slc s, ptrdiff_t begin, ptrdiff_t end); str str_slc_to_lower(const str_slc s); - str str_slc_to_upper(const str_slc s); str_slc str_slc_trim_left(const str_slc s); - str_slc str_slc_trim_right(const str_slc s); - str_slc str_slc_trim(const str_slc s); size_t str_slc_to_double_pro(const str_slc src, double *res); - size_t str_slc_to_int64_pro(const str_slc src, int64_t *res, int base); - bool str_slc_to_double(const str_slc src, double *res); - bool str_slc_to_int64(const str_slc src, int64_t *res); bool str_slc_write_to_file(const str_slc src, FILE *f); char str_slc_first(const str_slc s); - char str_slc_last(const str_slc s); - char str_slc_at(const str_slc s, size_t i); void str_slc_print(const str_slc s); - void str_slc_println(const str_slc s); - void str_slc_fprint(const str_slc s, FILE *f); - void str_slc_fprintln(const str_slc s, FILE *f); /** @@ -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); @@ -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); } |
