From 9d72c50f34e9eac3ee8295ae642b0297e49b8cbb Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Sat, 10 Feb 2024 01:50:01 -0500 Subject: [PATCH] Add `versionToString` function --- semver.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/semver.c b/semver.c index 40f5d24..33e7025 100644 --- a/semver.c +++ b/semver.c @@ -1,4 +1,8 @@ #include "semver.h" +#include "epoch.h" +#include +#include +#include u128 u128FromVersion(Version *self) { u128 out = 0; @@ -28,8 +32,6 @@ u128 u128FromVersion(Version *self) { build = (uint64_t)self->vk_data.extended.build << 16; out = (u128)(major | minor | patch | build) << 64; break; - default: - break; } switch (self->pr_tag) { case Alpha: @@ -55,8 +57,6 @@ u128 u128FromVersion(Version *self) { case PRNone: out |= ((u128)0100000 << 64); break; - default: - break; } return out; } @@ -78,3 +78,90 @@ Comparison compareVersion(Version *self, Version *other) { return CompNone; } +char *archToString(Arch self) { + switch (self) { + case any: return "any"; + case arm: return "arm"; + case arm64: return "aarch64"; + case loongson: return "loongson"; + case mips32: return "mips32"; + case mips64: return "mips64"; + case powerepc: return "ppc"; + case powerpc64: return "ppc64"; + case riscv64: return "riscv64"; + case s390x: return "s390x"; + case sparc: return "sparc"; + case sparc64: return "sparc64"; + case x86: return "x86"; + case x86_64: return "x86_64"; + } + return NULL; +} + +char *versionToString(Version *self) { + char *buf, *temp; + + buf = calloc(75, sizeof(char)); + if (buf == NULL) return NULL; + temp = calloc(50, sizeof(char)); + if (temp == NULL) { + free(buf); + return NULL; + } + switch (self->vk_tag) { + case Simple: + snprintf(buf, 6, "%d", self->vk_data.simple.major); + break; + case Rapid: + snprintf(buf, 13, "%d.%d", self->vk_data.rapid.major, self->vk_data.rapid.minor); + break; + case SemVer: + snprintf( + buf, 20, "%d.%d.%d", + self->vk_data.semver.major, + self->vk_data.semver.minor, + self->vk_data.semver.patch + ); + break; + case Extended: + snprintf( + buf, 27, "%d.%d.%d.%d", + self->vk_data.extended.major, + self->vk_data.extended.minor, + self->vk_data.extended.patch, + self->vk_data.extended.build + ); + break; + } + switch (self->pr_tag) { + case PRNone: + snprintf(temp, 9, "-%s", archToString(self->arch)); + break; + case Alpha: + snprintf(temp, 25, "_alpha%d-%s", self->pr_data.alpha, archToString(self->arch)); + break; + case Beta: + snprintf(temp, 25, "_beta%d-%s", self->pr_data.beta, archToString(self->arch)); + break; + case ReleaseCandidate: + snprintf(temp, 25, "_rc%d-%s", self->pr_data.rc, archToString(self->arch)); + break; + case GitRev: + snprintf( + temp, 30, "_git_%c%c%c%c%c%c%c.%li-%s", + self->pr_data.git->hash[0], + self->pr_data.git->hash[1], + self->pr_data.git->hash[2], + self->pr_data.git->hash[3], + self->pr_data.git->hash[4], + self->pr_data.git->hash[5], + self->pr_data.git->hash[6], + dateTimeGetTimestamp(&self->pr_data.git->dt), + archToString(self->arch) + ); + } + strncat(buf, temp, 50); + free(temp); + return buf; +} +