From e4fe1c57405c9fbb9638dbd36ad73aadeb8b1f1a Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Mon, 12 Feb 2024 19:05:52 -0500 Subject: [PATCH] Add `parseGitRev` function --- semver.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/semver.c b/semver.c index 6bd24db..e09450a 100644 --- a/semver.c +++ b/semver.c @@ -106,7 +106,7 @@ int parseArch(char *s) { return -1; } -uint16_t parseNumNonZero(char *vp, long *out) { +uint16_t parseU12NonZero(char *vp, long *out) { long val; char *ep; @@ -114,7 +114,7 @@ uint16_t parseNumNonZero(char *vp, long *out) { *out = 0; } val = strtol(vp, &ep, 10); - if (vp != ep && ep == NULL && val <= U12_MAX) { + if (vp != ep && ep == NULL && val <= U12_MAX && val > 0) { *out = val; } else { return 1; @@ -123,8 +123,27 @@ uint16_t parseNumNonZero(char *vp, long *out) { } int parseGitRev(char *vp, GitRevision *git) { - // todo - return 1; + char hash[7]; + int64_t ts; + char *hash_str, *ts_str, *ep; + int i; + + hash_str = strtok(vp, "."); + if (hash_str == NULL) return 1; + if (strnlen(hash_str, 8) != 7) return 2; + for (i = 0; i < 7; i++) { + hash[i] = hash_str[i]; + } + ts_str = strtok(NULL, "."); + if (ts_str == NULL) return 1; + ts = strtoll(ts_str, &ep, 10); + if (ts_str == ep || ep != NULL) return 3; + if (strtok(NULL, ".") != NULL) return 4; + for (i = 0; i < 7; i++) { + git->hash[i] = hash[i]; + } + dateTimeFromTimestampParts(ts, 0, &git->dt); + return 0; } int parsePreRelease(PreRelease *pr, char *s) { @@ -139,17 +158,17 @@ int parsePreRelease(PreRelease *pr, char *s) { if (strncasecmp(s, "alpha", 5) == 0) { tag = Alpha; vp = s + 5; - if (parseNumNonZero(vp, &val) != 0) + if (parseU12NonZero(vp, &val) != 0) return 1; } else if (strncasecmp(s, "beta", 4) == 0) { tag = Beta; vp = s + 4; - if (parseNumNonZero(vp, &val) != 0) + if (parseU12NonZero(vp, &val) != 0) return 1; } else if (strncasecmp(s, "rc", 2) == 0) { tag = ReleaseCandidate; vp = s + 2; - if (parseNumNonZero(vp, &val) != 0) + if (parseU12NonZero(vp, &val) != 0) return 1; } else if (strncasecmp(s, "git_", 4) == 0) { tag = GitRev;