Simplify data structures

This commit is contained in:
Nathan Fisher 2024-02-10 23:18:06 -05:00
parent b035e0018a
commit d67b34519f
2 changed files with 65 additions and 74 deletions

View file

@ -3,28 +3,6 @@
#define u128 __uint128_t
typedef struct {
uint16_t major;
} __Simple;
typedef struct {
uint16_t major;
uint16_t minor;
} __Rapid;
typedef struct {
uint16_t major;
uint16_t minor;
uint16_t patch;
} __SemVer;
typedef struct {
uint16_t major;
uint16_t minor;
uint16_t patch;
uint16_t build;
} __Extended;
typedef enum {
Simple,
Rapid,
@ -63,31 +41,39 @@ typedef enum {
} Arch;
typedef struct {
PreReleaseTag pr_tag;
PreReleaseTag tag;
union {
uint16_t alpha;
uint16_t beta;
uint16_t rc;
GitRevision *git;
GitRevision git;
};
} PreRelease;
typedef struct {
VersionKindTag vk_tag;
VersionKindTag vk_tag;
union {
__Simple simple;
__Rapid rapid;
__SemVer semver;
__Extended extended;
} vk_data;
PreReleaseTag pr_tag;
union {
uint16_t alpha;
uint16_t beta;
uint16_t rc;
GitRevision *git;
} pr_data;
Arch arch;
struct {
uint16_t major;
} simple;
struct {
uint16_t major;
uint16_t minor;
} rapid;
struct {
uint16_t major;
uint16_t minor;
uint16_t patch;
} semver;
struct {
uint16_t major;
uint16_t minor;
uint16_t patch;
uint16_t build;
} extended;
};
PreRelease pr;
Arch arch;
} Version;
typedef enum {

View file

@ -13,46 +13,46 @@ u128 u128FromVersion(Version *self) {
switch (self->vk_tag) {
case Simple:
out |= ((u128)self->vk_data.simple.major << (64 + 52));
out |= ((u128)self->simple.major << (64 + 52));
break;
case Rapid:
major = (uint64_t)self->vk_data.rapid.major << 52;
minor = (uint64_t)self->vk_data.rapid.minor << 40;
major = (uint64_t)self->rapid.major << 52;
minor = (uint64_t)self->rapid.minor << 40;
out = (u128)(major | minor) << 64;
break;
case SemVer:
major = (uint64_t)self->vk_data.semver.major << 52;
minor = (uint64_t)self->vk_data.semver.minor << 40;
patch = (uint64_t)self->vk_data.semver.patch << 28;
major = (uint64_t)self->semver.major << 52;
minor = (uint64_t)self->semver.minor << 40;
patch = (uint64_t)self->semver.patch << 28;
out = (u128)(major | minor | patch) << 64;
break;
case Extended:
major = (uint64_t)self->vk_data.extended.major << 52;
minor = (uint64_t)self->vk_data.extended.minor << 40;
patch = (uint64_t)self->vk_data.extended.patch << 28;
build = (uint64_t)self->vk_data.extended.build << 16;
major = (uint64_t)self->extended.major << 52;
minor = (uint64_t)self->extended.minor << 40;
patch = (uint64_t)self->extended.patch << 28;
build = (uint64_t)self->extended.build << 16;
out = (u128)(major | minor | patch | build) << 64;
break;
}
switch (self->pr_tag) {
switch (self->pr.tag) {
case Alpha:
out |= ((u128)010000 << 64);
pre = self->pr_data.alpha & mask;
pre = self->pr.alpha & mask;
out |= ((u128)pre << 64);
break;
case Beta:
out |= ((u128)020000 << 64);
pre = self->pr_data.beta & mask;
pre = self->pr.beta & mask;
out |= ((u128)pre << 64);
break;
case ReleaseCandidate:
out |= ((u128)040000 << 64);
pre = self->pr_data.rc & mask;
pre = self->pr.rc & mask;
out |= ((u128)pre << 64);
break;
case GitRev:
out |= ((u128)01000 << 64);
ts = dateTimeGetTimestamp(&self->pr_data.git->dt);
ts = dateTimeGetTimestamp(&self->pr.git.dt);
out |= (u128)ts;
break;
case PRNone:
@ -106,6 +106,11 @@ int parseArch(char *s) {
return -1;
}
int parsePreRelease(PreRelease *pr, const char *s) {
// todo
return -1;
}
int parseVersion(Version *self, const char *s) {
// todo
return -1;
@ -123,53 +128,53 @@ char *versionToString(Version *self) {
}
switch (self->vk_tag) {
case Simple:
snprintf(buf, 6, "%d", self->vk_data.simple.major);
snprintf(buf, 6, "%d", self->simple.major);
break;
case Rapid:
snprintf(buf, 13, "%d.%d", self->vk_data.rapid.major, self->vk_data.rapid.minor);
snprintf(buf, 13, "%d.%d", self->rapid.major, self->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
self->semver.major,
self->semver.minor,
self->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
self->extended.major,
self->extended.minor,
self->extended.patch,
self->extended.build
);
break;
}
switch (self->pr_tag) {
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));
snprintf(temp, 25, "_alpha%d-%s", self->pr.alpha, archToString(self->arch));
break;
case Beta:
snprintf(temp, 25, "_beta%d-%s", self->pr_data.beta, archToString(self->arch));
snprintf(temp, 25, "_beta%d-%s", self->pr.beta, archToString(self->arch));
break;
case ReleaseCandidate:
snprintf(temp, 25, "_rc%d-%s", self->pr_data.rc, archToString(self->arch));
snprintf(temp, 25, "_rc%d-%s", self->pr.rc, archToString(self->arch));
break;
case GitRev:
snprintf(
temp, 50, "_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),
self->pr.git.hash[0],
self->pr.git.hash[1],
self->pr.git.hash[2],
self->pr.git.hash[3],
self->pr.git.hash[4],
self->pr.git.hash[5],
self->pr.git.hash[6],
dateTimeGetTimestamp(&self->pr.git.dt),
archToString(self->arch)
);
}