blob: d59e1d1d852157e92aa0444f9e16f8067d8a6eda [file] [log] [blame]
Jack Palevich8c246a92009-07-14 21:14:10 -07001/*
2 * RuntimeTest for ACC compiler.
3 *
4 */
5
6#include <ctype.h>
7#include <dlfcn.h>
8#include <stdarg.h>
9#include <stdint.h>
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13
14#if defined(__arm__)
15#include <unistd.h>
16#endif
17
18#include <acc/acc.h>
19
20
21typedef void (*ScriptPtr)();
22
23// This is a separate function so it can easily be set by breakpoint in gdb.
24void run(ScriptPtr scriptFn) {
25 scriptFn();
26}
27
28// Private API for development:
29
30extern "C"
31void accDisassemble(ACCscript* script);
32
33void op_int(int a) {
34 printf("op_int(%d)\n", a);
35}
36
37void op_float12(float a, float b, float c, float d,
38 float e, float f, float g, float h,
39 float i, float j, float k, float l) {
40 printf("op_float12(%g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g)\n",
41 a, b, c, d, e, f, g, h, i, j, k, l);
42}
43
44const char* text = "void op_int(int a);\n"
45 "void op_float12(float a, float b, float c, float d,\n"
46 " float e, float f, float g, float h,\n"
47 " float i, float j, float k, float l);\n"
48 "void script() {\n"
49 " op_int(123);\n"
50 " 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"
51 "}\n";
52
53ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) {
54 if (strcmp("op_int", name) == 0) {
55 return (ACCvoid*) op_int;
56 }
57 if (strcmp("op_float12", name) == 0) {
58 return (ACCvoid*) op_float12;
59 }
60 return (ACCvoid*) dlsym(RTLD_DEFAULT, name);
61}
62
63int main(int argc, char** argv) {
64 ACCscript* script = accCreateScript();
65
66 accRegisterSymbolCallback(script, symbolLookup, NULL);
67
68 const ACCchar* scriptSource[] = {text};
69 accScriptSource(script, 1, scriptSource, NULL);
70
71 accCompileScript(script);
72 int result = accGetError(script);
73 ScriptPtr scriptPointer = 0;
74 if (result != 0) {
75 char buf[1024];
76 accGetScriptInfoLog(script, sizeof(buf), NULL, buf);
77 fprintf(stderr, "%s", buf);
78 goto exit;
79 }
80
81 {
82 ACCsizei numPragmaStrings;
83 accGetPragmas(script, &numPragmaStrings, 0, NULL);
84 if (numPragmaStrings) {
85 char** strings = new char*[numPragmaStrings];
86 accGetPragmas(script, NULL, numPragmaStrings, strings);
87 for(ACCsizei i = 0; i < numPragmaStrings; i += 2) {
88 fprintf(stderr, "#pragma %s(%s)\n", strings[i], strings[i+1]);
89 }
90 delete[] strings;
91 }
92 }
93
94 accGetScriptLabel(script, "script", (ACCvoid**) & scriptPointer);
95
96 result = accGetError(script);
97 if (result != ACC_NO_ERROR) {
98 fprintf(stderr, "Could not find script: %d\n", result);
99 } else {
100 fprintf(stderr, "Executing script:\n");
101 run(scriptPointer);
102 }
103
104
105exit:
106
107 accDeleteScript(script);
108
109 return result;
110}