mirror of https://gitlab.com/nakst/essence
header generator: output structures for script
This commit is contained in:
parent
c7daea3dc5
commit
f65c768292
|
@ -1251,14 +1251,14 @@ struct EsRectangle {
|
||||||
|
|
||||||
struct EsSpinlock {
|
struct EsSpinlock {
|
||||||
volatile uint8_t state;
|
volatile uint8_t state;
|
||||||
};
|
} @opaque();
|
||||||
|
|
||||||
struct EsMutex {
|
struct EsMutex {
|
||||||
EsHandle event;
|
EsHandle event;
|
||||||
EsSpinlock spinlock;
|
EsSpinlock spinlock;
|
||||||
volatile uint8_t state;
|
volatile uint8_t state;
|
||||||
volatile uint32_t queued;
|
volatile uint32_t queued;
|
||||||
};
|
} @opaque();
|
||||||
|
|
||||||
struct EsCrashReason {
|
struct EsCrashReason {
|
||||||
EsFatalError errorCode;
|
EsFatalError errorCode;
|
||||||
|
|
|
@ -1540,6 +1540,104 @@ void OutputScript(Entry *root) {
|
||||||
}
|
}
|
||||||
|
|
||||||
FilePrintFormat(output, ") #extcall;\n");
|
FilePrintFormat(output, ") #extcall;\n");
|
||||||
|
} else if (entry->type == ENTRY_STRUCT) {
|
||||||
|
for (int i = 0; i < arrlen(entry->annotations); i++) {
|
||||||
|
Entry *annotation = entry->annotations + i;
|
||||||
|
|
||||||
|
if (0 == strcmp(annotation->name, "opaque")) {
|
||||||
|
goto skipRootEntry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FilePrintFormat(output, "struct %s {\n", entry->name);
|
||||||
|
|
||||||
|
for (int i = 0; i < arrlen(entry->children); i++) {
|
||||||
|
Entry e = entry->children[i];
|
||||||
|
assert(e.type == ENTRY_VARIABLE);
|
||||||
|
|
||||||
|
bool isArray = false;
|
||||||
|
bool isArrayLength = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < arrlen(entry->annotations); i++) {
|
||||||
|
if (0 == strcmp(entry->annotations[i].name, "array_in")
|
||||||
|
&& 0 == strcmp(entry->annotations[i].children[0].name, e.name)) {
|
||||||
|
isArray = true;
|
||||||
|
assert(e.variable.pointer);
|
||||||
|
e.variable.pointer--;
|
||||||
|
break;
|
||||||
|
} else if (0 == strcmp(entry->annotations[i].name, "array_in")
|
||||||
|
&& 0 == strcmp(entry->annotations[i].children[1].name, e.name)) {
|
||||||
|
isArrayLength = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isArrayLength) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
FilePrintFormat(output, "\t");
|
||||||
|
|
||||||
|
bool foundType = false;
|
||||||
|
|
||||||
|
if (e.variable.pointer == 0 && ScriptWriteBasicType(e.variable.type)) {
|
||||||
|
foundType = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundType) {
|
||||||
|
for (int k = 0; k < arrlen(root->children); k++) {
|
||||||
|
if (!root->children[k].name) continue;
|
||||||
|
if (strcmp(e.variable.type, root->children[k].name)) continue;
|
||||||
|
|
||||||
|
if (root->children[k].type == ENTRY_TYPE_NAME && e.variable.pointer == 0) {
|
||||||
|
if (ScriptWriteBasicType(root->children[k].variable.type)) {
|
||||||
|
foundType = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (root->children[k].type == ENTRY_API_TYPE && e.variable.pointer == 1) {
|
||||||
|
FilePrintFormat(output, "%s", root->children[k].name);
|
||||||
|
foundType = true;
|
||||||
|
break;
|
||||||
|
} else if (root->children[k].type == ENTRY_ENUM && e.variable.pointer == 0) {
|
||||||
|
FilePrintFormat(output, "%s", root->children[k].name);
|
||||||
|
foundType = true;
|
||||||
|
break;
|
||||||
|
} else if (root->children[k].type == ENTRY_STRUCT && e.variable.pointer == 0) {
|
||||||
|
FilePrintFormat(output, "%s", root->children[k].name);
|
||||||
|
foundType = true;
|
||||||
|
break;
|
||||||
|
} else if (root->children[k].type == ENTRY_STRUCT && e.variable.pointer == 1) {
|
||||||
|
bool isOpaque = false;
|
||||||
|
|
||||||
|
for (int i = 0; i < arrlen(root->children[k].annotations); i++) {
|
||||||
|
if (0 == strcmp(root->children[k].annotations[i].name, "opaque")) {
|
||||||
|
isOpaque = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isOpaque) {
|
||||||
|
FilePrintFormat(output, "%s", root->children[k].name);
|
||||||
|
foundType = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundType) {
|
||||||
|
FilePrintFormat(output, "??");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.variable.isArray) FilePrintFormat(output, "[]");
|
||||||
|
if (isArray) FilePrintFormat(output, "[]");
|
||||||
|
|
||||||
|
assert(!e.variable.isVolatile);
|
||||||
|
|
||||||
|
FilePrintFormat(output, " %s;\n", e.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
FilePrintFormat(output, "};\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
skipRootEntry:;
|
skipRootEntry:;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
// TODO Bug: Structure fields cannot have names the same as global variables or as in other structures.
|
||||||
|
|
||||||
// TODO Basic missing features:
|
// TODO Basic missing features:
|
||||||
// - Other list operations: insert_many, delete_many.
|
// - Other list operations: insert_many, delete_many.
|
||||||
// - Maps: map[int, T], map[str, T].
|
// - Maps: map[int, T], map[str, T].
|
||||||
|
@ -36,8 +38,6 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
// #define TRACE_COMMAND_EXECUTION
|
|
||||||
|
|
||||||
#define FUNCTION_MAX_ARGUMENTS (20) // Also the maximum number of return values in a tuple.
|
#define FUNCTION_MAX_ARGUMENTS (20) // Also the maximum number of return values in a tuple.
|
||||||
|
|
||||||
#define T_ERROR (0)
|
#define T_ERROR (0)
|
||||||
|
|
Loading…
Reference in New Issue