|
@@ -749,6 +749,53 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
// 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!
|
|
|
int exCollectionCount = 0;
|
|
|
rlExampleInfo *exCollection = LoadExamplesData(exCollectionFilePath, "ALL", false, &exCollectionCount);
|
|
@@ -1566,12 +1613,13 @@ static void UnloadTextLines(char **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 *exInfo = (rlExampleInfo *)RL_CALLOC(1, sizeof(rlExampleInfo));
|
|
|
|
|
|
- if (IsFileExtension(exFileName, ".c"))
|
|
|
+ if (FileExists(exFileName) && IsFileExtension(exFileName, ".c"))
|
|
|
{
|
|
|
strcpy(exInfo->name, GetFileNameWithoutExt(exFileName));
|
|
|
strncpy(exInfo->category, exInfo->name, TextFindIndex(exInfo->name, "_"));
|
|
@@ -1747,16 +1795,21 @@ static char **ScanExampleResources(const char *filePath, int *resPathCount)
|
|
|
strncpy(buffer, start, len);
|
|
|
buffer[len] = '\0';
|
|
|
|
|
|
+ // TODO: Make sure buffer is a path (and not a Tracelog() text)
|
|
|
+
|
|
|
// Check for known extensions
|
|
|
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]))
|
|
|
{
|
|
|
// Avoid duplicates
|
|
|
bool found = false;
|
|
|
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))
|