refactor: centralize module identity logic and upgrade lookup
- Move extract_module_id and is_valid_module_file to module.c - Update is_module_loaded to return module index instead of uint8_t - Fix platform.c event checks to handle index-based return (>= 0) - Centralize STK_MODULE_EXT definitions in stk.h
This commit is contained in:
@@ -9,6 +9,20 @@
|
|||||||
#define STK_PATH_MAX 256
|
#define STK_PATH_MAX 256
|
||||||
#define STK_PATH_MAX_OS 4096
|
#define STK_PATH_MAX_OS 4096
|
||||||
|
|
||||||
|
#if defined(__linux__) || defined(_WIN32)
|
||||||
|
#define STK_EVENT_BUFFER 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#define STK_MODULE_EXT ".dll"
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#define STK_MODULE_EXT ".dylib"
|
||||||
|
#else
|
||||||
|
#define STK_MODULE_EXT ".so"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STK_MODULE_EXT_LEN (sizeof(STK_MODULE_EXT) - 1)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "stk.h"
|
#include "stk.h"
|
||||||
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -17,6 +18,79 @@ size_t module_count = 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)
|
||||||
|
{
|
||||||
|
const char *basename;
|
||||||
|
char *dot;
|
||||||
|
|
||||||
|
basename = strrchr(path, '/');
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (!basename)
|
||||||
|
basename = strrchr(path, '\\');
|
||||||
|
#endif
|
||||||
|
if (!basename)
|
||||||
|
basename = path;
|
||||||
|
else
|
||||||
|
basename++;
|
||||||
|
|
||||||
|
strncpy(out_id, basename, STK_MOD_ID_BUFFER - 1);
|
||||||
|
out_id[STK_MOD_ID_BUFFER - 1] = '\0';
|
||||||
|
|
||||||
|
dot = strrchr(out_id, '.');
|
||||||
|
if (dot)
|
||||||
|
*dot = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t is_valid_module_file(const char *filename)
|
||||||
|
{
|
||||||
|
const char *ext;
|
||||||
|
size_t name_len;
|
||||||
|
|
||||||
|
if (!filename)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
name_len = strlen(filename);
|
||||||
|
|
||||||
|
if (name_len <= STK_MODULE_EXT_LEN)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ext = filename + (name_len - STK_MODULE_EXT_LEN);
|
||||||
|
return strcmp(ext, STK_MODULE_EXT) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_module_loaded(const char *filename,
|
||||||
|
char (*loaded_module_ids)[STK_MOD_ID_BUFFER],
|
||||||
|
size_t loaded_count)
|
||||||
|
{
|
||||||
|
char module_id[STK_MOD_ID_BUFFER];
|
||||||
|
const char *basename;
|
||||||
|
char *dot;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
basename = strrchr(filename, '/');
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (!basename)
|
||||||
|
basename = strrchr(filename, '\\');
|
||||||
|
#endif
|
||||||
|
if (!basename)
|
||||||
|
basename = filename;
|
||||||
|
else
|
||||||
|
basename++;
|
||||||
|
|
||||||
|
strncpy(module_id, basename, STK_MOD_ID_BUFFER - 1);
|
||||||
|
module_id[STK_MOD_ID_BUFFER - 1] = '\0';
|
||||||
|
|
||||||
|
dot = strrchr(module_id, '.');
|
||||||
|
if (dot)
|
||||||
|
*dot = '\0';
|
||||||
|
|
||||||
|
for (i = 0; i < loaded_count; i++)
|
||||||
|
if (strcmp(loaded_module_ids[i], module_id) == 0)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int stk_module_load(const char *path, int index)
|
int stk_module_load(const char *path, int index)
|
||||||
{
|
{
|
||||||
void *handle;
|
void *handle;
|
||||||
|
|||||||
+9
-66
@@ -1,4 +1,5 @@
|
|||||||
#include "stk.h"
|
#include "stk.h"
|
||||||
|
#include <bits/stdint-uintn.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -22,69 +23,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__linux__) || defined(_WIN32)
|
uint8_t is_module_loaded(const char *filename,
|
||||||
#define STK_EVENT_BUFFER 4096
|
char (*loaded_module_ids)[STK_MOD_ID_BUFFER],
|
||||||
#endif
|
size_t loaded_count);
|
||||||
|
uint8_t is_valid_module_file(const char *filename);
|
||||||
#if defined(_WIN32)
|
|
||||||
#define STK_MODULE_EXT ".dll"
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
#define STK_MODULE_EXT ".dylib"
|
|
||||||
#else
|
|
||||||
#define STK_MODULE_EXT ".so"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define STK_MODULE_EXT_LEN (sizeof(STK_MODULE_EXT) - 1)
|
|
||||||
|
|
||||||
static uint8_t is_valid_module_file(const char *filename)
|
|
||||||
{
|
|
||||||
const char *ext;
|
|
||||||
size_t name_len;
|
|
||||||
|
|
||||||
if (!filename)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
name_len = strlen(filename);
|
|
||||||
|
|
||||||
if (name_len <= STK_MODULE_EXT_LEN)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ext = filename + (name_len - STK_MODULE_EXT_LEN);
|
|
||||||
return strcmp(ext, STK_MODULE_EXT) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t is_module_loaded(const char *filename,
|
|
||||||
char (*loaded_module_ids)[STK_MOD_ID_BUFFER],
|
|
||||||
size_t loaded_count)
|
|
||||||
{
|
|
||||||
char module_id[STK_MOD_ID_BUFFER];
|
|
||||||
const char *basename;
|
|
||||||
char *dot;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
basename = strrchr(filename, '/');
|
|
||||||
#ifdef _WIN32
|
|
||||||
if (!basename)
|
|
||||||
basename = strrchr(filename, '\\');
|
|
||||||
#endif
|
|
||||||
if (!basename)
|
|
||||||
basename = filename;
|
|
||||||
else
|
|
||||||
basename++;
|
|
||||||
|
|
||||||
strncpy(module_id, basename, STK_MOD_ID_BUFFER - 1);
|
|
||||||
module_id[STK_MOD_ID_BUFFER - 1] = '\0';
|
|
||||||
|
|
||||||
dot = strrchr(module_id, '.');
|
|
||||||
if (dot)
|
|
||||||
*dot = '\0';
|
|
||||||
|
|
||||||
for (i = 0; i < loaded_count; i++)
|
|
||||||
if (strcmp(loaded_module_ids[i], module_id) == 0)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int platform_mkdir(const char *path)
|
int platform_mkdir(const char *path)
|
||||||
{
|
{
|
||||||
@@ -535,7 +477,7 @@ stk_module_event_t *platform_directory_watch_check(
|
|||||||
(event->mask & (IN_CLOSE_WRITE | IN_MOVED_TO))
|
(event->mask & (IN_CLOSE_WRITE | IN_MOVED_TO))
|
||||||
? (is_module_loaded(event->name,
|
? (is_module_loaded(event->name,
|
||||||
loaded_module_ids,
|
loaded_module_ids,
|
||||||
loaded_count)
|
loaded_count) >= 0
|
||||||
? STK_MOD_RELOAD
|
? STK_MOD_RELOAD
|
||||||
: STK_MOD_LOAD)
|
: STK_MOD_LOAD)
|
||||||
: STK_MOD_UNLOAD;
|
: STK_MOD_UNLOAD;
|
||||||
@@ -611,7 +553,7 @@ stk_module_event_t *platform_directory_watch_check(
|
|||||||
FILE_ACTION_RENAMED_OLD_NAME)
|
FILE_ACTION_RENAMED_OLD_NAME)
|
||||||
? (is_module_loaded((*file_list)[index],
|
? (is_module_loaded((*file_list)[index],
|
||||||
loaded_module_ids,
|
loaded_module_ids,
|
||||||
loaded_count)
|
loaded_count) >= 0
|
||||||
? STK_MOD_RELOAD
|
? STK_MOD_RELOAD
|
||||||
: STK_MOD_LOAD)
|
: STK_MOD_LOAD)
|
||||||
: STK_MOD_UNLOAD;
|
: STK_MOD_UNLOAD;
|
||||||
@@ -683,7 +625,8 @@ stk_module_event_t *platform_directory_watch_check(
|
|||||||
if (!old_snap || old_snap->mtime != new_snapshots[i].mtime) {
|
if (!old_snap || old_snap->mtime != new_snapshots[i].mtime) {
|
||||||
events[index] =
|
events[index] =
|
||||||
is_module_loaded(new_snapshots[i].filename,
|
is_module_loaded(new_snapshots[i].filename,
|
||||||
loaded_module_ids, loaded_count)
|
loaded_module_ids,
|
||||||
|
loaded_count) >= 0
|
||||||
? STK_MOD_RELOAD
|
? STK_MOD_RELOAD
|
||||||
: STK_MOD_LOAD;
|
: STK_MOD_LOAD;
|
||||||
strncpy((*file_list)[index], new_snapshots[i].filename,
|
strncpy((*file_list)[index], new_snapshots[i].filename,
|
||||||
|
|||||||
Reference in New Issue
Block a user