diff --git a/parser/raylib_api.json b/parser/raylib_api.json index d9565c5c..98a939b2 100644 --- a/parser/raylib_api.json +++ b/parser/raylib_api.json @@ -471,7 +471,7 @@ { "type": "float *", "name": "texcoords2", - "description": "Vertex second texture coordinates (useful for lightmaps) (shader-location = 5)" + "description": "Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5)" }, { "type": "float *", @@ -577,8 +577,8 @@ "description": "Material maps array (MAX_MATERIAL_MAPS)" }, { - "type": "float", - "name": "params[4]", + "type": "float[4]", + "name": "params", "description": "Material generic parameters (if required)" } ] @@ -609,8 +609,8 @@ "description": "Bone, skeletal animation bone", "fields": [ { - "type": "char", - "name": "name[32]", + "type": "char[32]", + "name": "name", "description": "Bone name" }, { @@ -909,13 +909,13 @@ "description": "IPD (distance between pupils) in meters" }, { - "type": "float", - "name": "lensDistortionValues[4]", + "type": "float[4]", + "name": "lensDistortionValues", "description": "Lens distortion constant parameters" }, { - "type": "float", - "name": "chromaAbCorrection[4]", + "type": "float[4]", + "name": "chromaAbCorrection", "description": "Chromatic aberration correction parameters" } ] @@ -925,43 +925,43 @@ "description": "VrStereoConfig, VR stereo rendering configuration for simulator", "fields": [ { - "type": "Matrix", - "name": "projection[2]", + "type": "Matrix[2]", + "name": "projection", "description": "VR projection matrices (per eye)" }, { - "type": "Matrix", - "name": "viewOffset[2]", + "type": "Matrix[2]", + "name": "viewOffset", "description": "VR view offset matrices (per eye)" }, { - "type": "float", - "name": "leftLensCenter[2]", + "type": "float[2]", + "name": "leftLensCenter", "description": "VR left lens center" }, { - "type": "float", - "name": "rightLensCenter[2]", + "type": "float[2]", + "name": "rightLensCenter", "description": "VR right lens center" }, { - "type": "float", - "name": "leftScreenCenter[2]", + "type": "float[2]", + "name": "leftScreenCenter", "description": "VR left screen center" }, { - "type": "float", - "name": "rightScreenCenter[2]", + "type": "float[2]", + "name": "rightScreenCenter", "description": "VR right screen center" }, { - "type": "float", - "name": "scale[2]", + "type": "float[2]", + "name": "scale", "description": "VR distortion scale" }, { - "type": "float", - "name": "scaleIn[2]", + "type": "float[2]", + "name": "scaleIn", "description": "VR distortion scale in" } ] @@ -4116,7 +4116,7 @@ }, { "name": "GetDirectoryFiles", - "description": "Get filenames in a directory path (memory should be freed)", + "description": "Get filenames in a directory path (memory must be freed)", "returnType": "char **", "params": [ { @@ -4152,7 +4152,7 @@ }, { "name": "GetDroppedFiles", - "description": "Get dropped files names (memory should be freed)", + "description": "Get dropped files names (memory must be freed)", "returnType": "char **", "params": [ { @@ -4179,7 +4179,7 @@ }, { "name": "CompressData", - "description": "Compress data (DEFLATE algorithm)", + "description": "Compress data (DEFLATE algorithm), memory must be MemFree()", "returnType": "unsigned char *", "params": [ { @@ -4198,7 +4198,7 @@ }, { "name": "DecompressData", - "description": "Decompress data (DEFLATE algorithm)", + "description": "Decompress data (DEFLATE algorithm), memory must be MemFree()", "returnType": "unsigned char *", "params": [ { @@ -4217,7 +4217,7 @@ }, { "name": "EncodeDataBase64", - "description": "Encode data to Base64 string", + "description": "Encode data to Base64 string, memory must be MemFree()", "returnType": "char *", "params": [ { @@ -4236,7 +4236,7 @@ }, { "name": "DecodeDataBase64", - "description": "Decode Base64 string data", + "description": "Decode Base64 string data, memory must be MemFree()", "returnType": "unsigned char *", "params": [ { @@ -10556,5 +10556,101 @@ } ] } + ], + "callbacks": [ + { + "name": "TraceLogCallback", + "description": "Logging: Redirect trace log messages", + "returnType": "void", + "params": [ + { + "type": "int", + "name": "logLevel" + }, + { + "type": "const char *", + "name": "text" + }, + { + "type": "va_list", + "name": "args" + } + ] + }, + { + "name": "LoadFileDataCallback", + "description": "FileIO: Load binary data", + "returnType": "unsigned char *", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "unsigned int *", + "name": "bytesRead" + } + ] + }, + { + "name": "SaveFileDataCallback", + "description": "FileIO: Save binary data", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "void *", + "name": "data" + }, + { + "type": "unsigned int", + "name": "bytesToWrite" + } + ] + }, + { + "name": "LoadFileTextCallback", + "description": "FileIO: Load text data", + "returnType": "char *", + "params": [ + { + "type": "const char *", + "name": "fileName" + } + ] + }, + { + "name": "SaveFileTextCallback", + "description": "FileIO: Save text data", + "returnType": "bool", + "params": [ + { + "type": "const char *", + "name": "fileName" + }, + { + "type": "char *", + "name": "text" + } + ] + }, + { + "name": "AudioCallback", + "description": "", + "returnType": "void", + "params": [ + { + "type": "void *", + "name": "bufferData" + }, + { + "type": "unsigned int", + "name": "frames" + } + ] + } ] } diff --git a/parser/raylib_api.lua b/parser/raylib_api.lua index 0a127e47..8888fade 100644 --- a/parser/raylib_api.lua +++ b/parser/raylib_api.lua @@ -471,7 +471,7 @@ return { { type = "float *", name = "texcoords2", - description = "Vertex second texture coordinates (useful for lightmaps) (shader-location = 5)" + description = "Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5)" }, { type = "float *", @@ -577,8 +577,8 @@ return { description = "Material maps array (MAX_MATERIAL_MAPS)" }, { - type = "float", - name = "params[4]", + type = "float[4]", + name = "params", description = "Material generic parameters (if required)" } } @@ -609,8 +609,8 @@ return { description = "Bone, skeletal animation bone", fields = { { - type = "char", - name = "name[32]", + type = "char[32]", + name = "name", description = "Bone name" }, { @@ -909,13 +909,13 @@ return { description = "IPD (distance between pupils) in meters" }, { - type = "float", - name = "lensDistortionValues[4]", + type = "float[4]", + name = "lensDistortionValues", description = "Lens distortion constant parameters" }, { - type = "float", - name = "chromaAbCorrection[4]", + type = "float[4]", + name = "chromaAbCorrection", description = "Chromatic aberration correction parameters" } } @@ -925,43 +925,43 @@ return { description = "VrStereoConfig, VR stereo rendering configuration for simulator", fields = { { - type = "Matrix", - name = "projection[2]", + type = "Matrix[2]", + name = "projection", description = "VR projection matrices (per eye)" }, { - type = "Matrix", - name = "viewOffset[2]", + type = "Matrix[2]", + name = "viewOffset", description = "VR view offset matrices (per eye)" }, { - type = "float", - name = "leftLensCenter[2]", + type = "float[2]", + name = "leftLensCenter", description = "VR left lens center" }, { - type = "float", - name = "rightLensCenter[2]", + type = "float[2]", + name = "rightLensCenter", description = "VR right lens center" }, { - type = "float", - name = "leftScreenCenter[2]", + type = "float[2]", + name = "leftScreenCenter", description = "VR left screen center" }, { - type = "float", - name = "rightScreenCenter[2]", + type = "float[2]", + name = "rightScreenCenter", description = "VR right screen center" }, { - type = "float", - name = "scale[2]", + type = "float[2]", + name = "scale", description = "VR distortion scale" }, { - type = "float", - name = "scaleIn[2]", + type = "float[2]", + name = "scaleIn", description = "VR distortion scale in" } } @@ -3771,7 +3771,7 @@ return { }, { name = "GetDirectoryFiles", - description = "Get filenames in a directory path (memory should be freed)", + description = "Get filenames in a directory path (memory must be freed)", returnType = "char **", params = { {type = "const char *", name = "dirPath"}, @@ -3798,7 +3798,7 @@ return { }, { name = "GetDroppedFiles", - description = "Get dropped files names (memory should be freed)", + description = "Get dropped files names (memory must be freed)", returnType = "char **", params = { {type = "int *", name = "count"} @@ -3819,7 +3819,7 @@ return { }, { name = "CompressData", - description = "Compress data (DEFLATE algorithm)", + description = "Compress data (DEFLATE algorithm), memory must be MemFree()", returnType = "unsigned char *", params = { {type = "const unsigned char *", name = "data"}, @@ -3829,7 +3829,7 @@ return { }, { name = "DecompressData", - description = "Decompress data (DEFLATE algorithm)", + description = "Decompress data (DEFLATE algorithm), memory must be MemFree()", returnType = "unsigned char *", params = { {type = "const unsigned char *", name = "compData"}, @@ -3839,7 +3839,7 @@ return { }, { name = "EncodeDataBase64", - description = "Encode data to Base64 string", + description = "Encode data to Base64 string, memory must be MemFree()", returnType = "char *", params = { {type = "const unsigned char *", name = "data"}, @@ -3849,7 +3849,7 @@ return { }, { name = "DecodeDataBase64", - description = "Decode Base64 string data", + description = "Decode Base64 string data, memory must be MemFree()", returnType = "unsigned char *", params = { {type = "const unsigned char *", name = "data"}, @@ -7322,5 +7322,62 @@ return { {type = "AudioCallback", name = "processor"} } } + }, + callbacks = { + { + name = "TraceLogCallback", + description = "Logging: Redirect trace log messages", + returnType = "void", + params = { + {type = "int", name = "logLevel"}, + {type = "const char *", name = "text"}, + {type = "va_list", name = "args"} + } + }, + { + name = "LoadFileDataCallback", + description = "FileIO: Load binary data", + returnType = "unsigned char *", + params = { + {type = "const char *", name = "fileName"}, + {type = "unsigned int *", name = "bytesRead"} + } + }, + { + name = "SaveFileDataCallback", + description = "FileIO: Save binary data", + returnType = "bool", + params = { + {type = "const char *", name = "fileName"}, + {type = "void *", name = "data"}, + {type = "unsigned int", name = "bytesToWrite"} + } + }, + { + name = "LoadFileTextCallback", + description = "FileIO: Load text data", + returnType = "char *", + params = { + {type = "const char *", name = "fileName"} + } + }, + { + name = "SaveFileTextCallback", + description = "FileIO: Save text data", + returnType = "bool", + params = { + {type = "const char *", name = "fileName"}, + {type = "char *", name = "text"} + } + }, + { + name = "AudioCallback", + description = "", + returnType = "void", + params = { + {type = "void *", name = "bufferData"}, + {type = "unsigned int", name = "frames"} + } + } } } diff --git a/parser/raylib_api.txt b/parser/raylib_api.txt index cf673d4d..972b4d65 100644 --- a/parser/raylib_api.txt +++ b/parser/raylib_api.txt @@ -122,7 +122,7 @@ Struct 15: Mesh (15 fields) Field[2]: int triangleCount // Number of triangles stored (indexed or not) Field[3]: float * vertices // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) Field[4]: float * texcoords // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) - Field[5]: float * texcoords2 // Vertex second texture coordinates (useful for lightmaps) (shader-location = 5) + Field[5]: float * texcoords2 // Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5) Field[6]: float * normals // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) Field[7]: float * tangents // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) Field[8]: unsigned char * colors // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) @@ -149,7 +149,7 @@ Struct 18: Material (3 fields) Description: Material, includes shader and maps Field[1]: Shader shader // Material shader Field[2]: MaterialMap * maps // Material maps array (MAX_MATERIAL_MAPS) - Field[3]: float params[4] // Material generic parameters (if required) + Field[3]: float[4] params // Material generic parameters (if required) Struct 19: Transform (3 fields) Name: Transform Description: Transform, vectex transformation data @@ -159,7 +159,7 @@ Struct 19: Transform (3 fields) Struct 20: BoneInfo (2 fields) Name: BoneInfo Description: Bone, skeletal animation bone - Field[1]: char name[32] // Bone name + Field[1]: char[32] name // Bone name Field[2]: int parent // Bone parent Struct 21: Model (9 fields) Name: Model @@ -237,19 +237,19 @@ Struct 30: VrDeviceInfo (10 fields) Field[6]: float eyeToScreenDistance // Distance between eye and display in meters Field[7]: float lensSeparationDistance // Lens separation distance in meters Field[8]: float interpupillaryDistance // IPD (distance between pupils) in meters - Field[9]: float lensDistortionValues[4] // Lens distortion constant parameters - Field[10]: float chromaAbCorrection[4] // Chromatic aberration correction parameters + Field[9]: float[4] lensDistortionValues // Lens distortion constant parameters + Field[10]: float[4] chromaAbCorrection // Chromatic aberration correction parameters Struct 31: VrStereoConfig (8 fields) Name: VrStereoConfig Description: VrStereoConfig, VR stereo rendering configuration for simulator - Field[1]: Matrix projection[2] // VR projection matrices (per eye) - Field[2]: Matrix viewOffset[2] // VR view offset matrices (per eye) - Field[3]: float leftLensCenter[2] // VR left lens center - Field[4]: float rightLensCenter[2] // VR right lens center - Field[5]: float leftScreenCenter[2] // VR left screen center - Field[6]: float rightScreenCenter[2] // VR right screen center - Field[7]: float scale[2] // VR distortion scale - Field[8]: float scaleIn[2] // VR distortion scale in + Field[1]: Matrix[2] projection // VR projection matrices (per eye) + Field[2]: Matrix[2] viewOffset // VR view offset matrices (per eye) + Field[3]: float[2] leftLensCenter // VR left lens center + Field[4]: float[2] rightLensCenter // VR right lens center + Field[5]: float[2] leftScreenCenter // VR left screen center + Field[6]: float[2] rightScreenCenter // VR right screen center + Field[7]: float[2] scale // VR distortion scale + Field[8]: float[2] scaleIn // VR distortion scale in Aliases found: 5 @@ -1281,7 +1281,7 @@ Function 121: GetApplicationDirectory() (0 input parameters) Function 122: GetDirectoryFiles() (2 input parameters) Name: GetDirectoryFiles Return type: char ** - Description: Get filenames in a directory path (memory should be freed) + Description: Get filenames in a directory path (memory must be freed) Param[1]: dirPath (type: const char *) Param[2]: count (type: int *) Function 123: ClearDirectoryFiles() (0 input parameters) @@ -1302,7 +1302,7 @@ Function 125: IsFileDropped() (0 input parameters) Function 126: GetDroppedFiles() (1 input parameters) Name: GetDroppedFiles Return type: char ** - Description: Get dropped files names (memory should be freed) + Description: Get dropped files names (memory must be freed) Param[1]: count (type: int *) Function 127: ClearDroppedFiles() (0 input parameters) Name: ClearDroppedFiles @@ -1317,28 +1317,28 @@ Function 128: GetFileModTime() (1 input parameters) Function 129: CompressData() (3 input parameters) Name: CompressData Return type: unsigned char * - Description: Compress data (DEFLATE algorithm) + Description: Compress data (DEFLATE algorithm), memory must be MemFree() Param[1]: data (type: const unsigned char *) Param[2]: dataSize (type: int) Param[3]: compDataSize (type: int *) Function 130: DecompressData() (3 input parameters) Name: DecompressData Return type: unsigned char * - Description: Decompress data (DEFLATE algorithm) + Description: Decompress data (DEFLATE algorithm), memory must be MemFree() Param[1]: compData (type: const unsigned char *) Param[2]: compDataSize (type: int) Param[3]: dataSize (type: int *) Function 131: EncodeDataBase64() (3 input parameters) Name: EncodeDataBase64 Return type: char * - Description: Encode data to Base64 string + Description: Encode data to Base64 string, memory must be MemFree() Param[1]: data (type: const unsigned char *) Param[2]: dataSize (type: int) Param[3]: outputSize (type: int *) Function 132: DecodeDataBase64() (2 input parameters) Name: DecodeDataBase64 Return type: unsigned char * - Description: Decode Base64 string data + Description: Decode Base64 string data, memory must be MemFree() Param[1]: data (type: const unsigned char *) Param[2]: outputSize (type: int *) Function 133: SaveStorageValue() (2 input parameters) @@ -3782,6 +3782,46 @@ Function 499: DetachAudioStreamProcessor() (2 input parameters) Param[1]: stream (type: AudioStream) Param[2]: processor (type: AudioCallback) +Callbacks found: 6 + +Callback 001: TraceLogCallback() (3 input parameters) + Name: TraceLogCallback + Return type: void + Description: Logging: Redirect trace log messages + Param[1]: logLevel (type: int) + Param[2]: text (type: const char *) + Param[3]: args (type: va_list) +Callback 002: LoadFileDataCallback() (2 input parameters) + Name: LoadFileDataCallback + Return type: unsigned char * + Description: FileIO: Load binary data + Param[1]: fileName (type: const char *) + Param[2]: bytesRead (type: unsigned int *) +Callback 003: SaveFileDataCallback() (3 input parameters) + Name: SaveFileDataCallback + Return type: bool + Description: FileIO: Save binary data + Param[1]: fileName (type: const char *) + Param[2]: data (type: void *) + Param[3]: bytesToWrite (type: unsigned int) +Callback 004: LoadFileTextCallback() (1 input parameters) + Name: LoadFileTextCallback + Return type: char * + Description: FileIO: Load text data + Param[1]: fileName (type: const char *) +Callback 005: SaveFileTextCallback() (2 input parameters) + Name: SaveFileTextCallback + Return type: bool + Description: FileIO: Save text data + Param[1]: fileName (type: const char *) + Param[2]: text (type: char *) +Callback 006: AudioCallback() (2 input parameters) + Name: AudioCallback + Return type: void + Description: + Param[1]: bufferData (type: void *) + Param[2]: frames (type: unsigned int) + Defines found: 52 Define 001: RAYLIB_H diff --git a/parser/raylib_api.xml b/parser/raylib_api.xml index d1f58b5c..db7761c5 100644 --- a/parser/raylib_api.xml +++ b/parser/raylib_api.xml @@ -106,7 +106,7 @@ - + @@ -130,7 +130,7 @@ - + @@ -138,7 +138,7 @@ - + @@ -206,18 +206,18 @@ - - + + - - - - - - - - + + + + + + + + @@ -975,7 +975,7 @@ - + @@ -986,7 +986,7 @@ - + @@ -994,22 +994,22 @@ - + - + - + - + @@ -2695,4 +2695,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/parser/raylib_parser.c b/parser/raylib_parser.c index 01cdc1ac..d7eee55f 100644 --- a/parser/raylib_parser.c +++ b/parser/raylib_parser.c @@ -67,6 +67,7 @@ #include // Required for: isdigit() #define MAX_FUNCS_TO_PARSE 512 // Maximum number of functions 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_ALIASES_TO_PARSE 64 // Maximum number of aliases to parse #define MAX_ENUMS_TO_PARSE 64 // Maximum number of enums to parse @@ -76,7 +77,7 @@ #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 32 // 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 //---------------------------------------------------------------------------------- @@ -139,11 +140,13 @@ typedef enum { DEFAULT = 0, JSON, XML, LUA } OutputFormat; // Global Variables Definition //---------------------------------------------------------------------------------- static int funcCount = 0; +static int callbackCount = 0; static int structCount = 0; static int aliasCount = 0; static int enumCount = 0; static int defineCount = 0; static FunctionInfo *funcs = NULL; +static FunctionInfo *callbacks = NULL; static StructInfo *structs = NULL; static AliasInfo *aliases = NULL; static EnumInfo *enums = NULL; @@ -164,6 +167,7 @@ static void ProcessCommandLine(int argc, char *argv[]); // Process command l 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 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 void MemoryCopy(void *dest, const void *src, unsigned int count); @@ -173,6 +177,8 @@ static void ExportParsedData(const char *fileName, int format); // Export parsed 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 //------------------------------------------------------------------------------------ @@ -190,19 +196,22 @@ int main(int argc, char* argv[]) int linesCount = 0; char **lines = GetTextLines(buffer, length, &linesCount); - // Function lines pointers, selected from buffer "lines" - char **funcLines = (char **)malloc(MAX_FUNCS_TO_PARSE*sizeof(char *)); + // Function line indices + int *funcLines = (int *)malloc(MAX_FUNCS_TO_PARSE*sizeof(int)); + + // Callbacks line indices + int *callbackLines = (int *)malloc(MAX_CALLBACKS_TO_PARSE*sizeof(int)); - // Structs lines pointers, selected from buffer "lines" + // Structs line indices int *structLines = (int *)malloc(MAX_STRUCTS_TO_PARSE*sizeof(int)); - // Aliases lines pointers, selected from buffer "lines" + // Aliases line indices int *aliasLines = (int *)malloc(MAX_ALIASES_TO_PARSE*sizeof(int)); - // Enums lines pointers, selected from buffer "lines" + // Enums line indices int *enumLines = (int *)malloc(MAX_ENUMS_TO_PARSE*sizeof(int)); - // Defines lines pointers, selected from buffer "lines" + // Defines line indices int *defineLines = (int *)malloc(MAX_DEFINES_TO_PARSE*sizeof(int)); // Prepare required lines for parsing @@ -214,30 +223,54 @@ int main(int argc, char* argv[]) // Read function line (starting with `define`, i.e. for raylib.h "RLAPI") if (IsTextEqual(lines[i], apiDefine, TextLength(apiDefine))) { - // Keep a pointer to the function line - funcLines[funcCount] = lines[i]; + funcLines[funcCount] = i; funcCount++; } } - // Read struct lines + // Read callback lines for (int i = 0; i < linesCount; i++) { - // Find structs (starting with "typedef struct ... {", ending with '} ... ;') - if (IsTextEqual(lines[i], "typedef struct", 14)) + // Find callbacks (lines with "typedef ... (* ... )( ... );") + if (IsTextEqual(lines[i], "typedef", 7)) { - int j = 0; - bool validStruct = false; + bool hasBeginning = false; + bool hasMiddle = false; + bool hasEnd = false; for (int c = 0; c < MAX_LINE_LENGTH; c++) { - char v = lines[i][c]; - if (v == '{') validStruct = true; - if (v == '{' || v == ';' || v == '\0') + if ((lines[i][c] == '(') && (lines[i][c + 1] == '*')) hasBeginning = true; + if ((lines[i][c] == ')') && (lines[i][c + 1] == '(')) hasMiddle = true; + if ((lines[i][c] == ')') && (lines[i][c + 1] == ';')) hasEnd = true; + if (hasEnd) break; + } + + if (hasBeginning && hasMiddle && hasEnd) + { + callbackLines[callbackCount] = i; + callbackCount++; + } + } + } + + // Read struct lines + for (int i = 0; i < linesCount; i++) + { + // Find structs + // starting with "typedef struct ... {" or "typedef struct ... ; \n struct ... {" + // ending with "} ... ;" + // i.e. excluding "typedef struct rAudioBuffer rAudioBuffer;" -> Typedef and forward declaration only + if (IsTextEqual(lines[i], "typedef struct", 14)) + { + bool validStruct = IsTextEqual(lines[i + 1], "struct", 6); + if (!validStruct) + { + for (int c = 0; c < MAX_LINE_LENGTH; c++) { - // Not valid struct if it ends without '{': - // i.e typedef struct rAudioBuffer rAudioBuffer; -> Typedef and forward declaration - break; + char v = lines[i][c]; + if (v == '{') validStruct = true; + if ((v == '{') || (v == ';') || (v == '\0')) break; } } if (!validStruct) continue; @@ -261,8 +294,8 @@ int main(int argc, char* argv[]) { char v = lines[i][c]; if (v == ' ') spaceCount++; - if (v == ';' && spaceCount == 2) validAlias = true; - if (v == ';' || v == '(' || v == '\0') break; + if ((v == ';') && (spaceCount == 2)) validAlias = true; + if ((v == ';') || (v == '(') || (v == '\0')) break; } if (!validAlias) continue; aliasLines[aliasCount] = i; @@ -274,7 +307,7 @@ int main(int argc, char* argv[]) for (int i = 0; i < linesCount; i++) { // Read enum line - if (IsTextEqual(lines[i], "typedef enum {", 14) && lines[i][TextLength(lines[i])-1] != ';') // ignore inline enums + if (IsTextEqual(lines[i], "typedef enum {", 14) && (lines[i][TextLength(lines[i])-1] != ';')) // ignore inline enums { // Keep the line position in the array of lines, // so, we can scan that position and following lines @@ -287,7 +320,7 @@ int main(int argc, char* argv[]) for (int i = 0; i < linesCount; i++) { int j = 0; - while (lines[i][j] == ' ' || lines[i][j] == '\t') j++; // skip spaces and tabs in the begining + while ((lines[i][j] == ' ') || (lines[i][j] == '\t')) j++; // skip spaces and tabs in the begining // Read define line if (IsTextEqual(lines[i]+j, "#define ", 8)) { @@ -313,18 +346,17 @@ int main(int argc, char* argv[]) char **linesPtr = &lines[structLines[i]]; // Parse struct description - if (linesPtr[-1][0] == '/') - { - MemoryCopy(structs[i].desc, linesPtr[-1], TextLength(linesPtr[-1])); - } + GetDescription(linesPtr[-1], structs[i].desc); // Get struct name: typedef struct name { const int TDS_LEN = 15; // length of "typedef struct " for (int c = TDS_LEN; c < 64 + TDS_LEN; c++) { - if (linesPtr[0][c] == '{') + if ((linesPtr[0][c] == '{') || (linesPtr[0][c] == ' ')) { - MemoryCopy(structs[i].name, &linesPtr[0][TDS_LEN], c - TDS_LEN - 1); + int nameLen = c - TDS_LEN; + while (linesPtr[0][TDS_LEN + nameLen - 1] == ' ') nameLen--; + MemoryCopy(structs[i].name, &linesPtr[0][TDS_LEN], nameLen); break; } } @@ -341,7 +373,7 @@ int main(int argc, char* argv[]) int fieldEndPos = 0; while (fieldLine[fieldEndPos] != ';') fieldEndPos++; - if (fieldLine[0] != '/') // Field line is not a comment + if ((fieldLine[0] != '/') && !IsTextEqual(fieldLine, "struct", 6)) // Field line is not a comment and not a struct declaration { //printf("Struct field: %s_\n", fieldLine); // OK! @@ -349,77 +381,125 @@ int main(int argc, char* argv[]) GetDataTypeAndName(fieldLine, fieldEndPos, structs[i].fieldType[structs[i].fieldCount], structs[i].fieldName[structs[i].fieldCount]); // Get the field description - // We start skipping spaces in front of description comment - int descStart = fieldEndPos; - while ((fieldLine[descStart] != '/') && (fieldLine[descStart] != '\0')) descStart++; - - int k = 0; - while ((fieldLine[descStart + k] != '\0') && (fieldLine[descStart + k] != '\n')) - { - structs[i].fieldDesc[structs[i].fieldCount][k] = fieldLine[descStart + k]; - k++; - } + GetDescription(&fieldLine[fieldEndPos], structs[i].fieldDesc[structs[i].fieldCount]); structs[i].fieldCount++; // Split field names containing multiple fields (like Matrix) + int additionalFields = 0; int originalIndex = structs[i].fieldCount - 1; - int originalLength = -1; - int lastStart; - for (int c = 0; c < TextLength(structs[i].fieldName[originalIndex]) + 1; c++) + for (int c = 0; c < TextLength(structs[i].fieldName[originalIndex]); c++) + { + if (structs[i].fieldName[originalIndex][c] == ',') additionalFields++; + } + if (additionalFields > 0) { - char v = structs[i].fieldName[originalIndex][c]; - bool isEndOfString = v == '\0'; - if ((v == ',') || isEndOfString) + int originalLength = -1; + int lastStart; + for (int c = 0; c < TextLength(structs[i].fieldName[originalIndex]) + 1; c++) { - if (originalLength == -1) + char v = structs[i].fieldName[originalIndex][c]; + bool isEndOfString = (v == '\0'); + if ((v == ',') || isEndOfString) { - // Save length of original field name - // Don't truncate yet, still needed for copying - originalLength = c; + if (originalLength == -1) + { + // Save length of original field name + // Don't truncate yet, still needed for copying + originalLength = c; + } + else + { + // Copy field data from original field + int nameLength = c - lastStart; + MemoryCopy(structs[i].fieldName[structs[i].fieldCount], &structs[i].fieldName[originalIndex][lastStart], nameLength); + MemoryCopy(structs[i].fieldType[structs[i].fieldCount], &structs[i].fieldType[originalIndex][0], TextLength(structs[i].fieldType[originalIndex])); + MemoryCopy(structs[i].fieldDesc[structs[i].fieldCount], &structs[i].fieldDesc[originalIndex][0], TextLength(structs[i].fieldDesc[originalIndex])); + structs[i].fieldCount++; + } + if (!isEndOfString) + { + // Skip comma and spaces + c++; + while (structs[i].fieldName[originalIndex][c] == ' ') c++; + + // Save position for next field + lastStart = c; + } } - else + } + // Set length of original field to truncate the first field name + structs[i].fieldName[originalIndex][originalLength] = '\0'; + } + + // Split field types containing multiple fields (like MemNode) + additionalFields = 0; + originalIndex = structs[i].fieldCount - 1; + for (int c = 0; c < TextLength(structs[i].fieldType[originalIndex]); c++) + { + if (structs[i].fieldType[originalIndex][c] == ',') additionalFields++; + } + if (additionalFields > 0) { + // Copy original name to last additional field + structs[i].fieldCount += additionalFields; + MemoryCopy(structs[i].fieldName[originalIndex + additionalFields], &structs[i].fieldName[originalIndex][0], TextLength(structs[i].fieldName[originalIndex])); + + // Copy names from type to additional fields + int fieldsRemaining = additionalFields; + int nameStart = -1; + int nameEnd = -1; + for (int k = TextLength(structs[i].fieldType[originalIndex]); k > 0; k--) + { + char v = structs[i].fieldType[originalIndex][k]; + if ((v == '*') || (v == ' ') || (v == ',')) { - // Copy field data from original field - int nameLength = c - lastStart; - MemoryCopy(structs[i].fieldName[structs[i].fieldCount], &(structs[i].fieldName[originalIndex][lastStart]), nameLength); - MemoryCopy(structs[i].fieldType[structs[i].fieldCount], &(structs[i].fieldType[originalIndex][0]), TextLength(structs[i].fieldType[originalIndex])); - MemoryCopy(structs[i].fieldDesc[structs[i].fieldCount], &(structs[i].fieldDesc[originalIndex][0]), TextLength(structs[i].fieldDesc[originalIndex])); - structs[i].fieldCount++; + if (nameEnd != -1) { + // Don't copy to last additional field + if (fieldsRemaining != additionalFields) + { + nameStart = k + 1; + MemoryCopy(structs[i].fieldName[originalIndex + fieldsRemaining], &structs[i].fieldType[originalIndex][nameStart], nameEnd - nameStart + 1); + } + nameEnd = -1; + fieldsRemaining--; + } } - if (!isEndOfString) - { - // Skip comma and spaces - c++; - while (structs[i].fieldName[originalIndex][c] == ' ') c++; + else if (nameEnd == -1) nameEnd = k; + } - // Save position for next field - lastStart = c; - } + // Truncate original field type + int fieldTypeLength = nameStart; + structs[i].fieldType[originalIndex][fieldTypeLength] = '\0'; + + // Set field type and description of additional fields + for (int j = 1; j <= additionalFields; j++) + { + 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])); + } } - // Set length of original field - // This has no effect on fields that are on their own line - // But it truncates the first field name of fields that share a line - structs[i].fieldName[originalIndex][originalLength] = '\0'; } } l++; } + // Move array sizes from name to type + for (int j = 0; j < structs[i].fieldCount; j++) + { + MoveArraySize(structs[i].fieldName[j], structs[i].fieldType[j]); + } } free(structLines); // Alias info data aliases = (AliasInfo *)calloc(MAX_ALIASES_TO_PARSE, sizeof(AliasInfo)); - int aliasIndex = 0; for (int i = 0; i < aliasCount; i++) { // Description from previous line - char *previousLinePtr = lines[aliasLines[i] - 1]; - if (previousLinePtr[0] == '/') MemoryCopy(aliases[i].desc, previousLinePtr, MAX_LINE_LENGTH); + GetDescription(lines[aliasLines[i] - 1], aliases[i].desc); char *linePtr = lines[aliasLines[i]]; @@ -430,7 +510,7 @@ int main(int argc, char* argv[]) int typeStart = c; while(linePtr[c] != ' ') c++; int typeLen = c - typeStart; - MemoryCopy(aliases[i].type, linePtr + typeStart, typeLen); + MemoryCopy(aliases[i].type, &linePtr[typeStart], typeLen); // Skip space c++; @@ -439,14 +519,69 @@ int main(int argc, char* argv[]) int nameStart = c; while(linePtr[c] != ';') c++; int nameLen = c - nameStart; - MemoryCopy(aliases[i].name, linePtr + nameStart, nameLen); + MemoryCopy(aliases[i].name, &linePtr[nameStart], nameLen); // Description - while((linePtr[c] != '\0') && (linePtr[c] != '/')) c++; - if (linePtr[c] == '/') MemoryCopy(aliases[i].desc, linePtr + c, MAX_LINE_LENGTH); + GetDescription(&linePtr[c], aliases[i].desc); } free(aliasLines); + // Callback info data + callbacks = (FunctionInfo *)calloc(MAX_CALLBACKS_TO_PARSE, sizeof(FunctionInfo)); + + for (int i = 0; i < callbackCount; i++) + { + char *linePtr = lines[callbackLines[i]]; + + // Skip "typedef " + int c = 8; + + // Return type + int retTypeStart = c; + while(linePtr[c] != '(') c++; + int retTypeLen = c - retTypeStart; + while(linePtr[retTypeStart + retTypeLen - 1] == ' ') retTypeLen--; + MemoryCopy(callbacks[i].retType, &linePtr[retTypeStart], retTypeLen); + + // Skip "(*" + c += 2; + + // Name + int nameStart = c; + while(linePtr[c] != ')') c++; + int nameLen = c - nameStart; + MemoryCopy(callbacks[i].name, &linePtr[nameStart], nameLen); + + // Skip ")(" + c += 2; + + // Params + int paramStart = c; + for (c; c < MAX_LINE_LENGTH; c++) + { + if ((linePtr[c] == ',') || (linePtr[c] == ')')) + { + // Get parameter type + name, extract info + int paramLen = c - paramStart; + GetDataTypeAndName(&linePtr[paramStart], paramLen, callbacks[i].paramType[callbacks[i].paramCount], callbacks[i].paramName[callbacks[i].paramCount]); + callbacks[i].paramCount++; + paramStart = c + 1; + while(linePtr[paramStart] == ' ') paramStart++; + } + if (linePtr[c] == ')') break; + } + + // Description + GetDescription(&linePtr[c], callbacks[i].desc); + + // Move array sizes from name to type + for (int j = 0; j < callbacks[i].paramCount; j++) + { + MoveArraySize(callbacks[i].paramName[j], callbacks[i].paramType[j]); + } + } + free(callbackLines); + // Enum info data enums = (EnumInfo *)calloc(MAX_ENUMS_TO_PARSE, sizeof(EnumInfo)); @@ -462,7 +597,7 @@ int main(int argc, char* argv[]) char *linePtr = lines[j]; if ((linePtr[0] != '/') || (linePtr[2] != ' ')) { - MemoryCopy(enums[i].desc, &lines[j + 1][0], sizeof(enums[i].desc) - 1); + GetDescription(&lines[j + 1][0], enums[i].desc); break; } } @@ -536,13 +671,8 @@ int main(int argc, char* argv[]) } else enums[i].valueInteger[enums[i].valueCount] = (enums[i].valueInteger[enums[i].valueCount - 1] + 1); - // Look for description or end of line - while ((linePtr[c] != '/') && (linePtr[c] != '\0')) c++; - if (linePtr[c] == '/') - { - // Parse value description - MemoryCopy(enums[i].valueDesc[enums[i].valueCount], &linePtr[c], sizeof(enums[0].valueDesc[0]) - c - 1); - } + // Parse value description + GetDescription(&linePtr[c], enums[i].valueDesc[enums[i].valueCount]); enums[i].valueCount++; } @@ -577,7 +707,14 @@ int main(int argc, char* argv[]) // Extract name int defineNameStart = j; - while ((linePtr[j] != ' ') && (linePtr[j] != '\t') && (linePtr[j] != '\0')) j++; + int openBraces = 0; + while (linePtr[j] != '\0') + { + if (((linePtr[j] == ' ') || (linePtr[j] == '\t')) && (openBraces == 0)) break; + if (linePtr[j] == '(') openBraces++; + if (linePtr[j] == ')') openBraces--; + j++; + } int defineNameEnd = j-1; // Skip duplicates @@ -585,7 +722,7 @@ int main(int argc, char* argv[]) bool isDuplicate = false; for (int k = 0; k < defineIndex; k++) { - if ((nameLen == TextLength(defines[k].name)) && IsTextEqual(defines[k].name, linePtr + defineNameStart, nameLen)) + if ((nameLen == TextLength(defines[k].name)) && IsTextEqual(defines[k].name, &linePtr[defineNameStart], nameLen)) { isDuplicate = true; break; @@ -593,7 +730,7 @@ int main(int argc, char* argv[]) } if (isDuplicate) continue; - MemoryCopy(defines[defineIndex].name, linePtr + defineNameStart, nameLen); + MemoryCopy(defines[defineIndex].name, &linePtr[defineNameStart], nameLen); // Determine type if (linePtr[defineNameEnd] == ')') defines[defineIndex].type = MACRO; @@ -645,18 +782,20 @@ int main(int argc, char* argv[]) int valueLen = defineValueEnd - defineValueStart + 1; if (valueLen > 255) valueLen = 255; - if (valueLen > 0) MemoryCopy(defines[defineIndex].value, linePtr + defineValueStart, valueLen); + if (valueLen > 0) MemoryCopy(defines[defineIndex].value, &linePtr[defineValueStart], valueLen); // Extracting description - if (linePtr[j] == '/') + if ((linePtr[j] == '/') && linePtr[j + 1] == '/') { + j += 2; + while (linePtr[j] == ' ') j++; int commentStart = j; while ((linePtr[j] != '\\') && (linePtr[j] != '\0')) j++; int commentEnd = j-1; int commentLen = commentEnd - commentStart + 1; if (commentLen > 127) commentLen = 127; - MemoryCopy(defines[defineIndex].desc, linePtr + commentStart, commentLen); + MemoryCopy(defines[defineIndex].desc, &linePtr[commentStart], commentLen); } defineIndex++; @@ -669,13 +808,15 @@ int main(int argc, char* argv[]) for (int i = 0; i < funcCount; i++) { + char *linePtr = lines[funcLines[i]]; + int funcParamsStart = 0; int funcEnd = 0; // Get return type and function name from func line - for (int c = 0; (c < MAX_LINE_LENGTH) && (funcLines[i][c] != '\n'); c++) + for (int c = 0; (c < MAX_LINE_LENGTH) && (linePtr[c] != '\n'); c++) { - if (funcLines[i][c] == '(') // Starts function parameters + if (linePtr[c] == '(') // Starts function parameters { funcParamsStart = c + 1; @@ -683,7 +824,7 @@ int main(int argc, char* argv[]) char funcRetTypeName[128] = { 0 }; int dc = TextLength(apiDefine) + 1; int funcRetTypeNameLen = c - dc; // Substract `define` ("RLAPI " for raylib.h) - MemoryCopy(funcRetTypeName, &funcLines[i][dc], funcRetTypeNameLen); + MemoryCopy(funcRetTypeName, &linePtr[dc], funcRetTypeNameLen); GetDataTypeAndName(funcRetTypeName, funcRetTypeNameLen, funcs[i].retType, funcs[i].name); break; @@ -693,30 +834,30 @@ int main(int argc, char* argv[]) // Get parameters from func line for (int c = funcParamsStart; c < MAX_LINE_LENGTH; c++) { - if (funcLines[i][c] == ',') // Starts function parameters + if (linePtr[c] == ',') // Starts function parameters { // Get parameter type + name, extract info char funcParamTypeName[128] = { 0 }; int funcParamTypeNameLen = c - funcParamsStart; - MemoryCopy(funcParamTypeName, &funcLines[i][funcParamsStart], funcParamTypeNameLen); + MemoryCopy(funcParamTypeName, &linePtr[funcParamsStart], funcParamTypeNameLen); GetDataTypeAndName(funcParamTypeName, funcParamTypeNameLen, funcs[i].paramType[funcs[i].paramCount], funcs[i].paramName[funcs[i].paramCount]); funcParamsStart = c + 1; - if (funcLines[i][c + 1] == ' ') funcParamsStart += 1; + if (linePtr[c + 1] == ' ') funcParamsStart += 1; funcs[i].paramCount++; // Move to next parameter } - else if (funcLines[i][c] == ')') + else if (linePtr[c] == ')') { funcEnd = c + 2; // Check if previous word is void - if ((funcLines[i][c - 4] == 'v') && (funcLines[i][c - 3] == 'o') && (funcLines[i][c - 2] == 'i') && (funcLines[i][c - 1] == 'd')) break; + if ((linePtr[c - 4] == 'v') && (linePtr[c - 3] == 'o') && (linePtr[c - 2] == 'i') && (linePtr[c - 1] == 'd')) break; // Get parameter type + name, extract info char funcParamTypeName[128] = { 0 }; int funcParamTypeNameLen = c - funcParamsStart; - MemoryCopy(funcParamTypeName, &funcLines[i][funcParamsStart], funcParamTypeNameLen); + MemoryCopy(funcParamTypeName, &linePtr[funcParamsStart], funcParamTypeNameLen); GetDataTypeAndName(funcParamTypeName, funcParamTypeNameLen, funcs[i].paramType[funcs[i].paramCount], funcs[i].paramName[funcs[i].paramCount]); @@ -726,27 +867,27 @@ int main(int argc, char* argv[]) } // Get function description - for (int c = funcEnd; c < MAX_LINE_LENGTH; c++) + GetDescription(&linePtr[funcEnd], funcs[i].desc); + + // Move array sizes from name to type + for (int j = 0; j < funcs[i].paramCount; j++) { - if (funcLines[i][c] == '/') - { - MemoryCopy(funcs[i].desc, &funcLines[i][c], 127); // WARNING: Size could be too long for funcLines[i][c]? - break; - } + MoveArraySize(funcs[i].paramName[j], funcs[i].paramType[j]); } } + free(funcLines); for (int i = 0; i < linesCount; i++) free(lines[i]); free(lines); - free(funcLines); // At this point, all raylib data has been parsed! //----------------------------------------------------------------------------------------- - // structs[] -> We have all the structs decomposed into pieces for further analysis - // aliases[] -> We have all the aliases decomposed into pieces for further analysis - // enums[] -> We have all the enums decomposed into pieces for further analysis - // funcs[] -> We have all the functions 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 + // aliases[] -> We have all the aliases decomposed into pieces for further analysis + // enums[] -> We have all the enums decomposed into pieces for further analysis + // funcs[] -> We have all the functions decomposed into pieces for further analysis + // callbacks[] -> We have all the callbacks decomposed into pieces for further analysis + // defines[] -> We have all the defines decomposed into pieces for further analysis // Process input file to output if (outFileName[0] == '\0') MemoryCopy(outFileName, "raylib_api.txt\0", 15); @@ -761,6 +902,7 @@ int main(int argc, char* argv[]) ExportParsedData(outFileName, outputFormat); free(funcs); + free(callbacks); free(structs); free(aliases); free(enums); @@ -969,6 +1111,26 @@ static void GetDataTypeAndName(const char *typeName, int typeNameLen, char *type } } +// Get comment from a line, do nothing if no comment in line +static void GetDescription(const char *line, char *description) +{ + int c = 0; + int descStart = -1; + int lastSlash = -2; + bool isValid = false; + while (line[c] != '\0') + { + if (isValid && (descStart == -1) && (line[c] != ' ')) descStart = c; + else if (line[c] == '/') + { + if (lastSlash == c - 1) isValid = true; + lastSlash = c; + } + c++; + } + if (descStart != -1) MemoryCopy(description, &line[descStart], c - descStart); +} + // Get text length in bytes, check for \0 character static unsigned int TextLength(const char *text) { @@ -1047,6 +1209,24 @@ static const char *StrDefineType(DefineType type) 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 // REQUIRES: strlen(), strstr(), strncpy(), strcpy() -> TODO: Replace by custom implementations! @@ -1114,8 +1294,13 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, "Struct %02i: %s (%i fields)\n", i + 1, structs[i].name, structs[i].fieldCount); fprintf(outFile, " Name: %s\n", structs[i].name); - fprintf(outFile, " Description: %s\n", structs[i].desc + 3); - for (int f = 0; f < structs[i].fieldCount; f++) fprintf(outFile, " Field[%i]: %s %s %s\n", f + 1, structs[i].fieldType[f], structs[i].fieldName[f], structs[i].fieldDesc[f]); + fprintf(outFile, " Description: %s\n", structs[i].desc); + for (int f = 0; f < structs[i].fieldCount; f++) + { + fprintf(outFile, " Field[%i]: %s %s ", f + 1, structs[i].fieldType[f], structs[i].fieldName[f]); + if (structs[i].fieldDesc[f][0]) fprintf(outFile, "// %s\n", structs[i].fieldDesc[f]); + else fprintf(outFile, "\n"); + } } // Print aliases info @@ -1125,7 +1310,7 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, "Alias %03i: %s\n", i + 1, aliases[i].name); fprintf(outFile, " Type: %s\n", aliases[i].type); fprintf(outFile, " Name: %s\n", aliases[i].name); - fprintf(outFile, " Description: %s\n", aliases[i].desc + 3); + fprintf(outFile, " Description: %s\n", aliases[i].desc); } // Print enums info @@ -1134,7 +1319,7 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, "Enum %02i: %s (%i values)\n", i + 1, enums[i].name, enums[i].valueCount); fprintf(outFile, " Name: %s\n", enums[i].name); - fprintf(outFile, " Description: %s\n", enums[i].desc + 3); + fprintf(outFile, " Description: %s\n", enums[i].desc); for (int e = 0; e < enums[i].valueCount; e++) fprintf(outFile, " Value[%s]: %i\n", enums[i].valueName[e], enums[i].valueInteger[e]); } @@ -1145,11 +1330,23 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, "Function %03i: %s() (%i input parameters)\n", i + 1, funcs[i].name, funcs[i].paramCount); fprintf(outFile, " Name: %s\n", funcs[i].name); fprintf(outFile, " Return type: %s\n", funcs[i].retType); - fprintf(outFile, " Description: %s\n", funcs[i].desc + 3); + fprintf(outFile, " Description: %s\n", funcs[i].desc); for (int p = 0; p < funcs[i].paramCount; p++) fprintf(outFile, " Param[%i]: %s (type: %s)\n", p + 1, funcs[i].paramName[p], funcs[i].paramType[p]); if (funcs[i].paramCount == 0) fprintf(outFile, " No input parameters\n"); } + // Print callbacks info + fprintf(outFile, "\nCallbacks found: %i\n\n", callbackCount); + for (int i = 0; i < callbackCount; i++) + { + fprintf(outFile, "Callback %03i: %s() (%i input parameters)\n", i + 1, callbacks[i].name, callbacks[i].paramCount); + fprintf(outFile, " Name: %s\n", callbacks[i].name); + fprintf(outFile, " Return type: %s\n", callbacks[i].retType); + fprintf(outFile, " Description: %s\n", callbacks[i].desc); + for (int p = 0; p < callbacks[i].paramCount; p++) fprintf(outFile, " Param[%i]: %s (type: %s)\n", p + 1, callbacks[i].paramName[p], callbacks[i].paramType[p]); + if (callbacks[i].paramCount == 0) fprintf(outFile, " No input parameters\n"); + } + // Print defines info fprintf(outFile, "\nDefines found: %i\n\n", defineCount); for (int i = 0; i < defineCount; i++) @@ -1158,7 +1355,7 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, " Name: %s\n", defines[i].name); fprintf(outFile, " Type: %s\n", StrDefineType(defines[i].type)); fprintf(outFile, " Value: %s\n", defines[i].value); - fprintf(outFile, " Description: %s\n", defines[i].desc + 3); + fprintf(outFile, " Description: %s\n", defines[i].desc); } } break; case LUA: @@ -1171,14 +1368,14 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " {\n"); fprintf(outFile, " name = \"%s\",\n", structs[i].name); - fprintf(outFile, " description = \"%s\",\n", EscapeBackslashes(structs[i].desc + 3)); + fprintf(outFile, " description = \"%s\",\n", EscapeBackslashes(structs[i].desc)); fprintf(outFile, " fields = {\n"); for (int f = 0; f < structs[i].fieldCount; f++) { fprintf(outFile, " {\n"); fprintf(outFile, " type = \"%s\",\n", structs[i].fieldType[f]); fprintf(outFile, " name = \"%s\",\n", structs[i].fieldName[f]); - fprintf(outFile, " description = \"%s\"\n", EscapeBackslashes(structs[i].fieldDesc[f] + 3)); + fprintf(outFile, " description = \"%s\"\n", EscapeBackslashes(structs[i].fieldDesc[f])); fprintf(outFile, " }"); if (f < structs[i].fieldCount - 1) fprintf(outFile, ",\n"); else fprintf(outFile, "\n"); @@ -1197,7 +1394,7 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, " {\n"); fprintf(outFile, " type = \"%s\",\n", aliases[i].type); fprintf(outFile, " name = \"%s\",\n", aliases[i].name); - fprintf(outFile, " description = \"%s\"\n", aliases[i].desc + 3); + fprintf(outFile, " description = \"%s\"\n", aliases[i].desc); fprintf(outFile, " }"); if (i < aliasCount - 1) fprintf(outFile, ",\n"); @@ -1211,14 +1408,14 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " {\n"); fprintf(outFile, " name = \"%s\",\n", enums[i].name); - fprintf(outFile, " description = \"%s\",\n", EscapeBackslashes(enums[i].desc + 3)); + fprintf(outFile, " description = \"%s\",\n", EscapeBackslashes(enums[i].desc)); fprintf(outFile, " values = {\n"); for (int e = 0; e < enums[i].valueCount; e++) { fprintf(outFile, " {\n"); fprintf(outFile, " name = \"%s\",\n", enums[i].valueName[e]); fprintf(outFile, " value = %i,\n", enums[i].valueInteger[e]); - fprintf(outFile, " description = \"%s\"\n", EscapeBackslashes(enums[i].valueDesc[e] + 3)); + fprintf(outFile, " description = \"%s\"\n", EscapeBackslashes(enums[i].valueDesc[e])); fprintf(outFile, " }"); if (e < enums[i].valueCount - 1) fprintf(outFile, ",\n"); else fprintf(outFile, "\n"); @@ -1249,7 +1446,7 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " value = \"%s\",\n", defines[i].value); } - fprintf(outFile, " description = \"%s\"\n", defines[i].desc + 3); + fprintf(outFile, " description = \"%s\"\n", defines[i].desc); fprintf(outFile, " }"); if (i < defineCount - 1) fprintf(outFile, ",\n"); @@ -1263,7 +1460,7 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " {\n"); fprintf(outFile, " name = \"%s\",\n", funcs[i].name); - fprintf(outFile, " description = \"%s\",\n", EscapeBackslashes(funcs[i].desc + 3)); + fprintf(outFile, " description = \"%s\",\n", EscapeBackslashes(funcs[i].desc)); fprintf(outFile, " returnType = \"%s\"", funcs[i].retType); if (funcs[i].paramCount == 0) fprintf(outFile, "\n"); @@ -1283,6 +1480,34 @@ static void ExportParsedData(const char *fileName, int format) if (i < funcCount - 1) fprintf(outFile, ",\n"); else fprintf(outFile, "\n"); } + fprintf(outFile, " },\n"); + + // Print callbacks info + fprintf(outFile, " callbacks = {\n"); + for (int i = 0; i < callbackCount; i++) + { + fprintf(outFile, " {\n"); + fprintf(outFile, " name = \"%s\",\n", callbacks[i].name); + fprintf(outFile, " description = \"%s\",\n", EscapeBackslashes(callbacks[i].desc)); + fprintf(outFile, " returnType = \"%s\"", callbacks[i].retType); + + if (callbacks[i].paramCount == 0) fprintf(outFile, "\n"); + else + { + fprintf(outFile, ",\n params = {\n"); + for (int p = 0; p < callbacks[i].paramCount; p++) + { + fprintf(outFile, " {type = \"%s\", name = \"%s\"}", callbacks[i].paramType[p], callbacks[i].paramName[p]); + if (p < callbacks[i].paramCount - 1) fprintf(outFile, ",\n"); + else fprintf(outFile, "\n"); + } + fprintf(outFile, " }\n"); + } + fprintf(outFile, " }"); + + if (i < callbackCount - 1) fprintf(outFile, ",\n"); + else fprintf(outFile, "\n"); + } fprintf(outFile, " }\n"); fprintf(outFile, "}\n"); } break; @@ -1296,14 +1521,14 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " {\n"); fprintf(outFile, " \"name\": \"%s\",\n", structs[i].name); - fprintf(outFile, " \"description\": \"%s\",\n", EscapeBackslashes(structs[i].desc + 3)); + fprintf(outFile, " \"description\": \"%s\",\n", EscapeBackslashes(structs[i].desc)); fprintf(outFile, " \"fields\": [\n"); for (int f = 0; f < structs[i].fieldCount; f++) { fprintf(outFile, " {\n"); fprintf(outFile, " \"type\": \"%s\",\n", structs[i].fieldType[f]); fprintf(outFile, " \"name\": \"%s\",\n", structs[i].fieldName[f]); - fprintf(outFile, " \"description\": \"%s\"\n", EscapeBackslashes(structs[i].fieldDesc[f] + 3)); + fprintf(outFile, " \"description\": \"%s\"\n", EscapeBackslashes(structs[i].fieldDesc[f])); fprintf(outFile, " }"); if (f < structs[i].fieldCount - 1) fprintf(outFile, ",\n"); else fprintf(outFile, "\n"); @@ -1322,7 +1547,7 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, " {\n"); fprintf(outFile, " \"type\": \"%s\",\n", aliases[i].type); fprintf(outFile, " \"name\": \"%s\",\n", aliases[i].name); - fprintf(outFile, " \"description\": \"%s\"\n", aliases[i].desc + 3); + fprintf(outFile, " \"description\": \"%s\"\n", aliases[i].desc); fprintf(outFile, " }"); if (i < aliasCount - 1) fprintf(outFile, ",\n"); @@ -1336,14 +1561,14 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " {\n"); fprintf(outFile, " \"name\": \"%s\",\n", enums[i].name); - fprintf(outFile, " \"description\": \"%s\",\n", EscapeBackslashes(enums[i].desc + 3)); + fprintf(outFile, " \"description\": \"%s\",\n", EscapeBackslashes(enums[i].desc)); fprintf(outFile, " \"values\": [\n"); for (int e = 0; e < enums[i].valueCount; e++) { fprintf(outFile, " {\n"); fprintf(outFile, " \"name\": \"%s\",\n", enums[i].valueName[e]); fprintf(outFile, " \"value\": %i,\n", enums[i].valueInteger[e]); - fprintf(outFile, " \"description\": \"%s\"\n", EscapeBackslashes(enums[i].valueDesc[e] + 3)); + fprintf(outFile, " \"description\": \"%s\"\n", EscapeBackslashes(enums[i].valueDesc[e])); fprintf(outFile, " }"); if (e < enums[i].valueCount - 1) fprintf(outFile, ",\n"); else fprintf(outFile, "\n"); @@ -1378,7 +1603,7 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " \"value\": \"%s\",\n", defines[i].value); } - fprintf(outFile, " \"description\": \"%s\"\n", defines[i].desc + 3); + fprintf(outFile, " \"description\": \"%s\"\n", defines[i].desc); fprintf(outFile, " }"); if (i < defineCount - 1) fprintf(outFile, ",\n"); @@ -1392,7 +1617,7 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, " {\n"); fprintf(outFile, " \"name\": \"%s\",\n", funcs[i].name); - fprintf(outFile, " \"description\": \"%s\",\n", EscapeBackslashes(funcs[i].desc + 3)); + fprintf(outFile, " \"description\": \"%s\",\n", EscapeBackslashes(funcs[i].desc)); fprintf(outFile, " \"returnType\": \"%s\"", funcs[i].retType); if (funcs[i].paramCount == 0) fprintf(outFile, "\n"); @@ -1415,6 +1640,37 @@ static void ExportParsedData(const char *fileName, int format) if (i < funcCount - 1) fprintf(outFile, ",\n"); else fprintf(outFile, "\n"); } + fprintf(outFile, " ],\n"); + + // Print callbacks info + fprintf(outFile, " \"callbacks\": [\n"); + for (int i = 0; i < callbackCount; i++) + { + fprintf(outFile, " {\n"); + fprintf(outFile, " \"name\": \"%s\",\n", callbacks[i].name); + fprintf(outFile, " \"description\": \"%s\",\n", EscapeBackslashes(callbacks[i].desc)); + fprintf(outFile, " \"returnType\": \"%s\"", callbacks[i].retType); + + if (callbacks[i].paramCount == 0) fprintf(outFile, "\n"); + else + { + fprintf(outFile, ",\n \"params\": [\n"); + for (int p = 0; p < callbacks[i].paramCount; p++) + { + fprintf(outFile, " {\n"); + fprintf(outFile, " \"type\": \"%s\",\n", callbacks[i].paramType[p]); + fprintf(outFile, " \"name\": \"%s\"\n", callbacks[i].paramName[p]); + fprintf(outFile, " }"); + if (p < callbacks[i].paramCount - 1) fprintf(outFile, ",\n"); + else fprintf(outFile, "\n"); + } + fprintf(outFile, " ]\n"); + } + fprintf(outFile, " }"); + + if (i < callbackCount - 1) fprintf(outFile, ",\n"); + else fprintf(outFile, "\n"); + } fprintf(outFile, " ]\n"); fprintf(outFile, "}\n"); } break; @@ -1448,6 +1704,12 @@ static void ExportParsedData(const char *fileName, int format) + + + + + + */ @@ -1458,10 +1720,10 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, " \n", structCount); for (int i = 0; i < structCount; i++) { - fprintf(outFile, " \n", structs[i].name, structs[i].fieldCount, structs[i].desc + 3); + fprintf(outFile, " \n", structs[i].name, structs[i].fieldCount, structs[i].desc); for (int f = 0; f < structs[i].fieldCount; f++) { - fprintf(outFile, " \n", structs[i].fieldType[f], structs[i].fieldName[f], structs[i].fieldDesc[f] + 3); + fprintf(outFile, " \n", structs[i].fieldType[f], structs[i].fieldName[f], structs[i].fieldDesc[f]); } fprintf(outFile, " \n"); } @@ -1471,7 +1733,7 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, " \n", aliasCount); for (int i = 0; i < aliasCount; i++) { - fprintf(outFile, " \n", aliases[i].name, aliases[i].type, aliases[i].desc + 3); + fprintf(outFile, " \n", aliases[i].name, aliases[i].type, aliases[i].desc); } fprintf(outFile, " \n"); @@ -1479,10 +1741,10 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, " \n", enumCount); for (int i = 0; i < enumCount; i++) { - fprintf(outFile, " \n", enums[i].name, enums[i].valueCount, enums[i].desc + 3); + fprintf(outFile, " \n", enums[i].name, enums[i].valueCount, enums[i].desc); for (int v = 0; v < enums[i].valueCount; v++) { - fprintf(outFile, " \n", enums[i].valueName[v], enums[i].valueInteger[v], enums[i].valueDesc[v] + 3); + fprintf(outFile, " \n", enums[i].valueName[v], enums[i].valueInteger[v], enums[i].valueDesc[v]); } fprintf(outFile, " \n"); } @@ -1501,7 +1763,7 @@ static void ExportParsedData(const char *fileName, int format) { fprintf(outFile, "value=\"%s\"", defines[i].value); } - fprintf(outFile, " desc=\"%s\" />\n", defines[i].desc + 3); + fprintf(outFile, " desc=\"%s\" />\n", defines[i].desc); } fprintf(outFile, " \n"); @@ -1509,15 +1771,28 @@ static void ExportParsedData(const char *fileName, int format) fprintf(outFile, " \n", funcCount); for (int i = 0; i < funcCount; i++) { - fprintf(outFile, " \n", funcs[i].name, funcs[i].retType, funcs[i].paramCount, funcs[i].desc + 3); + fprintf(outFile, " \n", funcs[i].name, funcs[i].retType, funcs[i].paramCount, funcs[i].desc); for (int p = 0; p < funcs[i].paramCount; p++) { - fprintf(outFile, " \n", funcs[i].paramType[p], funcs[i].paramName[p], funcs[i].paramDesc[p] + 3); + fprintf(outFile, " \n", funcs[i].paramType[p], funcs[i].paramName[p], funcs[i].paramDesc[p]); } fprintf(outFile, " \n"); } fprintf(outFile, " \n"); + // Print callbacks info + fprintf(outFile, " \n", callbackCount); + for (int i = 0; i < callbackCount; i++) + { + fprintf(outFile, " \n", callbacks[i].name, callbacks[i].retType, callbacks[i].paramCount, callbacks[i].desc); + for (int p = 0; p < callbacks[i].paramCount; p++) + { + fprintf(outFile, " \n", callbacks[i].paramType[p], callbacks[i].paramName[p], callbacks[i].paramDesc[p]); + } + fprintf(outFile, " \n"); + } + fprintf(outFile, " \n"); + fprintf(outFile, "\n"); } break;