rsg_generator.c revision 84614dd02411e1cf9a4c37aa421898c471cfad20
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
284614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include "spec.h"
384614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include <stdio.h>
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printFileHeader(FILE *f)
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "/*\n");
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * Copyright (C) 2009 The Android Open Source Project\n");
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * you may not use this file except in compliance with the License.\n");
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * You may obtain a copy of the License at\n");
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * See the License for the specific language governing permissions and\n");
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * limitations under the License.\n");
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " */\n\n");
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printVarType(FILE *f, const VarType *vt)
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (vt->isConst) {
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "const ");
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch(vt->type) {
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 0:
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void");
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 1:
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "int%i_t", vt->bits);
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 2:
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "uint%i_t", vt->bits);
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 3:
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (vt->bits == 32)
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "float");
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        else
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "double");
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 4:
4884614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato        fprintf(f, "%s", vt->typeName);
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if(vt->ptrLevel) {
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, " ");
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        for(ct=0; ct < vt->ptrLevel; ct++) {
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "*");
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if(vt->name[0]) {
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, " %s", vt->name);
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious)
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < api->paramCount; ct++) {
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (ct || assumePrevious) {
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ", ");
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        printVarType(f, &api->params[ct]);
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printStructures(FILE *f)
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < apiCount; ct++) {
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < apiCount; ct++) {
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "struct RS_CMD_%s_rec {\n", api->name);
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //fprintf(f, "    RsCommandHeader _hdr;\n");
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        for(ct2=0; ct2 < api->paramCount; ct2++) {
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "    ");
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printVarType(f, &api->params[ct2]);
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ";\n");
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext)
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    printVarType(f, &api->ret);
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " %s%s (", prefix, api->name);
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (addContext) {
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "Context *");
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    printArgList(f, api, addContext);
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, ")");
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printFuncDecls(FILE *f, const char *prefix, int addContext)
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < apiCount; ct++) {
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        printFuncDecl(f, &apis[ct], prefix, addContext);
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, ";\n");
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n\n");
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printPlaybackFuncs(FILE *f, const char *prefix)
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < apiCount; ct++) {
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printApiCpp(FILE *f)
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //fprintf(f, "#include \"rsgApiStructs.h\"\n");
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "using namespace android;\n");
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "using namespace android::renderscript;\n");
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < apiCount; ct++) {
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        int needFlush = 0;
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        printFuncDecl(f, api, "rs", 0);
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "\n{\n");
150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "    ThreadIO *io = gIO;\n");
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //fprintf(f, "    LOGE(\"add command %s\\n\");\n", api->name);
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "    RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->mToCore.reserve(sizeof(RS_CMD_%s)));\n", api->name, api->name, api->name);
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "    uint32_t size = sizeof(RS_CMD_%s);\n", api->name);
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        for(ct2=0; ct2 < api->paramCount; ct2++) {
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            const VarType *vt = &api->params[ct2];
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            needFlush += vt->ptrLevel;
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
16084614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato        if (api->ret.typeName[0]) {
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            needFlush = 1;
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "    io->mToCore.commit");
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (needFlush) {
166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "Sync");
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "(RS_CMD_ID_%s, size);\n", api->name);
169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17084614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato        if (api->ret.typeName[0]) {
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "    return reinterpret_cast<");
172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printVarType(f, &api->ret);
173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ">(io->mToCoreRet);\n");
174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
179326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid printPlaybackCpp(FILE *f)
180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //fprintf(f, "#include \"rsgApiStructs.h\"\n");
188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace android {\n");
191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace renderscript {\n");
192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < apiCount; ct++) {
195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void rsp_%s(Context *con, const void *vp)\n", api->name);
198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "{\n");
199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //fprintf(f, "    LOGE(\"play command %s\\n\");\n", api->name);
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "    ");
20284614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato        if (api->ret.typeName[0]) {
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "gIO->mToCoreRet = (intptr_t)");
204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "rsi_%s(con", api->name);
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        for(ct2=0; ct2 < api->paramCount; ct2++) {
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            const VarType *vt = &api->params[ct2];
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ",");
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n           cmd->%s", vt->name);
210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, ");\n");
212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "RsPlaybackFunc gPlaybackFuncs[] = {\n");
217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "    NULL,\n");
218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for(ct=0; ct < apiCount; ct++) {
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "    %s%s,\n", "rsp_", apis[ct].name);
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsint main(int argc, char **argv)
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (argc != 3) {
230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return 1;
232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* rsgFile = argv[1];
234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* outFile = argv[2];
235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE* input = fopen(rsgFile, "r");
236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    char choice = fgetc(input);
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(input);
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (choice < '0' || choice > '3') {
241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return -2;
243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    yylex();
246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // printf("# of lines = %d\n", num_lines);
247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE *f = fopen(outFile, "w");
249326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
250326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    printFileHeader(f);
251326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch(choice) {
252326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '0': // rsgApiStructs.h
253326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
255326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "#include \"rsContext.h\"\n");
256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
257326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace android {\n");
258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace renderscript {\n");
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printStructures(f);
260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printFuncDecls(f, "rsi_", 1);
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printPlaybackFuncs(f, "rsp_");
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n\ntypedef void (*RsPlaybackFunc)(Context *, const void *);\n");
263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "extern RsPlaybackFunc gPlaybackFuncs[];\n");
264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
267326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
270326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '1': // rsgApiFuncDecl.h
271326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printFuncDecls(f, "rs", 0);
273326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '2': // rsgApi.cpp
277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printApiCpp(f);
279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '3': // rsgApiReplay.cpp
283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printFileHeader(f);
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printPlaybackCpp(f);
286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
288326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
289326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(f);
290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
292