| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -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/<category>/<category>_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/<category>/<category>_example_name.png | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            FileCopy(exTemplateScreenshot, TextFormat("%s/%s/%s.png", exBasePath, exCategory, exName)); // WARNING: To be updated manually! | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // Copy: raylib/examples/<category>/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) | <img src="core/core_basic_window.png" alt="core_basic_window" width="80"> | ⭐️☆☆☆ | 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 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                        // l">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)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                    } | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |