feat(module.c): add internal version parsing and constraint validation
This commit is contained in:
@@ -8,6 +8,13 @@
|
|||||||
typedef int (*stk_init_mod_func)(void);
|
typedef int (*stk_init_mod_func)(void);
|
||||||
typedef void (*stk_shutdown_mod_func)(void);
|
typedef void (*stk_shutdown_mod_func)(void);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned char major;
|
||||||
|
unsigned char minor;
|
||||||
|
unsigned char patch;
|
||||||
|
char op;
|
||||||
|
} stk_version_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char id[STK_MOD_ID_BUFFER];
|
char id[STK_MOD_ID_BUFFER];
|
||||||
char version[STK_MOD_VERSION_BUFFER];
|
char version[STK_MOD_VERSION_BUFFER];
|
||||||
@@ -45,6 +52,64 @@ static char stk_mod_dependencies_fn[STK_MOD_FUNC_NAME_BUFFER] =
|
|||||||
|
|
||||||
size_t module_count = 0;
|
size_t module_count = 0;
|
||||||
|
|
||||||
|
static stk_version_t stk_parse_version(const char *str)
|
||||||
|
{
|
||||||
|
stk_version_t v;
|
||||||
|
v.major = 0;
|
||||||
|
v.minor = 0;
|
||||||
|
v.patch = 0;
|
||||||
|
v.op = '>';
|
||||||
|
|
||||||
|
if (!str || !*str)
|
||||||
|
return v;
|
||||||
|
|
||||||
|
if (*str == '=' && *(str + 1) != '=') {
|
||||||
|
v.op = '=';
|
||||||
|
str++;
|
||||||
|
} else if (*str == '>' && *(str + 1) == '=') {
|
||||||
|
v.op = '>';
|
||||||
|
str += 2;
|
||||||
|
} else if (*str == '^') {
|
||||||
|
v.op = '^';
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
v.major = (unsigned char)strtol(str, (char **)&str, 10);
|
||||||
|
if (*str == '.')
|
||||||
|
str++;
|
||||||
|
v.minor = (unsigned char)strtol(str, (char **)&str, 10);
|
||||||
|
if (*str == '.')
|
||||||
|
str++;
|
||||||
|
v.patch = (unsigned char)strtol(str, NULL, 10);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stk_compare_version(stk_version_t a, stk_version_t b)
|
||||||
|
{
|
||||||
|
if (a.major != b.major)
|
||||||
|
return a.major - b.major;
|
||||||
|
if (a.minor != b.minor)
|
||||||
|
return a.minor - b.minor;
|
||||||
|
return a.patch - b.patch;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stk_validate_constraint(const char *constraint, const char *loaded)
|
||||||
|
{
|
||||||
|
stk_version_t req = stk_parse_version(constraint);
|
||||||
|
stk_version_t have = stk_parse_version(loaded);
|
||||||
|
int cmp = stk_compare_version(have, req);
|
||||||
|
|
||||||
|
switch (req.op) {
|
||||||
|
case '=':
|
||||||
|
return cmp == 0;
|
||||||
|
case '^':
|
||||||
|
return have.major == req.major && cmp >= 0;
|
||||||
|
default:
|
||||||
|
return cmp >= 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t stk_module_count(void) { return module_count; }
|
size_t stk_module_count(void) { return module_count; }
|
||||||
|
|
||||||
void extract_module_id(const char *path, char *out_id)
|
void extract_module_id(const char *path, char *out_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user