111 lines
2.7 KiB
C++
111 lines
2.7 KiB
C++
|
/*
|
||
|
* RuntimeTest for ACC compiler.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include <ctype.h>
|
||
|
#include <dlfcn.h>
|
||
|
#include <stdarg.h>
|
||
|
#include <stdint.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#if defined(__arm__)
|
||
|
#include <unistd.h>
|
||
|
#endif
|
||
|
|
||
|
#include <acc/acc.h>
|
||
|
|
||
|
|
||
|
typedef void (*ScriptPtr)();
|
||
|
|
||
|
// This is a separate function so it can easily be set by breakpoint in gdb.
|
||
|
void run(ScriptPtr scriptFn) {
|
||
|
scriptFn();
|
||
|
}
|
||
|
|
||
|
// Private API for development:
|
||
|
|
||
|
extern "C"
|
||
|
void accDisassemble(ACCscript* script);
|
||
|
|
||
|
void op_int(int a) {
|
||
|
printf("op_int(%d)\n", a);
|
||
|
}
|
||
|
|
||
|
void op_float12(float a, float b, float c, float d,
|
||
|
float e, float f, float g, float h,
|
||
|
float i, float j, float k, float l) {
|
||
|
printf("op_float12(%g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g)\n",
|
||
|
a, b, c, d, e, f, g, h, i, j, k, l);
|
||
|
}
|
||
|
|
||
|
const char* text = "void op_int(int a);\n"
|
||
|
"void op_float12(float a, float b, float c, float d,\n"
|
||
|
" float e, float f, float g, float h,\n"
|
||
|
" float i, float j, float k, float l);\n"
|
||
|
"void script() {\n"
|
||
|
" op_int(123);\n"
|
||
|
" op_float12(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0);\n"
|
||
|
"}\n";
|
||
|
|
||
|
ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) {
|
||
|
if (strcmp("op_int", name) == 0) {
|
||
|
return (ACCvoid*) op_int;
|
||
|
}
|
||
|
if (strcmp("op_float12", name) == 0) {
|
||
|
return (ACCvoid*) op_float12;
|
||
|
}
|
||
|
return (ACCvoid*) dlsym(RTLD_DEFAULT, name);
|
||
|
}
|
||
|
|
||
|
int main(int argc, char** argv) {
|
||
|
ACCscript* script = accCreateScript();
|
||
|
|
||
|
accRegisterSymbolCallback(script, symbolLookup, NULL);
|
||
|
|
||
|
const ACCchar* scriptSource[] = {text};
|
||
|
accScriptSource(script, 1, scriptSource, NULL);
|
||
|
|
||
|
accCompileScript(script);
|
||
|
int result = accGetError(script);
|
||
|
ScriptPtr scriptPointer = 0;
|
||
|
if (result != 0) {
|
||
|
char buf[1024];
|
||
|
accGetScriptInfoLog(script, sizeof(buf), NULL, buf);
|
||
|
fprintf(stderr, "%s", buf);
|
||
|
goto exit;
|
||
|
}
|
||
|
|
||
|
{
|
||
|
ACCsizei numPragmaStrings;
|
||
|
accGetPragmas(script, &numPragmaStrings, 0, NULL);
|
||
|
if (numPragmaStrings) {
|
||
|
char** strings = new char*[numPragmaStrings];
|
||
|
accGetPragmas(script, NULL, numPragmaStrings, strings);
|
||
|
for(ACCsizei i = 0; i < numPragmaStrings; i += 2) {
|
||
|
fprintf(stderr, "#pragma %s(%s)\n", strings[i], strings[i+1]);
|
||
|
}
|
||
|
delete[] strings;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
accGetScriptLabel(script, "script", (ACCvoid**) & scriptPointer);
|
||
|
|
||
|
result = accGetError(script);
|
||
|
if (result != ACC_NO_ERROR) {
|
||
|
fprintf(stderr, "Could not find script: %d\n", result);
|
||
|
} else {
|
||
|
fprintf(stderr, "Executing script:\n");
|
||
|
run(scriptPointer);
|
||
|
}
|
||
|
|
||
|
|
||
|
exit:
|
||
|
|
||
|
accDeleteScript(script);
|
||
|
|
||
|
return result;
|
||
|
}
|