[WIP/MOD] Start allowing j2s to take an union type

This commit is contained in:
lda 2023-12-11 01:12:29 +01:00
parent fb8ec5f3ae
commit 3cdd227175
Signed by: lda
GPG key ID: 6898757653ABE3E6

View file

@ -309,7 +309,7 @@ Main(Array * args)
ArrayAdd(requiredTypes, StrDuplicate(type)); ArrayAdd(requiredTypes, StrDuplicate(type));
} }
if (StrEquals(typeType, "struct")) if (StrEquals(typeType, "struct") || StrEquals(typeType, "union"))
{ {
typeFieldsVal = HashMapGet(typeObj, "fields"); typeFieldsVal = HashMapGet(typeObj, "fields");
if (JsonValueType(typeFieldsVal) != JSON_OBJECT) if (JsonValueType(typeFieldsVal) != JSON_OBJECT)
@ -481,6 +481,7 @@ Main(Array * args)
HashMap *fields; HashMap *fields;
char *field; char *field;
char *info;
HashMap *fieldDesc; HashMap *fieldDesc;
if (!type) if (!type)
@ -497,9 +498,29 @@ Main(Array * args)
fields = JsonValueAsObject(JsonGet(types, 2, type, "fields")); fields = JsonValueAsObject(JsonGet(types, 2, type, "fields"));
StreamPrintf(headerFile, "typedef %s %s\n{\n", typeType, type);
if (StrEquals(typeType, "struct")) if (StrEquals(typeType, "union"))
{
Array *keys = HashMapKeys(fields);
size_t j;
StreamPrintf(headerFile, "typedef enum %sType\n{\n", type);
for (j = 0; j < ArraySize(keys); j++)
{
char *key = ArrayGet(keys, j);
char *comma = j == ArraySize(keys) - 1 ? "\n" : ",\n";
StreamPrintf(headerFile, " %s_AS_%s%s", type, key, comma);
}
Free(keys);
StreamPrintf(headerFile, "} %sType;\n\n", type);
}
info = StrEquals(typeType, "union") ? "Union" : "";
StreamPrintf(headerFile, "typedef %s %s%s\n{\n", typeType, type, info);
if (StrEquals(typeType, "struct") || StrEquals(typeType, "union"))
{ {
while (HashMapIterate(fields, &field, (void **) &fieldDesc)) while (HashMapIterate(fields, &field, (void **) &fieldDesc))
{ {
@ -542,8 +563,17 @@ Main(Array * args)
StreamPrintf(headerFile, " %s %s;\n", cType, field); StreamPrintf(headerFile, " %s %s;\n", cType, field);
} }
StreamPrintf(headerFile, "} %s%s;\n\n", type, info);
/* TODO: Add extra "type" enum or something*/
if (StrEquals(typeType, "union"))
{
StreamPrintf(headerFile, "typedef struct %s {\n", type);
StreamPrintf(headerFile, " %sType type;\n", type);
StreamPrintf(headerFile, " %s%s value;\n", type, info);
StreamPrintf(headerFile, "} %s;\n\n", type); StreamPrintf(headerFile, "} %s;\n\n", type);
} }
}
else if (StrEquals(typeType, "enum")) else if (StrEquals(typeType, "enum"))
{ {
/* /*