|
|
@ -80,7 +80,7 @@ |
|
|
|
// Types and Structures Definition |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Type of parsed define |
|
|
|
// Define value type |
|
|
|
typedef enum { |
|
|
|
UNKNOWN = 0, |
|
|
|
MACRO, |
|
|
@ -101,7 +101,7 @@ typedef enum { |
|
|
|
// Define info data |
|
|
|
typedef struct DefineInfo { |
|
|
|
char name[64]; // Define name |
|
|
|
int type; // Define type |
|
|
|
int type; // Define l">type: enum DefineType |
|
|
|
char value[256]; // Define value |
|
|
|
char desc[128]; // Define description |
|
|
|
bool isHex; // Define is hex number (for types INT, LONG) |
|
|
@ -169,7 +169,7 @@ static char apiDefine[32] = { 0 }; // Functions define (i.e. RLAPI for r |
|
|
|
static char truncAfter[32] = { 0 }; // Truncate marker (i.e. "RLGL IMPLEMENTATION" for rlgl.h) |
|
|
|
static int outputFormat = DEFAULT; |
|
|
|
|
|
|
|
// NOTE: Max length depends on OS, in Windows MAX_PATH = 256 |
|
|
|
// NOTE: Filename max length depends on OS, in Windows MAX_PATH = 256 |
|
|
|
static char inFileName[512] = { 0 }; // Input file name (required in case of drag & drop over executable) |
|
|
|
static char outFileName[512] = { 0 }; // Output file name (required for file save/export) |
|
|
|
|
|
|
@ -179,15 +179,17 @@ static char outFileName[512] = { 0 }; // Output file name (required for fi |
|
|
|
static void ShowCommandLineInfo(void); // Show command line usage info |
|
|
|
static void ProcessCommandLine(int argc, char *argv[]); // Process command line input |
|
|
|
|
|
|
|
static char *LoadFileText(const char *fileName, int *length); |
|
|
|
static char **GetTextLines(const char *buffer, int length, int *linesCount); |
|
|
|
static void GetDataTypeAndName(const char *typeName, int typeNameLen, char *type, char *name); |
|
|
|
static void GetDescription(const char *source, char *description); |
|
|
|
static char *LoadFileText(const char *fileName, int *length); // Load text file - UnloadFileText() required! |
|
|
|
static void UnloadFileText(char *text); // Unload text data |
|
|
|
static char **LoadTextLines(const char *buffer, int length, int *lineCount); // Load all lines from a text buffer (expecting lines ending with '\n') - UnloadTextLines() required |
|
|
|
static void UnloadTextLines(char **lines, int lineCount); // Unload text lines data |
|
|
|
static void GetDataTypeAndName(const char *typeName, int typeNameLen, char *type, char *name); // Get data type and name from a string containing both (i.e function param and struct fields) |
|
|
|
static void GetDescription(const char *source, char *description); // Get description comment from a line, do nothing if no comment in line |
|
|
|
static void MoveArraySize(char *name, char *type); // Move array size from name to type |
|
|
|
static unsigned int TextLength(const char *text); // Get text length in bytes, check for \0 character |
|
|
|
static bool IsTextEqual(const char *text1, const char *text2, unsigned int count); |
|
|
|
static int TextFindIndex(const char *text, const char *find); // Find first text occurrence within a string |
|
|
|
static void MemoryCopy(void *dest, const void *src, unsigned int count); |
|
|
|
static void MemoryCopy(void *dest, const void *src, unsigned int count); // Memory copy, memcpy() replacement to avoid <string.h> |
|
|
|
static char *EscapeBackslashes(char *text); // Replace '\' by "\\" when exporting to JSON and XML |
|
|
|
static const char *StrDefineType(DefineType type); // Get string of define type |
|
|
|
|
|
|
@ -217,21 +219,21 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
|
|
|
|
// Preprocess buffer to get separate lines |
|
|
|
// NOTE: GetTextLines() also removes leading spaces/tabs |
|
|
|
int linesCount = 0; |
|
|
|
char **lines = GetTextLines(buffer, length, &linesCount); |
|
|
|
// NOTE: LoadTextLines() also removes leading spaces/tabs |
|
|
|
int lineCount = 0; |
|
|
|
char **lines = LoadTextLines(buffer, length, &lineCount); |
|
|
|
|
|
|
|
// Truncate lines |
|
|
|
// Truncate lines (if required) |
|
|
|
if (truncAfter[0] != '\0') |
|
|
|
{ |
|
|
|
int newCount = -1; |
|
|
|
for (int i = 0; i < linesCount; i++) |
|
|
|
for (int i = 0; i < lineCount; i++) |
|
|
|
{ |
|
|
|
if (newCount > -1) free(lines[i]); |
|
|
|
else if (TextFindIndex(lines[i], truncAfter) > -1) newCount = i; |
|
|
|
} |
|
|
|
if (newCount > -1) linesCount = newCount; |
|
|
|
printf("Number of truncated text lines: %i\n", linesCount); |
|
|
|
if (newCount > -1) lineCount = newCount; |
|
|
|
printf("Number of truncated text lines: %i\n", lineCount); |
|
|
|
} |
|
|
|
|
|
|
|
// Defines line indices |
|
|
@ -254,9 +256,8 @@ int main(int argc, char* argv[]) |
|
|
|
|
|
|
|
// Prepare required lines for parsing |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Read define lines |
|
|
|
for (int i = 0; i < linesCount; i++) |
|
|
|
for (int i = 0; i < lineCount; i++) |
|
|
|
{ |
|
|
|
int j = 0; |
|
|
|
while ((lines[i][j] == ' ') || (lines[i][j] == '\t')) j++; // skip spaces and tabs in the begining |
|
|
@ -271,7 +272,7 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
|
|
|
|
// Read struct lines |
|
|
|
for (int i = 0; i < linesCount; i++) |
|
|
|
for (int i = 0; i < lineCount; i++) |
|
|
|
{ |
|
|
|
// Find structs |
|
|
|
// starting with "typedef struct ... {" or "typedef struct ... ; \n struct ... {" |
|
|
@ -298,7 +299,7 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
|
|
|
|
// Read alias lines |
|
|
|
for (int i = 0; i < linesCount; i++) |
|
|
|
for (int i = 0; i < lineCount; i++) |
|
|
|
{ |
|
|
|
// Find aliases (lines with "typedef ... ...;") |
|
|
|
if (IsTextEqual(lines[i], "typedef", 7)) |
|
|
@ -320,7 +321,7 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
|
|
|
|
// Read enum lines |
|
|
|
for (int i = 0; i < linesCount; i++) |
|
|
|
for (int i = 0; i < lineCount; i++) |
|
|
|
{ |
|
|
|
// Read enum line |
|
|
|
if (IsTextEqual(lines[i], "typedef enum {", 14) && (lines[i][TextLength(lines[i])-1] != ';')) // ignore inline enums |
|
|
@ -333,7 +334,7 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
|
|
|
|
// Read callback lines |
|
|
|
for (int i = 0; i < linesCount; i++) |
|
|
|
for (int i = 0; i < lineCount; i++) |
|
|
|
{ |
|
|
|
// Find callbacks (lines with "typedef ... (* ... )( ... );") |
|
|
|
if (IsTextEqual(lines[i], "typedef", 7)) |
|
|
@ -359,7 +360,7 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
|
|
|
|
// Read function lines |
|
|
|
for (int i = 0; i < linesCount; i++) |
|
|
|
for (int i = 0; i < lineCount; i++) |
|
|
|
{ |
|
|
|
// Read function line (starting with `define`, i.e. for raylib.h "RLAPI") |
|
|
|
if (IsTextEqual(lines[i], apiDefine, TextLength(apiDefine))) |
|
|
@ -371,14 +372,13 @@ int main(int argc, char* argv[]) |
|
|
|
|
|
|
|
// At this point we have all raylib defines, structs, aliases, enums, callbacks, functions lines data to start parsing |
|
|
|
|
|
|
|
free(buffer); // Unload text buffer |
|
|
|
UnloadFileText(buffer); // Unload text buffer |
|
|
|
|
|
|
|
// Parsing raylib data |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
// Define info data |
|
|
|
defines = (DefineInfo *)calloc(MAX_DEFINES_TO_PARSE, sizeof(DefineInfo)); |
|
|
|
int defineIndex = 0; |
|
|
|
defines = (DefineInfo *)calloc(MAX_DEFINES_TO_PARSE, sizeof(DefineInfo)); |
|
|
|
|
|
|
|
for (int i = 0; i < defineCount; i++) |
|
|
|
{ |
|
|
@ -1038,8 +1038,7 @@ int main(int argc, char* argv[]) |
|
|
|
} |
|
|
|
free(funcLines); |
|
|
|
|
|
|
|
for (int i = 0; i < linesCount; i++) free(lines[i]); |
|
|
|
free(lines); |
|
|
|
UnloadTextLines(lines, lineCount); |
|
|
|
|
|
|
|
// At this point, all raylib data has been parsed! |
|
|
|
//---------------------------------------------------------------------------------- |
|
|
@ -1219,8 +1218,14 @@ static char *LoadFileText(const char *fileName, int *length) |
|
|
|
return text; |
|
|
|
} |
|
|
|
|
|
|
|
// Unload text data |
|
|
|
static void UnloadFileText(char *text) |
|
|
|
{ |
|
|
|
free(text); |
|
|
|
} |
|
|
|
|
|
|
|
// Get all lines from a text buffer (expecting lines ending with '\n') |
|
|
|
static char **GetTextLines(const char *buffer, int length, int *linesCount) |
|
|
|
static char **LoadTextLines(const char *buffer, int length, int *lineCount) |
|
|
|
{ |
|
|
|
// Get the number of lines in the text |
|
|
|
int count = 0; |
|
|
@ -1235,7 +1240,7 @@ static char **GetTextLines(const char *buffer, int length, int *linesCount) |
|
|
|
|
|
|
|
for (int i = 0; (i < count) || (bufferPtr[0] != '\0'); i++) |
|
|
|
{ |
|
|
|
lines[i] = (char *)calloc(MAX_LINE_LENGTH, sizeof(char)); |
|
|
|
lines[i] = (char *)calloc(MAX_LINE_LENGTH, sizeof(char)); // MAX_LINE_LENGTH=1024 |
|
|
|
|
|
|
|
// Remove line leading spaces |
|
|
|
// Find last index of space/tab character |
|
|
@ -1252,10 +1257,17 @@ static char **GetTextLines(const char *buffer, int length, int *linesCount) |
|
|
|
bufferPtr += (index + j + 1); |
|
|
|
} |
|
|
|
|
|
|
|
*linesCount = count; |
|
|
|
*lineCount = count; |
|
|
|
return lines; |
|
|
|
} |
|
|
|
|
|
|
|
// Unload text lines data |
|
|
|
static void UnloadTextLines(char **lines, int lineCount) |
|
|
|
{ |
|
|
|
for (int i = 0; i < lineCount; i++) free(lines[i]); |
|
|
|
free(lines); |
|
|
|
} |
|
|
|
|
|
|
|
// Get data type and name from a string containing both |
|
|
|
// NOTE: Useful to parse function parameters and struct fields |
|
|
|
static void GetDataTypeAndName(const char *typeName, int typeNameLen, char *type, char *name) |
|
|
|