diff --git a/examples/rexm.c b/examples/rexm.c index 6804546f5..c090b69f9 100644 --- a/examples/rexm.c +++ b/examples/rexm.c @@ -152,11 +152,27 @@ int main(int argc, char *argv[]) else if (argc > 3) LOG("WARNING: Too many arguments provided\n"); else { - // TODO: Additional security checks for file name? + // Security checks for file name to verify category is included + int catIndex = TextFindIndex(argv[2], "_"); + if (catIndex > 3) + { + char cat[12] = { 0 }; + strncpy(cat, argv[2], catIndex); + bool catFound = false; + for (int i = 0; i < MAX_EXAMPLE_CATEGORIES; i++) + { + if (TextIsEqual(cat, exCategories[i])) { catFound = true; break; } + } - strcpy(exName, argv[2]); // Register filename for new example creation - strncpy(exCategory, exName, TextFindIndex(exName, "_")); - opCode = 1; + if (catFound) + { + strcpy(exName, argv[2]); // Register filename for new example creation + strncpy(exCategory, exName, TextFindIndex(exName, "_")); + opCode = OP_CREATE; + } + else LOG("WARNING: Example category is not valid\n"); + } + else LOG("WARNING: Example name does not include category\n"); } } else if (strcmp(argv[1], "add") == 0) @@ -170,10 +186,28 @@ int main(int argc, char *argv[]) { if (FileExists(inFileName)) { - strcpy(inFileName, argv[2]); // Register filename for addition - strcpy(exName, GetFileNameWithoutExt(argv[2])); // Register example name - strncpy(exCategory, exName, TextFindIndex(exName, "_")); - opCode = 2; + // Security checks for file name to verify category is included + int catIndex = TextFindIndex(argv[2], "_"); + if (catIndex > 3) + { + char cat[12] = { 0 }; + strncpy(cat, argv[2], catIndex); + bool catFound = false; + for (int i = 0; i < MAX_EXAMPLE_CATEGORIES; i++) + { + if (TextIsEqual(cat, exCategories[i])) { catFound = true; break; } + } + + if (catFound) + { + strcpy(inFileName, argv[2]); // Register filename for addition + strcpy(exName, GetFileNameWithoutExt(argv[2])); // Register example name + strncpy(exCategory, exName, TextFindIndex(exName, "_")); + opCode = OP_ADD; + } + else LOG("WARNING: Example category is not valid\n"); + } + else LOG("WARNING: Example name does not include category\n"); } else LOG("WARNING: Input file not found, include path\n"); } @@ -186,11 +220,27 @@ int main(int argc, char *argv[]) else if (argc > 4) LOG("WARNING: Too many arguments provided\n"); else { - strcpy(exName, argv[2]); // Register example name - strncpy(exCategory, exName, TextFindIndex(exName, "_")); - strcpy(exRename, argv[3]); - // TODO: Consider rename with change of category - opCode = 3; + // Verify example exists in collection to be removed + char *exColInfo = LoadFileText(exCollectionListPath); + if (TextFindIndex(exColInfo, argv[2]) != -1) // Example in the collection + { + strcpy(exName, argv[2]); // Register example name + strncpy(exCategory, exName, TextFindIndex(exName, "_")); + strcpy(exRename, argv[3]); + char exReCategory[32] = { 0 }; + strncpy(exReCategory, exRename, TextFindIndex(exRename, "_")); + + if (strcmp(exCategory, exReCategory) != 0) + { + // TODO: Consider rename with change of category + // Remove previous one from collection + // Add new one (copy) to collection + } + + opCode = OP_RENAME; + } + else LOG("WARNING: RENAME: Example not available in the collection\n"); + UnloadFileText(exColInfo); } } else if (strcmp(argv[1], "remove") == 0) @@ -200,20 +250,26 @@ int main(int argc, char *argv[]) else if (argc > 3) LOG("WARNING: Too many arguments provided\n"); else { - strcpy(exName, argv[2]); // Register filename for removal - opCode = 4; + // Verify example exists in collection to be removed + char *exColInfo = LoadFileText(exCollectionListPath); + if (TextFindIndex(exColInfo, argv[2]) != -1) // Example in the collection + { + strcpy(exName, argv[2]); // Register filename for removal + opCode = OP_REMOVE; + } + else LOG("WARNING: REMOVE: Example not available in the collection\n"); + UnloadFileText(exColInfo); } } else if (strcmp(argv[1], "validate") == 0) { - opCode = 5; + // Validate examples in collection + // All examples in collection match all requirements on required files + + opCode = OP_VALIDATE; } } - // Load examples collection information - //exInfo = LoadExamplesData(exCollectionListPath, "core", true, &exInfoCount); - //for (int i = 0; i < exInfoCount; i++) printf("%i - %s [%i]\n", i + 1, exInfo[i].name, exInfo[i].stars); - switch (opCode) { case 1: // Create: New example from template @@ -240,16 +296,18 @@ int main(int argc, char *argv[]) // Add: raylib/examples//_example_name.c if (opCode != 1) FileCopy(inFileName, TextFormat("%s/%s/%s.c", exBasePath, exCategory, exName)); - // TODO: Example to be added could be provided as a .zip, containing resources! - // Create: raylib/examples//_example_name.png FileCopy(exTemplateScreenshot, TextFormat("%s/%s/%s.png", exBasePath, exCategory, exName)); // WARNING: To be updated manually! // Copy: raylib/examples//resources/... // WARNING: To be updated manually! + // TODO: Example to be added could be provided as a .zip, containing resources! // TODO: Copy provided resources to respective directories // Possible strategy: // 1. Scan code file for resources paths -> Resources list + // Look for specific text: '.png"' + // Look for full path, previous '"' + // Be careful with shaders: '.vs"', '.fs"' -> Reconstruct path manually? // 2. Verify paths: resource files exist // 3. Copy files to required resource dir @@ -295,6 +353,8 @@ int main(int argc, char *argv[]) SaveFileText(exCollectionListPath, exColInfoUpdated); RL_FREE(exColInfoUpdated); } + else LOG("WARNING: ADD: Example is already on the collection\n"); + UnloadFileText(exColInfo); //------------------------------------------------------------------------------------------------ @@ -374,7 +434,7 @@ int main(int argc, char *argv[]) // Lines format: | 01 | [core_basic_window](core/core_basic_window.c) | core_basic_window | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) | char *mdText = LoadFileText(TextFormat("%s/README.md", exBasePath)); char *mdTextUpdated = (char *)RL_CALLOC(2*1024*1024, 1); // Updated examples.js copy, 2MB - + int mdListStartIndex = TextFindIndex(mdText, "| 01 | "); int mdIndex = 0; @@ -504,7 +564,7 @@ int main(int argc, char *argv[]) if ((i == 6) && (x == (exCount - 1))) { - // Last line to add, special case to consider + // NOTE: Last line to add, special case to consider jsIndex += sprintf(jsTextUpdated + jsListStartIndex + jsIndex, TextFormat(" exampleEntry('%s', '%s', '%s')];\n", stars, exCatList[x].category, exCatList[x].name + strlen(exCatList[x].category) + 1)); }