diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-02-24 00:14:44 -0500 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-02-24 00:14:44 -0500 |
commit | fbb7f171f56b8f1a167c0ccb112ab1231d202a42 (patch) | |
tree | 08ba91999d0d90b590821f81718e951a7d40c972 | |
parent | 7072c13379a4435c110b148040b3fd89686469cc (diff) | |
download | spmc-fbb7f171f56b8f1a167c0ccb112ab1231d202a42.tar.gz |
Initial commit of resolve.c (deps.c replacement)
-rw-r--r-- | include/resolve.h | 12 | ||||
-rw-r--r-- | src/resolve.c | 47 |
2 files changed, 55 insertions, 4 deletions
diff --git a/include/resolve.h b/include/resolve.h index 52aa5da..ca11cb6 100644 --- a/include/resolve.h +++ b/include/resolve.h @@ -1,8 +1,12 @@ -// -// Created by jhunk on 2/22/20. -// - +/** + * @file resolve.h + */ #ifndef SPM_RESOLVE_H #define SPM_RESOLVE_H +#define SPM_REQUIREMENT_MAX 1024 + +int resolve_has_dependency(const char *archive); +ManifestPackage **resolve_dependencies(ManifestList *manifests, const char *spec); + #endif //SPM_RESOLVE_H diff --git a/src/resolve.c b/src/resolve.c new file mode 100644 index 0000000..0bb207e --- /dev/null +++ b/src/resolve.c @@ -0,0 +1,47 @@ +/** + * Dependency resolution functions + * @file resolve.c + */ +#include "spm.h" + +static ManifestPackage *requirements[SPM_REQUIREMENT_MAX] = {0, }; + +/** + * Scan global `requirements` array for `archive` + * @param archive + * @return 0 = not found, 1 = found + */ +int resolve_has_dependency(const char *archive) { + for (size_t i = 0; requirements[i] != NULL && i < SPM_REQUIREMENT_MAX; i++) { + if (strcmp(requirements[i]->archive, archive) == 0) { + return 1; + } + } + return 0; +} + +/** + * Recursively scan a package for its dependencies + * @param manifests `ManifestList` struct + * @param spec Package name (accepts version specifiers) + * @return success = array of `ManifestPackage`, not found = NULL + */ +ManifestPackage **resolve_dependencies(ManifestList *manifests, const char *spec) { + ManifestPackage *package = manifestlist_search(manifests, spec); + if (package == NULL) { + return NULL; + } + + for (size_t i = 0; i < package->requirements_records && i < SPM_REQUIREMENT_MAX; i++) { + ManifestPackage *requirement = manifestlist_search(manifests, package->requirements[i]); + if (requirement == NULL) { + break; + } + if (resolve_has_dependency(requirement->archive)) { + continue; + } + resolve_dependencies(manifests, requirement->archive); + requirements[i] = requirement; + } + return requirements; +}
\ No newline at end of file |