Semantic version v2.0 parser and render written in ANSI C with zero dependencies.
Features
* Standard compliant (otherwise, open an issue)
* Version metadata parsing
* Version prerelease parsing
* Version comparison helpers
* Supports comparison operators
* Version render
* Version bump
* Version sanitizer
* 100% test coverage
* No regexp (ANSI C doesn't support it)
* Numeric conversion for sorting/filtering
Usage
Basic comparison:
#include <stdio.h>
#include <semver.h>
char current[] = "1.5.10";
char compare[] = "2.3.0";
int
main(int argc, char *argv[]) {
semver_t current_version = {};
semver_t compare_version = {};
if (semver_parse(current, ¤t_version)
|| semver_parse(compare, &compare_version)) {
fprintf(stderr,"Invalid semver string\n");
return -1;
}
int resolution = semver_compare(compare_version, current_version);
if (resolution == 0) {
printf("Versions %s is equal to: %s\n", compare, current);
}
else if (resolution == -1) {
printf("Version %s is lower than: %s\n", compare, current);
}
else {
printf("Version %s is higher than: %s\n", compare, current);
}
// Free allocated memory when we're done
semver_free(¤t_version);
semver_free(&compare_version);
return 0;
}
Satisfies version:
#include <stdio.h>
#include <semver.h>
semver_t current = {};
semver_t compare = {};
int
main(int argc, char *argv[]) {
semver_parse("1.3.10", ¤t);
semver_parse("1.5.2", &compare);
// Use caret operator for the comparison
char operator[] = "^";
if (semver_satisfies(current, compare, operator)) {
printf("Version %s can be satisfied by %s", "1.3.10", "1.5.2");
}
// Free allocated memory when we're done
semver_free(¤t);
semver_free(&compare);
return 0;
}
Installation
Copy semver.h and semver.c to you source code tree.
API
---
struct semver_t { int major, int minor, int patch,
char * prerelease, char * metadata }
semver base struct.
semver_parse(const char *str, semver_t *ver) => int
Parses a string as semver expression.
Returns:
-1 - In case of invalid semver or parsing error.
0 - All was fine!
semver_compare(semver_t a, semver_t b) => int
Compare versions a with b.
Returns:
-1 in case of lower version.
0 in case of equal versions.
1 in case of higher version.
semver_satisfies(semver_t a, semver_t b, char *operator) => int
Checks if both versions can be satisfied based on the given comparison
operator.
Allowed operators:
= - Equality
>= - Higher or equal to
<= - Lower or equal to
< - Lower than
> - Higher than
^ - Caret operator comparison (more info)
~ - Tilde operator comparison (more info)
Returns:
1 - Can be satisfied
0 - Cannot be satisfied
semver_satisfies_caret(semver_t a, semver_t b) => int
Checks if version x can be satisfied by y performing a comparison with
caret operator.
See: https://docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
Returns:
1 - Can be satisfied
0 - Cannot be satisfied
semver_satisfies_patch(semver_t a, semver_t b) => int
Checks if version x can be satisfied by y performing a comparison with
tilde operator.
See: https://docs.npmjs.com/misc/semver#tilde-ranges-1-2-3-1-2-1
Returns:
1 - Can be satisfied
0 - Cannot be satisfied
semver_eq(semver_t a, semver_t b) => int
Equality comparison.
semver_ne(semver_t a, semver_t b) => int
Non equal comparison.
semver_gt(semver_t a, semver_t b) => int
Greater than comparison.
semver_lt(semver_t a, semver_t b) => int
Lower than comparison.
semver_gte(semver_t a, semver_t b) => int
Greater than or equal comparison.
semver_lte(semver_t a, semver_t b) => int
Lower than or equal comparison.
semver_render(semver_t *v, char *dest) => void
Render as string.
semver_numeric(semver_t *v) => int
Render as numeric value. Useful for ordering and filtering.
semver_bump(semver_t *a) => void
Bump major version.
semver_bump_minor(semver_t *a) => void
Bump minor version.
semver_bump_patch(semver_t *a) => void
Bump patch version.
semver_free(semver_t *a) => void
Helper to free allocated memory from heap.
semver_is_valid(char *str) => int
Checks if the given string is a valid semver expression.
semver_clean(char *str) => int
Removes invalid semver characters in a given string.
License
MIT - Tomas Aparicio
|