1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato#include "spec.h"
3daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato#include <stdio.h>
4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
5d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printFileHeader(FILE *f)
6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "/*\n");
87eecbf2085bcfe475daf68090a1a4f47fbb6ec72Jason Sams    fprintf(f, " * Copyright (C) 2010 The Android Open Source Project\n");
9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *\n");
10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * you may not use this file except in compliance with the License.\n");
12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * You may obtain a copy of the License at\n");
13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *\n");
14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *\n");
16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * See the License for the specific language governing permissions and\n");
20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * limitations under the License.\n");
21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " */\n\n");
22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printVarType(FILE *f, const VarType *vt)
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (vt->isConst) {
28d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "const ");
29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    switch(vt->type) {
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 0:
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "void");
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 1:
36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "int%i_t", vt->bits);
37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 2:
39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "uint%i_t", vt->bits);
40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 3:
42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        if (vt->bits == 32)
43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "float");
44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        else
45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "double");
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 4:
48daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato        fprintf(f, "%s", vt->typeName);
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if(vt->ptrLevel) {
53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, " ");
54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        for(ct=0; ct < vt->ptrLevel; ct++) {
55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "*");
56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
58d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
59d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if(vt->name[0]) {
60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, " %s", vt->name);
61d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
64d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious)
65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < api->paramCount; ct++) {
68d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        if (ct || assumePrevious) {
69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, ", ");
70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        printVarType(f, &api->params[ct]);
72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
75d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printStructures(FILE *f)
76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct2;
79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < apiCount; ct++) {
81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < apiCount; ct++) {
86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        const ApiEntry * api = &apis[ct];
87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "struct RS_CMD_%s_rec {\n", api->name);
89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        //fprintf(f, "    RsCommandHeader _hdr;\n");
90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        for(ct2=0; ct2 < api->paramCount; ct2++) {
92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "    ");
93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printVarType(f, &api->params[ct2]);
94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, ";\n");
95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "};\n\n");
97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
100d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext)
101d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    printVarType(f, &api->ret);
103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " %s%s (", prefix, api->name);
104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (addContext) {
105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "Context *");
106bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams    } else {
107bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams        fprintf(f, "RsContext rsc");
108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
109bc948dedcee57a66fe2cb38d4c79d04a10c7efb3Jason Sams    printArgList(f, api, 1);
110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, ")");
111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
113d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printFuncDecls(FILE *f, const char *prefix, int addContext)
114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < apiCount; ct++) {
117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        printFuncDecl(f, &apis[ct], prefix, addContext);
118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, ";\n");
119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n\n");
121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
123d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printPlaybackFuncs(FILE *f, const char *prefix)
124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < apiCount; ct++) {
127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
128d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
131d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printApiCpp(FILE *f)
132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct2;
135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
136d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsContext.h\"\n");
138d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
139d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //fprintf(f, "#include \"rsgApiStructs.h\"\n");
140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
141d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "using namespace android;\n");
143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "using namespace android::renderscript;\n");
14407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    fprintf(f, "#include \"rsHandcode.h\"\n");
145d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
146d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
147d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < apiCount; ct++) {
148d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        int needFlush = 0;
149d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        const ApiEntry * api = &apis[ct];
150d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
151d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        printFuncDecl(f, api, "rs", 0);
152d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "\n{\n");
15307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        if (api->handcodeApi) {
15407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    rsHCAPI_%s(rsc", api->name);
15507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            for(ct2=0; ct2 < api->paramCount; ct2++) {
15607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                const VarType *vt = &api->params[ct2];
15707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                fprintf(f, ", %s", vt->name);
15807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
15907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, ");\n");
16007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        } else {
16107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
16207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            //fprintf(f, "    LOGE(\"add command %s\\n\");\n", api->name);
16307ae40623737a6060b8a925fd2e6bba76780dcd4Jason 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);
16407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    uint32_t size = sizeof(RS_CMD_%s);\n", api->name);
16507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
16607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            for(ct2=0; ct2 < api->paramCount; ct2++) {
16707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                const VarType *vt = &api->params[ct2];
16807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                needFlush += vt->ptrLevel;
16907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
17007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
17107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            if (api->ret.typeName[0]) {
17207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                needFlush = 1;
17307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
17407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
17507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    io->mToCore.commit");
17607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            if (needFlush) {
17707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                fprintf(f, "Sync");
17807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
17907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "(RS_CMD_ID_%s, size);\n", api->name);
18007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
18107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            if (api->ret.typeName[0]) {
18207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                fprintf(f, "    return reinterpret_cast<");
18307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                printVarType(f, &api->ret);
18407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                fprintf(f, ">(io->mToCoreRet);\n");
18507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
186d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
187d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "};\n\n");
188d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
189d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
190d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
191d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid printPlaybackCpp(FILE *f)
192d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
193d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
194d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct2;
195d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
196d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
197d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsContext.h\"\n");
198d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
199d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //fprintf(f, "#include \"rsgApiStructs.h\"\n");
200d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
201d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "namespace android {\n");
203d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "namespace renderscript {\n");
20407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    fprintf(f, "#include \"rsHandcode.h\"\n");
205d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
206d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < apiCount; ct++) {
208d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        const ApiEntry * api = &apis[ct];
209d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
210d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "void rsp_%s(Context *con, const void *vp)\n", api->name);
211d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "{\n");
21207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        if (api->handcodePlay) {
21307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    rsHCPLAY_%s(con, vp);\n", api->name);
21407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        } else {
21507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            //fprintf(f, "    LOGE(\"play command %s\\n\");\n", api->name);
21607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
21707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    ");
21807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            if (api->ret.typeName[0]) {
21907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                fprintf(f, "con->mIO.mToCoreRet = (intptr_t)");
22007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
22107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "rsi_%s(con", api->name);
22207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            for(ct2=0; ct2 < api->paramCount; ct2++) {
22307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                const VarType *vt = &api->params[ct2];
22407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                fprintf(f, ",\n           cmd->%s", vt->name);
22507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
22607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, ");\n");
227d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
228d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "};\n\n");
229d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
230d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
231d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "RsPlaybackFunc gPlaybackFuncs[] = {\n");
232d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "    NULL,\n");
233d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for(ct=0; ct < apiCount; ct++) {
234d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "    %s%s,\n", "rsp_", apis[ct].name);
235d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
236d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "};\n");
237d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
238d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "};\n");
239d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "};\n");
240d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
241d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
242d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsint main(int argc, char **argv)
243d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
244d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (argc != 3) {
245d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
246d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return 1;
247d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
248d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    const char* rsgFile = argv[1];
249d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    const char* outFile = argv[2];
250d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    FILE* input = fopen(rsgFile, "r");
251d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
252d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    char choice = fgetc(input);
253d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fclose(input);
254d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
255d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (choice < '0' || choice > '3') {
256d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
257d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return -2;
258d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
259d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
260d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    yylex();
261d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // printf("# of lines = %d\n", num_lines);
262d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
263d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    FILE *f = fopen(outFile, "w");
264d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
265d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    printFileHeader(f);
266d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    switch(choice) {
267d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '0': // rsgApiStructs.h
268d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
269d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "\n");
270d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "#include \"rsContext.h\"\n");
271d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "\n");
272d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "namespace android {\n");
273d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "namespace renderscript {\n");
274d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printStructures(f);
275d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printFuncDecls(f, "rsi_", 1);
276d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printPlaybackFuncs(f, "rsp_");
277d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "\n\ntypedef void (*RsPlaybackFunc)(Context *, const void *);\n");
278d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "extern RsPlaybackFunc gPlaybackFuncs[];\n");
279d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
280d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "}\n");
281d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "}\n");
282d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
283d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
284d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
285d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '1': // rsgApiFuncDecl.h
286d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
287d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printFuncDecls(f, "rs", 0);
288d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
289d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
290d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
291d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '2': // rsgApi.cpp
292d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
293d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printApiCpp(f);
294d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
295d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
296d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
297d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '3': // rsgApiReplay.cpp
298d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
299d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printFileHeader(f);
300d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printPlaybackCpp(f);
301d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
302d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
303d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
304d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fclose(f);
305d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return 0;
306d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
307