Reorder remaining parser stuff

This commit is contained in:
lazaray 2022-05-04 13:14:24 +02:00
parent ba9520b130
commit 0f9af395f4

View File

@ -2,14 +2,14 @@
raylib API parser raylib API parser
This parser scans raylib.h to get API information about structs, aliases, enums, functions and defines. This parser scans raylib.h to get API information about defines, structs, aliases, enums, callbacks and functions.
All data is divided into pieces, usually as strings. The following types are used for data: All data is divided into pieces, usually as strings. The following types are used for data:
- struct FunctionInfo - struct DefineInfo
- struct StructInfo - struct StructInfo
- struct AliasInfo - struct AliasInfo
- struct EnumInfo - struct EnumInfo
- struct DefInfo - struct FunctionInfo
CONSTRAINTS: CONSTRAINTS:
@ -66,33 +66,34 @@
#include <stdbool.h> // Required for: bool #include <stdbool.h> // Required for: bool
#include <ctype.h> // Required for: isdigit() #include <ctype.h> // Required for: isdigit()
#define MAX_FUNCS_TO_PARSE 512 // Maximum number of functions to parse #define MAX_DEFINES_TO_PARSE 2048 // Maximum number of defines to parse
#define MAX_CALLBACKS_TO_PARSE 64 // Maximum number of callbacks to parse
#define MAX_STRUCTS_TO_PARSE 64 // Maximum number of structures to parse #define MAX_STRUCTS_TO_PARSE 64 // Maximum number of structures to parse
#define MAX_ALIASES_TO_PARSE 64 // Maximum number of aliases to parse #define MAX_ALIASES_TO_PARSE 64 // Maximum number of aliases to parse
#define MAX_ENUMS_TO_PARSE 64 // Maximum number of enums to parse #define MAX_ENUMS_TO_PARSE 64 // Maximum number of enums to parse
#define MAX_DEFINES_TO_PARSE 2048 // Maximum number of defines to parse #define MAX_CALLBACKS_TO_PARSE 64 // Maximum number of callbacks to parse
#define MAX_FUNCS_TO_PARSE 512 // Maximum number of functions to parse
#define MAX_LINE_LENGTH 512 // Maximum length of one line (including comments) #define MAX_LINE_LENGTH 512 // Maximum length of one line (including comments)
#define MAX_STRUCT_LINE_LENGTH 2048 // Maximum length of one struct (multiple lines)
#define MAX_FUNCTION_PARAMETERS 12 // Maximum number of function parameters
#define MAX_STRUCT_FIELDS 64 // Maximum number of struct fields #define MAX_STRUCT_FIELDS 64 // Maximum number of struct fields
#define MAX_ENUM_VALUES 512 // Maximum number of enum values #define MAX_ENUM_VALUES 512 // Maximum number of enum values
#define MAX_FUNCTION_PARAMETERS 12 // Maximum number of function parameters
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Types and Structures Definition // Types and Structures Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Function info data
typedef struct FunctionInfo { // Type of parsed define
char name[64]; // Function name typedef enum { UNKNOWN = 0, MACRO, GUARD, INT, LONG, FLOAT, DOUBLE, CHAR, STRING, COLOR } DefineType;
char desc[128]; // Function description (comment at the end)
char retType[32]; // Return value type // Define info data
int paramCount; // Number of function parameters typedef struct DefineInfo {
char paramType[MAX_FUNCTION_PARAMETERS][32]; // Parameters type char name[64]; // Define name
char paramName[MAX_FUNCTION_PARAMETERS][32]; // Parameters name DefineType type; // Define type
char paramDesc[MAX_FUNCTION_PARAMETERS][128]; // Parameters description char value[256]; // Define value
} FunctionInfo; char desc[128]; // Define description
bool isHex; // Define is hex number (for types INT, LONG)
} DefineInfo;
// Struct info data // Struct info data
typedef struct StructInfo { typedef struct StructInfo {
@ -121,17 +122,16 @@ typedef struct EnumInfo {
char valueDesc[MAX_ENUM_VALUES][128]; // Value description char valueDesc[MAX_ENUM_VALUES][128]; // Value description
} EnumInfo; } EnumInfo;
// Type of parsed define // Function info data
typedef enum { UNKNOWN = 0, MACRO, GUARD, INT, LONG, FLOAT, DOUBLE, CHAR, STRING, COLOR } DefineType; typedef struct FunctionInfo {
char name[64]; // Function name
// Define info data char desc[128]; // Function description (comment at the end)
typedef struct DefineInfo { char retType[32]; // Return value type
char name[64]; // Define name int paramCount; // Number of function parameters
DefineType type; // Define type char paramType[MAX_FUNCTION_PARAMETERS][32]; // Parameters type
char value[256]; // Define value char paramName[MAX_FUNCTION_PARAMETERS][32]; // Parameters name
char desc[128]; // Define description char paramDesc[MAX_FUNCTION_PARAMETERS][128]; // Parameters description
bool isHex; // Define is hex number (for types INT, LONG) } FunctionInfo;
} DefineInfo;
// Output format for parsed data // Output format for parsed data
typedef enum { DEFAULT = 0, JSON, XML, LUA } OutputFormat; typedef enum { DEFAULT = 0, JSON, XML, LUA } OutputFormat;
@ -139,21 +139,21 @@ typedef enum { DEFAULT = 0, JSON, XML, LUA } OutputFormat;
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Global Variables Definition // Global Variables Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
static int funcCount = 0; static int defineCount = 0;
static int callbackCount = 0;
static int structCount = 0; static int structCount = 0;
static int aliasCount = 0; static int aliasCount = 0;
static int enumCount = 0; static int enumCount = 0;
static int defineCount = 0; static int callbackCount = 0;
static FunctionInfo *funcs = NULL; static int funcCount = 0;
static FunctionInfo *callbacks = NULL; static DefineInfo *defines = NULL;
static StructInfo *structs = NULL; static StructInfo *structs = NULL;
static AliasInfo *aliases = NULL; static AliasInfo *aliases = NULL;
static EnumInfo *enums = NULL; static EnumInfo *enums = NULL;
static DefineInfo *defines = NULL; static FunctionInfo *callbacks = NULL;
static char apiDefine[32] = "RLAPI\0"; static FunctionInfo *funcs = NULL;
// Command line variables // Command line variables
static char apiDefine[32] = { 0 }; // Functions define (i.e. RLAPI for raylib.h, RMDEF for raymath.h, etc.)
static char inFileName[512] = { 0 }; // Input file name (required in case of provided through CLI) static char inFileName[512] = { 0 }; // Input file name (required in case of provided through CLI)
static char outFileName[512] = { 0 }; // Output file name (required for file save/export) static char outFileName[512] = { 0 }; // Output file name (required for file save/export)
static int outputFormat = DEFAULT; static int outputFormat = DEFAULT;
@ -168,25 +168,25 @@ static char *LoadFileText(const char *fileName, int *length);
static char **GetTextLines(const char *buffer, int length, int *linesCount); static char **GetTextLines(const char *buffer, int length, int *linesCount);
static void GetDataTypeAndName(const char *typeName, int typeNameLen, char *type, char *name); static void GetDataTypeAndName(const char *typeName, int typeNameLen, char *type, char *name);
static void GetDescription(const char *source, char *description); static void GetDescription(const char *source, char *description);
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 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 bool IsTextEqual(const char *text1, const char *text2, unsigned int count);
static void MemoryCopy(void *dest, const void *src, unsigned int count); static void MemoryCopy(void *dest, const void *src, unsigned int count);
static char *EscapeBackslashes(char *text); // Replace '\' by "\\" when exporting to JSON and XML static char *EscapeBackslashes(char *text); // Replace '\' by "\\" when exporting to JSON and XML
static const char *StrDefineType(DefineType type); // Get string of define type
static void ExportParsedData(const char *fileName, int format); // Export parsed data in desired format static void ExportParsedData(const char *fileName, int format); // Export parsed data in desired format
static const char *StrDefineType(DefineType type); // Get string of define type //----------------------------------------------------------------------------------
static void MoveArraySize(char *name, char *type); // Move array size from name to type
//------------------------------------------------------------------------------------
// Program main entry point // Program main entry point
//------------------------------------------------------------------------------------ //----------------------------------------------------------------------------------
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
if (argc > 1) ProcessCommandLine(argc, argv); if (argc > 1) ProcessCommandLine(argc, argv);
if (inFileName[0] == '\0') MemoryCopy(inFileName, "../src/raylib.h\0", 16); if (inFileName[0] == '\0') MemoryCopy(inFileName, "../src/raylib.h\0", 16);
if (outFileName[0] == '\0') MemoryCopy(outFileName, "raylib_api.txt\0", 15);
if (apiDefine[0] == '\0') MemoryCopy(apiDefine, "RLAPI\0", 6);
int length = 0; int length = 0;
char *buffer = LoadFileText(inFileName, &length); char *buffer = LoadFileText(inFileName, &length);
@ -215,7 +215,7 @@ int main(int argc, char* argv[])
int *funcLines = (int *)malloc(MAX_FUNCS_TO_PARSE*sizeof(int)); int *funcLines = (int *)malloc(MAX_FUNCS_TO_PARSE*sizeof(int));
// Prepare required lines for parsing // Prepare required lines for parsing
//-------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Read define lines // Read define lines
for (int i = 0; i < linesCount; i++) for (int i = 0; i < linesCount; i++)
@ -331,12 +331,12 @@ int main(int argc, char* argv[])
} }
} }
// At this point we have all raylib structs, enums, functions, defines lines data to start parsing // At this point we have all raylib defines, structs, aliases, enums, callbacks, functions lines data to start parsing
free(buffer); // Unload text buffer free(buffer); // Unload text buffer
// Parsing raylib data // Parsing raylib data
//-------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Define info data // Define info data
defines = (DefineInfo *)calloc(MAX_DEFINES_TO_PARSE, sizeof(DefineInfo)); defines = (DefineInfo *)calloc(MAX_DEFINES_TO_PARSE, sizeof(DefineInfo));
@ -587,7 +587,6 @@ int main(int argc, char* argv[])
{ {
MemoryCopy(structs[i].fieldType[originalIndex + j], &structs[i].fieldType[originalIndex][0], fieldTypeLength); MemoryCopy(structs[i].fieldType[originalIndex + j], &structs[i].fieldType[originalIndex][0], fieldTypeLength);
MemoryCopy(structs[i].fieldDesc[originalIndex + j], &structs[i].fieldDesc[originalIndex][0], TextLength(structs[i].fieldDesc[originalIndex])); MemoryCopy(structs[i].fieldDesc[originalIndex + j], &structs[i].fieldDesc[originalIndex][0], TextLength(structs[i].fieldDesc[originalIndex]));
} }
} }
} }
@ -881,7 +880,7 @@ int main(int argc, char* argv[])
free(lines); free(lines);
// At this point, all raylib data has been parsed! // At this point, all raylib data has been parsed!
//----------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// defines[] -> We have all the defines decomposed into pieces for further analysis // defines[] -> We have all the defines decomposed into pieces for further analysis
// structs[] -> We have all the structs decomposed into pieces for further analysis // structs[] -> We have all the structs decomposed into pieces for further analysis
// aliases[] -> We have all the aliases decomposed into pieces for further analysis // aliases[] -> We have all the aliases decomposed into pieces for further analysis
@ -889,9 +888,6 @@ int main(int argc, char* argv[])
// callbacks[] -> We have all the callbacks decomposed into pieces for further analysis // callbacks[] -> We have all the callbacks decomposed into pieces for further analysis
// funcs[] -> We have all the functions decomposed into pieces for further analysis // funcs[] -> We have all the functions decomposed into pieces for further analysis
// Process input file to output
if (outFileName[0] == '\0') MemoryCopy(outFileName, "raylib_api.txt\0", 15);
printf("\nInput file: %s", inFileName); printf("\nInput file: %s", inFileName);
printf("\nOutput file: %s", outFileName); printf("\nOutput file: %s", outFileName);
if (outputFormat == DEFAULT) printf("\nOutput format: DEFAULT\n\n"); if (outputFormat == DEFAULT) printf("\nOutput format: DEFAULT\n\n");
@ -912,6 +908,7 @@ int main(int argc, char* argv[])
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Module Functions Definition // Module Functions Definition
//---------------------------------------------------------------------------------- //----------------------------------------------------------------------------------
// Show command line usage info // Show command line usage info
static void ShowCommandLineInfo(void) static void ShowCommandLineInfo(void)
{ {
@ -937,7 +934,7 @@ static void ShowCommandLineInfo(void)
printf(" NOTE: If not specified, defaults to: raylib_api.txt\n\n"); printf(" NOTE: If not specified, defaults to: raylib_api.txt\n\n");
printf(" -f, --format <type> : Define output format for parser data.\n"); printf(" -f, --format <type> : Define output format for parser data.\n");
printf(" Supported types: DEFAULT, JSON, XML, LUA\n\n"); printf(" Supported types: DEFAULT, JSON, XML, LUA\n\n");
printf(" -d, --define <DEF> : Define functions define (i.e. RLAPI for raylib.h, RMDEF for raymath.h, etc\n"); printf(" -d, --define <DEF> : Define functions define (i.e. RLAPI for raylib.h, RMDEF for raymath.h, etc.)\n");
printf(" NOTE: If not specified, defaults to: RLAPI\n\n"); printf(" NOTE: If not specified, defaults to: RLAPI\n\n");
printf("\nEXAMPLES:\n\n"); printf("\nEXAMPLES:\n\n");
@ -958,6 +955,7 @@ static void ProcessCommandLine(int argc, char *argv[])
{ {
// Show info // Show info
ShowCommandLineInfo(); ShowCommandLineInfo();
exit(0);
} }
else if (IsTextEqual(argv[i], "-i", 2) || IsTextEqual(argv[i], "--input", 7)) else if (IsTextEqual(argv[i], "-i", 2) || IsTextEqual(argv[i], "--input", 7))
{ {
@ -1131,6 +1129,24 @@ static void GetDescription(const char *line, char *description)
if (descStart != -1) MemoryCopy(description, &line[descStart], c - descStart); if (descStart != -1) MemoryCopy(description, &line[descStart], c - descStart);
} }
// Move array size from name to type
static void MoveArraySize(char *name, char *type)
{
int nameLength = TextLength(name);
if (name[nameLength - 1] == ']')
{
for (int k = nameLength; k > 0; k--)
{
if (name[k] == '[')
{
int sizeLength = nameLength - k;
MemoryCopy(&type[TextLength(type)], &name[k], sizeLength);
name[k] = '\0';
}
}
}
}
// Get text length in bytes, check for \0 character // Get text length in bytes, check for \0 character
static unsigned int TextLength(const char *text) static unsigned int TextLength(const char *text)
{ {
@ -1141,15 +1157,6 @@ static unsigned int TextLength(const char *text)
return length; return length;
} }
// Custom memcpy() to avoid <string.h>
static void MemoryCopy(void *dest, const void *src, unsigned int count)
{
char *srcPtr = (char *)src;
char *destPtr = (char *)dest;
for (unsigned int i = 0; i < count; i++) destPtr[i] = srcPtr[i];
}
// Compare two text strings, requires number of characters to compare // Compare two text strings, requires number of characters to compare
static bool IsTextEqual(const char *text1, const char *text2, unsigned int count) static bool IsTextEqual(const char *text1, const char *text2, unsigned int count)
{ {
@ -1167,6 +1174,15 @@ static bool IsTextEqual(const char *text1, const char *text2, unsigned int count
return result; return result;
} }
// Custom memcpy() to avoid <string.h>
static void MemoryCopy(void *dest, const void *src, unsigned int count)
{
char *srcPtr = (char *)src;
char *destPtr = (char *)dest;
for (unsigned int i = 0; i < count; i++) destPtr[i] = srcPtr[i];
}
// Escape backslashes in a string, writing the escaped string into a static buffer // Escape backslashes in a string, writing the escaped string into a static buffer
static char *EscapeBackslashes(char *text) static char *EscapeBackslashes(char *text)
{ {
@ -1209,24 +1225,6 @@ static const char *StrDefineType(DefineType type)
return ""; return "";
} }
// Move array size from name to type
static void MoveArraySize(char *name, char *type)
{
int nameLength = TextLength(name);
if (name[nameLength - 1] == ']')
{
for (int k = nameLength; k > 0; k--)
{
if (name[k] == '[')
{
int sizeLength = nameLength - k;
MemoryCopy(&type[TextLength(type)], &name[k], sizeLength);
name[k] = '\0';
}
}
}
}
/* /*
// Replace text string // Replace text string
// REQUIRES: strlen(), strstr(), strncpy(), strcpy() -> TODO: Replace by custom implementations! // REQUIRES: strlen(), strstr(), strncpy(), strcpy() -> TODO: Replace by custom implementations!