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 #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 { typedef enum {
Simple, Simple,
Rapid, Rapid,
@ -63,30 +41,38 @@ typedef enum {
} Arch; } Arch;
typedef struct { typedef struct {
PreReleaseTag pr_tag; PreReleaseTag tag;
union { union {
uint16_t alpha; uint16_t alpha;
uint16_t beta; uint16_t beta;
uint16_t rc; uint16_t rc;
GitRevision *git; GitRevision git;
}; };
} PreRelease; } PreRelease;
typedef struct { typedef struct {
VersionKindTag vk_tag; VersionKindTag vk_tag;
union { union {
__Simple simple; struct {
__Rapid rapid; uint16_t major;
__SemVer semver; } simple;
__Extended extended; struct {
} vk_data; uint16_t major;
PreReleaseTag pr_tag; uint16_t minor;
union { } rapid;
uint16_t alpha; struct {
uint16_t beta; uint16_t major;
uint16_t rc; uint16_t minor;
GitRevision *git; uint16_t patch;
} pr_data; } semver;
struct {
uint16_t major;
uint16_t minor;
uint16_t patch;
uint16_t build;
} extended;
};
PreRelease pr;
Arch arch; Arch arch;
} Version; } Version;

View file

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