mirror of
https://github.com/raysan5/raylib.git
synced 2026-01-18 13:41:26 +01:00
REXM: Validate examples list against existing examples in repo
This commit is contained in:
@ -749,6 +749,53 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// TODO: Log more details about the validation process
|
// TODO: Log more details about the validation process
|
||||||
|
|
||||||
|
// Scan available example .c files and add to collection missing ones
|
||||||
|
// NOTE: Source of truth is what we have in the examples directories (on validation/update)
|
||||||
|
FilePathList list = LoadDirectoryFilesEx(exBasePath, ".c", true);
|
||||||
|
|
||||||
|
const char *exList = LoadFileText(exCollectionFilePath);
|
||||||
|
char *exListUpdated = (char *)RL_CALLOC(REXM_MAX_BUFFER_SIZE, 1);
|
||||||
|
bool listUpdated = false;
|
||||||
|
|
||||||
|
int exListLen = strlen(exList);
|
||||||
|
strcpy(exListUpdated, exList);
|
||||||
|
|
||||||
|
for (int i = 0; i < list.count; i++)
|
||||||
|
{
|
||||||
|
if ((strcmp("examples_template", GetFileNameWithoutExt(list.paths[i])) != 0) && // HACK: Skip "examples_template"
|
||||||
|
(TextFindIndex(exList, GetFileNameWithoutExt(list.paths[i])) == -1))
|
||||||
|
{
|
||||||
|
// Add example to the examples collection list
|
||||||
|
// WARNING: Added to the end of the list, order must be set by users and
|
||||||
|
// defines placement on raylib webpage
|
||||||
|
rlExampleInfo *exInfo = LoadExampleInfo(list.paths[i]);
|
||||||
|
|
||||||
|
// Get example difficulty stars
|
||||||
|
char starsText[16] = { 0 };
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
// NOTE: Every UTF-8 star are 3 bytes
|
||||||
|
if (i < exInfo->stars) strcpy(starsText + 3*i, "★");
|
||||||
|
else strcpy(starsText + 3*i, "☆");
|
||||||
|
}
|
||||||
|
|
||||||
|
exListLen += sprintf(exListUpdated + exListLen,
|
||||||
|
TextFormat("%s;%s;%s;%.2f;%.2f;\"%s\";@%s\n",
|
||||||
|
exInfo->category, exInfo->name, starsText, exInfo->verCreated,
|
||||||
|
exInfo->verUpdated, exInfo->author, exInfo->authorGitHub));
|
||||||
|
|
||||||
|
listUpdated = true;
|
||||||
|
UnloadExampleInfo(exInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (listUpdated) SaveFileText(exCollectionFilePath, exListUpdated);
|
||||||
|
|
||||||
|
UnloadFileText(exList);
|
||||||
|
RL_FREE(exListUpdated);
|
||||||
|
|
||||||
|
UnloadDirectoryFiles(list);
|
||||||
|
|
||||||
// Check all examples in collection [examples_list.txt] -> Source of truth!
|
// Check all examples in collection [examples_list.txt] -> Source of truth!
|
||||||
int exCollectionCount = 0;
|
int exCollectionCount = 0;
|
||||||
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, "ALL", false, &exCollectionCount);
|
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, "ALL", false, &exCollectionCount);
|
||||||
@ -1566,12 +1613,13 @@ static void UnloadTextLines(char **lines)
|
|||||||
RL_FREE(lines);
|
RL_FREE(lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get example info from file header
|
// Get example info from example file header
|
||||||
|
// NOTE: Expecting the example to follow raylib_example_template.c
|
||||||
rlExampleInfo *LoadExampleInfo(const char *exFileName)
|
rlExampleInfo *LoadExampleInfo(const char *exFileName)
|
||||||
{
|
{
|
||||||
rlExampleInfo *exInfo = (rlExampleInfo *)RL_CALLOC(1, sizeof(rlExampleInfo));
|
rlExampleInfo *exInfo = (rlExampleInfo *)RL_CALLOC(1, sizeof(rlExampleInfo));
|
||||||
|
|
||||||
if (IsFileExtension(exFileName, ".c"))
|
if (FileExists(exFileName) && IsFileExtension(exFileName, ".c"))
|
||||||
{
|
{
|
||||||
strcpy(exInfo->name, GetFileNameWithoutExt(exFileName));
|
strcpy(exInfo->name, GetFileNameWithoutExt(exFileName));
|
||||||
strncpy(exInfo->category, exInfo->name, TextFindIndex(exInfo->name, "_"));
|
strncpy(exInfo->category, exInfo->name, TextFindIndex(exInfo->name, "_"));
|
||||||
@ -1747,16 +1795,21 @@ static char **ScanExampleResources(const char *filePath, int *resPathCount)
|
|||||||
strncpy(buffer, start, len);
|
strncpy(buffer, start, len);
|
||||||
buffer[len] = '\0';
|
buffer[len] = '\0';
|
||||||
|
|
||||||
|
// TODO: Make sure buffer is a path (and not a Tracelog() text)
|
||||||
|
|
||||||
// Check for known extensions
|
// Check for known extensions
|
||||||
for (int i = 0; i < extCount; i++)
|
for (int i = 0; i < extCount; i++)
|
||||||
{
|
{
|
||||||
|
// TODO: WARNING: IsFileExtension() expects a NULL terminated fileName,
|
||||||
|
// but in this case buffer can contain any kind of string,
|
||||||
|
// including not paths strings, for example TraceLog() string
|
||||||
if (IsFileExtension(buffer, exts[i]))
|
if (IsFileExtension(buffer, exts[i]))
|
||||||
{
|
{
|
||||||
// Avoid duplicates
|
// Avoid duplicates
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int j = 0; j < resCounter; j++)
|
for (int j = 0; j < resCounter; j++)
|
||||||
{
|
{
|
||||||
if (TextIsEqual(paths[j], buffer)) { found = true; break; }
|
if (strcmp(paths[j], buffer) == 0) { found = true; break; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found && (resCounter < REXM_MAX_RESOURCE_PATHS))
|
if (!found && (resCounter < REXM_MAX_RESOURCE_PATHS))
|
||||||
|
|||||||
Reference in New Issue
Block a user