Parse struct descriptions (#2214)

* Update struct parser to parse from lines buffer

* Parse struct description

* Fix erroneous comment
This commit is contained in:
Benedek Szilvasy 2021-12-16 15:34:55 +00:00 committed by GitHub
parent 60b1f29783
commit 51c929ef21
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 158 additions and 186 deletions

View file

@ -91,7 +91,7 @@ typedef struct FunctionInfo {
// Struct info data
typedef struct StructInfo {
char name[64]; // Struct name
char desc[64]; // Struct type description
char desc[128]; // Struct type description
int fieldCount; // Number of fields in the struct
char fieldType[MAX_STRUCT_FIELDS][64]; // Field type
char fieldName[MAX_STRUCT_FIELDS][64]; // Field name
@ -101,7 +101,7 @@ typedef struct StructInfo {
// Enum info data
typedef struct EnumInfo {
char name[64]; // Enum name
char desc[64]; // Enum description
char desc[128]; // Enum description
int valueCount; // Number of values in enumerator
char valueName[MAX_ENUM_VALUES][64]; // Value name definition
int valueInteger[MAX_ENUM_VALUES]; // Value integer
@ -164,8 +164,7 @@ int main(int argc, char* argv[])
char **funcLines = (char **)malloc(MAX_FUNCS_TO_PARSE*sizeof(char *));
// Structs data (multiple lines), selected from "buffer"
char **structLines = (char **)malloc(MAX_STRUCTS_TO_PARSE*sizeof(char *));
for (int i = 0; i < MAX_STRUCTS_TO_PARSE; i++) structLines[i] = (char *)calloc(MAX_STRUCT_LINE_LENGTH, sizeof(char));
int *structLines = (int *)malloc(MAX_STRUCTS_TO_PARSE*sizeof(int));
// Enums lines pointers, selected from buffer "lines"
int *enumLines = (int *)malloc(MAX_ENUMS_TO_PARSE*sizeof(int));
@ -185,52 +184,34 @@ int main(int argc, char* argv[])
}
}
// Read structs data (multiple lines, read directly from buffer)
// TODO: Parse structs data from "lines" instead of "buffer" -> Easier to get struct definition and description
for (int i = 0; i < length; i++)
// Read struct lines
for (int i = 0; i < linesCount; i++)
{
// Read struct data (starting with "typedef struct", ending with '} ... ;')
// NOTE: We read it directly from buffer
if (IsTextEqual(buffer + i, "typedef struct", 14))
// Find structs (starting with "typedef struct ... {", ending with '} ... ;')
if (IsTextEqual(lines[i], "typedef struct", 14))
{
int j = 0;
bool validStruct = false;
// WARNING: Typedefs between types: typedef Vector4 Quaternion;
// (maybe we could export these too?)
for (int c = 0; c < 128; c++)
for (int c = 0; c < MAX_LINE_LENGTH; c++)
{
if (buffer[i + c] == '{')
char v = lines[i][c];
if (v == '{') validStruct = true;
if (v == '{' || v == ';' || v == '\0')
{
validStruct = true;
break;
}
else if (buffer[i + c] == ';')
{
// Not valid struct:
// Not valid struct if it ends without '{':
// i.e typedef struct rAudioBuffer rAudioBuffer; -> Typedef and forward declaration
i += c;
break;
}
}
if (validStruct)
{
while (buffer[i + j] != '}')
{
structLines[structCount][j] = buffer[i + j];
j++;
}
while (buffer[i + j] != '\n')
{
structLines[structCount][j] = buffer[i + j];
j++;
}
i += j;
structCount++;
}
if (!validStruct) continue;
structLines[structCount] = i;
while (lines[i][0] != '}') i++;
while (lines[i][0] != '\0') i++;
structCount++;
}
}
@ -259,44 +240,36 @@ int main(int argc, char* argv[])
for (int i = 0; i < structCount; i++)
{
int structLineOffset = 0;
char **linesPtr = &lines[structLines[i]];
// TODO: Get struct description
// Parse struct description
if (linesPtr[-1][0] == '/')
{
MemoryCopy(structs[i].desc, linesPtr[-1], TextLength(linesPtr[-1]));
}
// Get struct name: typedef struct name {
for (int c = 15; c < 64 + 15; c++)
const int TDS_LEN = 15; // length of "typedef struct "
for (int c = TDS_LEN; c < 64 + TDS_LEN; c++)
{
if (structLines[i][c] == '{')
if (linesPtr[0][c] == '{')
{
structLineOffset = c + 2;
MemoryCopy(structs[i].name, &structLines[i][15], c - 15 - 1);
MemoryCopy(structs[i].name, &linesPtr[0][TDS_LEN], c - TDS_LEN - 1);
break;
}
}
// Get struct fields and count them -> fields finish with ;
int j = 0;
while (structLines[i][structLineOffset + j] != '}')
int l = 1;
while (linesPtr[l][0] != '}')
{
// WARNING: Some structs have empty spaces and comments -> OK, processed
int fieldStart = 0;
if ((structLines[i][structLineOffset + j] != ' ') && (structLines[i][structLineOffset + j] != '\n')) fieldStart = structLineOffset + j;
if (fieldStart != 0)
if ((linesPtr[l][0] != ' ') && (linesPtr[l][0] != '\0'))
{
// Scan one field line
int c = 0;
char *fieldLine = linesPtr[l];
int fieldEndPos = 0;
char fieldLine[256] = { 0 };
while (structLines[i][structLineOffset + j] != '\n')
{
if (structLines[i][structLineOffset + j] == ';') fieldEndPos = c;
fieldLine[c] = structLines[i][structLineOffset + j];
c++; j++;
}
while (fieldLine[fieldEndPos] != ';') fieldEndPos++;
if (fieldLine[0] != '/') // Field line is not a comment
{
@ -321,12 +294,11 @@ int main(int argc, char* argv[])
}
}
j++;
l++;
}
}
for (int i = 0; i < MAX_STRUCTS_TO_PARSE; i++) free(structLines[i]);
free(structLines);
// Enum info data