gen_runtime.cpp revision 135c4b747bce5898d98de964d7c453d215254d0d
1135c4b747bce5898d98de964d7c453d215254d0dJason Sams/*
2135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Copyright (C) 2013 The Android Open Source Project
3135c4b747bce5898d98de964d7c453d215254d0dJason Sams *
4135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5135c4b747bce5898d98de964d7c453d215254d0dJason Sams * you may not use this file except in compliance with the License.
6135c4b747bce5898d98de964d7c453d215254d0dJason Sams * You may obtain a copy of the License at
7135c4b747bce5898d98de964d7c453d215254d0dJason Sams *
8135c4b747bce5898d98de964d7c453d215254d0dJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9135c4b747bce5898d98de964d7c453d215254d0dJason Sams *
10135c4b747bce5898d98de964d7c453d215254d0dJason Sams * Unless required by applicable law or agreed to in writing, software
11135c4b747bce5898d98de964d7c453d215254d0dJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12135c4b747bce5898d98de964d7c453d215254d0dJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13135c4b747bce5898d98de964d7c453d215254d0dJason Sams * See the License for the specific language governing permissions and
14135c4b747bce5898d98de964d7c453d215254d0dJason Sams * limitations under the License.
15135c4b747bce5898d98de964d7c453d215254d0dJason Sams */
16135c4b747bce5898d98de964d7c453d215254d0dJason Sams
17135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <stdio.h>
18135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <vector>
19135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <list>
20135c4b747bce5898d98de964d7c453d215254d0dJason Sams#include <string>
21135c4b747bce5898d98de964d7c453d215254d0dJason Sams
22135c4b747bce5898d98de964d7c453d215254d0dJason Samsusing namespace std;
23135c4b747bce5898d98de964d7c453d215254d0dJason Sams
24135c4b747bce5898d98de964d7c453d215254d0dJason SamsFILE *gIn;
25135c4b747bce5898d98de964d7c453d215254d0dJason SamsFILE *gOut;
26135c4b747bce5898d98de964d7c453d215254d0dJason Sams
27135c4b747bce5898d98de964d7c453d215254d0dJason Samsclass Func {
28135c4b747bce5898d98de964d7c453d215254d0dJason Samspublic:
29135c4b747bce5898d98de964d7c453d215254d0dJason Sams    Func() {
30135c4b747bce5898d98de964d7c453d215254d0dJason Sams        mMinVersion = 0;
31135c4b747bce5898d98de964d7c453d215254d0dJason Sams        mMaxVersion = 0;
32135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
33135c4b747bce5898d98de964d7c453d215254d0dJason Sams
34135c4b747bce5898d98de964d7c453d215254d0dJason Sams    string mName;
35135c4b747bce5898d98de964d7c453d215254d0dJason Sams    int mMinVersion;
36135c4b747bce5898d98de964d7c453d215254d0dJason Sams    int mMaxVersion;
37135c4b747bce5898d98de964d7c453d215254d0dJason Sams
38135c4b747bce5898d98de964d7c453d215254d0dJason Sams    vector<vector<string> > mReplaceables;
39135c4b747bce5898d98de964d7c453d215254d0dJason Sams    vector<string> mArgs;
40135c4b747bce5898d98de964d7c453d215254d0dJason Sams    string mRet;
41135c4b747bce5898d98de964d7c453d215254d0dJason Sams    vector<string> mComment;
42135c4b747bce5898d98de964d7c453d215254d0dJason Sams    vector<string> mInline;
43135c4b747bce5898d98de964d7c453d215254d0dJason Sams
44135c4b747bce5898d98de964d7c453d215254d0dJason Sams};
45135c4b747bce5898d98de964d7c453d215254d0dJason Sams
46135c4b747bce5898d98de964d7c453d215254d0dJason Samsvector<Func *> gFuncs;
47135c4b747bce5898d98de964d7c453d215254d0dJason Sams
48135c4b747bce5898d98de964d7c453d215254d0dJason Samsbool getNextLine(FILE *in, string *s) {
49135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s->clear();
50135c4b747bce5898d98de964d7c453d215254d0dJason Sams    while (1) {
51135c4b747bce5898d98de964d7c453d215254d0dJason Sams        int c = fgetc(in);
52135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (c == EOF) return s->size() != 0;
53135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (c == '\n') break;
54135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s->push_back((char)c);
55135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
56135c4b747bce5898d98de964d7c453d215254d0dJason Sams    return true;
57135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
58135c4b747bce5898d98de964d7c453d215254d0dJason Sams
59135c4b747bce5898d98de964d7c453d215254d0dJason Samsvoid trim(string *s, size_t start) {
60135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (start > 0) {
61135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s->erase(0, start);
62135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
63135c4b747bce5898d98de964d7c453d215254d0dJason Sams
64135c4b747bce5898d98de964d7c453d215254d0dJason Sams    while (s->size() && (s->at(0) == ' ')) {
65135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s->erase(0, 1);
66135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
67135c4b747bce5898d98de964d7c453d215254d0dJason Sams
68135c4b747bce5898d98de964d7c453d215254d0dJason Sams    size_t p = s->find_first_of("\n\r");
69135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (p != string::npos) {
70135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s->erase(p);
71135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
72135c4b747bce5898d98de964d7c453d215254d0dJason Sams
73135c4b747bce5898d98de964d7c453d215254d0dJason Sams    while ((s->size() > 0) && (s->at(s->size()-1) == ' ')) {
74135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s->erase(s->size() -1);
75135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
76135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
77135c4b747bce5898d98de964d7c453d215254d0dJason Sams
78135c4b747bce5898d98de964d7c453d215254d0dJason SamsFunc * scanFunction(FILE *in) {
79135c4b747bce5898d98de964d7c453d215254d0dJason Sams    Func *f = new Func();
80135c4b747bce5898d98de964d7c453d215254d0dJason Sams    bool modeComment = false;
81135c4b747bce5898d98de964d7c453d215254d0dJason Sams    bool modeInline = false;
82135c4b747bce5898d98de964d7c453d215254d0dJason Sams    size_t replacables = 0;
83135c4b747bce5898d98de964d7c453d215254d0dJason Sams
84135c4b747bce5898d98de964d7c453d215254d0dJason Sams    while (1) {
85135c4b747bce5898d98de964d7c453d215254d0dJason Sams        string s;
86135c4b747bce5898d98de964d7c453d215254d0dJason Sams        bool ret = getNextLine(in, &s);
87135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (!ret) break;
88135c4b747bce5898d98de964d7c453d215254d0dJason Sams
89135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (modeComment) {
90135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (!s.size() || (s[0] == ' ')) {
91135c4b747bce5898d98de964d7c453d215254d0dJason Sams                trim(&s, 0);
92135c4b747bce5898d98de964d7c453d215254d0dJason Sams                f->mComment.push_back(s);
93135c4b747bce5898d98de964d7c453d215254d0dJason Sams                continue;
94135c4b747bce5898d98de964d7c453d215254d0dJason Sams            } else {
95135c4b747bce5898d98de964d7c453d215254d0dJason Sams                modeComment = false;
96135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
97135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
98135c4b747bce5898d98de964d7c453d215254d0dJason Sams
99135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (modeInline) {
100135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (!s.size() || (s[0] == ' ')) {
101135c4b747bce5898d98de964d7c453d215254d0dJason Sams                trim(&s, 0);
102135c4b747bce5898d98de964d7c453d215254d0dJason Sams                f->mInline.push_back(s);
103135c4b747bce5898d98de964d7c453d215254d0dJason Sams                continue;
104135c4b747bce5898d98de964d7c453d215254d0dJason Sams            } else {
105135c4b747bce5898d98de964d7c453d215254d0dJason Sams                modeInline = false;
106135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
107135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
108135c4b747bce5898d98de964d7c453d215254d0dJason Sams
109135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s[0] == '#') {
110135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
111135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
112135c4b747bce5898d98de964d7c453d215254d0dJason Sams
113135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 5, "name:") == 0) {
114135c4b747bce5898d98de964d7c453d215254d0dJason Sams            trim(&s, 5);
115135c4b747bce5898d98de964d7c453d215254d0dJason Sams            f->mName = s;
116135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
117135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
118135c4b747bce5898d98de964d7c453d215254d0dJason Sams
119135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 4, "arg:") == 0) {
120135c4b747bce5898d98de964d7c453d215254d0dJason Sams            trim(&s, 4);
121135c4b747bce5898d98de964d7c453d215254d0dJason Sams            f->mArgs.push_back(s);
122135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
123135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
124135c4b747bce5898d98de964d7c453d215254d0dJason Sams
125135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 4, "ret:") == 0) {
126135c4b747bce5898d98de964d7c453d215254d0dJason Sams            trim(&s, 4);
127135c4b747bce5898d98de964d7c453d215254d0dJason Sams            f->mRet = s;
128135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
129135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
130135c4b747bce5898d98de964d7c453d215254d0dJason Sams
131135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 4, "end:") == 0) {
132135c4b747bce5898d98de964d7c453d215254d0dJason Sams            return f;
133135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
134135c4b747bce5898d98de964d7c453d215254d0dJason Sams
135135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 8, "comment:") == 0) {
136135c4b747bce5898d98de964d7c453d215254d0dJason Sams            modeComment = true;
137135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
138135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
139135c4b747bce5898d98de964d7c453d215254d0dJason Sams
140135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 7, "inline:") == 0) {
141135c4b747bce5898d98de964d7c453d215254d0dJason Sams            modeInline = true;
142135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
143135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
144135c4b747bce5898d98de964d7c453d215254d0dJason Sams
145135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 8, "version:") == 0) {
146135c4b747bce5898d98de964d7c453d215254d0dJason Sams            trim(&s, 8);
147135c4b747bce5898d98de964d7c453d215254d0dJason Sams            sscanf(s.c_str(), "%i %i", &f->mMinVersion, &f->mMaxVersion);
148135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
149135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
150135c4b747bce5898d98de964d7c453d215254d0dJason Sams
151135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 8, "start:") == 0) {
152135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
153135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
154135c4b747bce5898d98de964d7c453d215254d0dJason Sams
155135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 2, "w:") == 0) {
156135c4b747bce5898d98de964d7c453d215254d0dJason Sams            vector<string> t;
157135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("1") != string::npos) {
158135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("");
159135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
160135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("2") != string::npos) {
161135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("2");
162135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
163135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("3") != string::npos) {
164135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("3");
165135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
166135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("4") != string::npos) {
167135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("4");
168135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
169135c4b747bce5898d98de964d7c453d215254d0dJason Sams            f->mReplaceables.push_back(t);
170135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
171135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
172135c4b747bce5898d98de964d7c453d215254d0dJason Sams
173135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.compare(0, 2, "t:") == 0) {
174135c4b747bce5898d98de964d7c453d215254d0dJason Sams            vector<string> t;
175135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("f16") != string::npos) {
176135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("half");
177135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
178135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("f32") != string::npos) {
179135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("float");
180135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
181135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("f64") != string::npos) {
182135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("double");
183135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
184135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("i8") != string::npos) {
185135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("char");
186135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
187135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("u8") != string::npos) {
188135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("uchar");
189135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
190135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("i16") != string::npos) {
191135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("short");
192135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
193135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("u16") != string::npos) {
194135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("ushort");
195135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
196135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("i32") != string::npos) {
197135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("int");
198135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
199135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("u32") != string::npos) {
200135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("uint");
201135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
202135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("i64") != string::npos) {
203135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("long");
204135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
205135c4b747bce5898d98de964d7c453d215254d0dJason Sams            if (s.find("u64") != string::npos) {
206135c4b747bce5898d98de964d7c453d215254d0dJason Sams                t.push_back("ulong");
207135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
208135c4b747bce5898d98de964d7c453d215254d0dJason Sams            f->mReplaceables.push_back(t);
209135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
210135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
211135c4b747bce5898d98de964d7c453d215254d0dJason Sams
212135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.size() == 0) {
213135c4b747bce5898d98de964d7c453d215254d0dJason Sams            // eat empty line
214135c4b747bce5898d98de964d7c453d215254d0dJason Sams            continue;
215135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
216135c4b747bce5898d98de964d7c453d215254d0dJason Sams
217135c4b747bce5898d98de964d7c453d215254d0dJason Sams        printf("Error, line:\n");
218135c4b747bce5898d98de964d7c453d215254d0dJason Sams        printf("  %s\n", s.c_str());
219135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
220135c4b747bce5898d98de964d7c453d215254d0dJason Sams
221135c4b747bce5898d98de964d7c453d215254d0dJason Sams    delete f;
222135c4b747bce5898d98de964d7c453d215254d0dJason Sams    return NULL;
223135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
224135c4b747bce5898d98de964d7c453d215254d0dJason Sams
225135c4b747bce5898d98de964d7c453d215254d0dJason Samsstring stringReplace(string s, string match, string rep) {
226135c4b747bce5898d98de964d7c453d215254d0dJason Sams    while(1) {
227135c4b747bce5898d98de964d7c453d215254d0dJason Sams        size_t p = s.find(match);
228135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (p == string::npos) break;
229135c4b747bce5898d98de964d7c453d215254d0dJason Sams
230135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s.erase(p, match.size());
231135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s.insert(p, rep);
232135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
233135c4b747bce5898d98de964d7c453d215254d0dJason Sams    return s;
234135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
235135c4b747bce5898d98de964d7c453d215254d0dJason Sams
236135c4b747bce5898d98de964d7c453d215254d0dJason Samsstring stringExpand(string s, const Func *f, int i1, int i2, int i3, int i4) {
237135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mReplaceables.size() > 0) {
238135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s = stringReplace(s, "#1", f->mReplaceables[0][i1]);
239135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
240135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mReplaceables.size() > 1) {
241135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s = stringReplace(s, "#2", f->mReplaceables[1][i2]);
242135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
243135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mReplaceables.size() > 2) {
244135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s = stringReplace(s, "#3", f->mReplaceables[2][i3]);
245135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
246135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mReplaceables.size() > 3) {
247135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s = stringReplace(s, "#4", f->mReplaceables[3][i4]);
248135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
249135c4b747bce5898d98de964d7c453d215254d0dJason Sams    return s;
250135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
251135c4b747bce5898d98de964d7c453d215254d0dJason Sams
252135c4b747bce5898d98de964d7c453d215254d0dJason Samsvoid writeHeaderFunc(FILE *o, const Func *f, int i1, int i2, int i3, int i4) {
253135c4b747bce5898d98de964d7c453d215254d0dJason Sams    string s;
254135c4b747bce5898d98de964d7c453d215254d0dJason Sams
255135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mMinVersion || f->mMaxVersion) {
256135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (f->mMaxVersion) {
257135c4b747bce5898d98de964d7c453d215254d0dJason Sams            fprintf(o, "#if (defined(RS_VERSION) && (RS_VERSION >= %i) && (RS_VERSION < %i))\n",
258135c4b747bce5898d98de964d7c453d215254d0dJason Sams                    f->mMinVersion, f->mMaxVersion);
259135c4b747bce5898d98de964d7c453d215254d0dJason Sams        } else {
260135c4b747bce5898d98de964d7c453d215254d0dJason Sams            fprintf(o, "#if (defined(RS_VERSION) && (RS_VERSION >= %i))\n",
261135c4b747bce5898d98de964d7c453d215254d0dJason Sams                    f->mMinVersion);
262135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
263135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
264135c4b747bce5898d98de964d7c453d215254d0dJason Sams
265135c4b747bce5898d98de964d7c453d215254d0dJason Sams    fprintf(o, "/*\n");
266135c4b747bce5898d98de964d7c453d215254d0dJason Sams    for (size_t ct=0; ct < f->mComment.size(); ct++) {
267135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s = stringExpand(f->mComment[ct], f, i1, i2, i3, i4);
268135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (s.size()) {
269135c4b747bce5898d98de964d7c453d215254d0dJason Sams            fprintf(o, " * %s\n", s.c_str());
270135c4b747bce5898d98de964d7c453d215254d0dJason Sams        } else {
271135c4b747bce5898d98de964d7c453d215254d0dJason Sams            fprintf(o, " *\n");
272135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
273135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
274135c4b747bce5898d98de964d7c453d215254d0dJason Sams    fprintf(o, " *\n");
275135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mMinVersion || f->mMaxVersion) {
276135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (f->mMaxVersion) {
277135c4b747bce5898d98de964d7c453d215254d0dJason Sams            fprintf(o, " * Suppored by API versions %i - %i\n",
278135c4b747bce5898d98de964d7c453d215254d0dJason Sams                    f->mMinVersion, f->mMaxVersion);
279135c4b747bce5898d98de964d7c453d215254d0dJason Sams        } else {
280135c4b747bce5898d98de964d7c453d215254d0dJason Sams            fprintf(o, " * Supported by API versions %i and newer.\n",
281135c4b747bce5898d98de964d7c453d215254d0dJason Sams                    f->mMinVersion);
282135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
283135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
284135c4b747bce5898d98de964d7c453d215254d0dJason Sams
285135c4b747bce5898d98de964d7c453d215254d0dJason Sams    fprintf(o, " */\n");
286135c4b747bce5898d98de964d7c453d215254d0dJason Sams
287135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s.clear();
288135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s += "extern ";
289135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s += f->mRet;
290135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s += " __attribute__((const, overloadable))";
291135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s += f->mName;
292135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s += "(";
293135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mArgs.size()) {
294135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s += f->mArgs[0];
295135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
296135c4b747bce5898d98de964d7c453d215254d0dJason Sams    for (size_t ct=1; ct < f->mArgs.size(); ct++) {
297135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s += ", ";
298135c4b747bce5898d98de964d7c453d215254d0dJason Sams        s += f->mArgs[0];
299135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
300135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s += ");";
301135c4b747bce5898d98de964d7c453d215254d0dJason Sams    s = stringExpand(s, f, i1, i2, i3, i4);
302135c4b747bce5898d98de964d7c453d215254d0dJason Sams    fprintf(o, "%s\n", s.c_str());
303135c4b747bce5898d98de964d7c453d215254d0dJason Sams
304135c4b747bce5898d98de964d7c453d215254d0dJason Sams
305135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (f->mMinVersion || f->mMaxVersion) {
306135c4b747bce5898d98de964d7c453d215254d0dJason Sams        fprintf(o, "#endif\n");
307135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
308135c4b747bce5898d98de964d7c453d215254d0dJason Sams
309135c4b747bce5898d98de964d7c453d215254d0dJason Sams    fprintf(o, "\n", s.c_str());
310135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
311135c4b747bce5898d98de964d7c453d215254d0dJason Sams
312135c4b747bce5898d98de964d7c453d215254d0dJason Sams
313135c4b747bce5898d98de964d7c453d215254d0dJason Samsvoid writeHeaderFuncs(FILE *o, const Func *f) {
314135c4b747bce5898d98de964d7c453d215254d0dJason Sams    switch(f->mReplaceables.size()) {
315135c4b747bce5898d98de964d7c453d215254d0dJason Sams    case 0:
316135c4b747bce5898d98de964d7c453d215254d0dJason Sams        writeHeaderFunc(o, f, -1, -1, -1, -1);
317135c4b747bce5898d98de964d7c453d215254d0dJason Sams        break;
318135c4b747bce5898d98de964d7c453d215254d0dJason Sams    case 1:
319135c4b747bce5898d98de964d7c453d215254d0dJason Sams        for (size_t i1 = 0; i1 < f->mReplaceables[0].size(); i1++) {
320135c4b747bce5898d98de964d7c453d215254d0dJason Sams            writeHeaderFunc(o, f, i1, -1, -1, -1);
321135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
322135c4b747bce5898d98de964d7c453d215254d0dJason Sams        break;
323135c4b747bce5898d98de964d7c453d215254d0dJason Sams    case 2:
324135c4b747bce5898d98de964d7c453d215254d0dJason Sams        for (size_t i2 = 0; i2 < f->mReplaceables[1].size(); i2++) {
325135c4b747bce5898d98de964d7c453d215254d0dJason Sams            for (size_t i1 = 0; i1 < f->mReplaceables[0].size(); i1++) {
326135c4b747bce5898d98de964d7c453d215254d0dJason Sams                writeHeaderFunc(o, f, i1, i2, -1, -1);
327135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
328135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
329135c4b747bce5898d98de964d7c453d215254d0dJason Sams        break;
330135c4b747bce5898d98de964d7c453d215254d0dJason Sams    case 3:
331135c4b747bce5898d98de964d7c453d215254d0dJason Sams        for (size_t i3 = 0; i3 < f->mReplaceables[2].size(); i3++) {
332135c4b747bce5898d98de964d7c453d215254d0dJason Sams            for (size_t i2 = 0; i2 < f->mReplaceables[1].size(); i2++) {
333135c4b747bce5898d98de964d7c453d215254d0dJason Sams                for (size_t i1 = 0; i1 < f->mReplaceables[0].size(); i1++) {
334135c4b747bce5898d98de964d7c453d215254d0dJason Sams                    writeHeaderFunc(o, f, i1, i2, i3, -1);
335135c4b747bce5898d98de964d7c453d215254d0dJason Sams                }
336135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
337135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
338135c4b747bce5898d98de964d7c453d215254d0dJason Sams        break;
339135c4b747bce5898d98de964d7c453d215254d0dJason Sams    case 4:
340135c4b747bce5898d98de964d7c453d215254d0dJason Sams        for (size_t i4 = 0; i4 < f->mReplaceables[3].size(); i4++) {
341135c4b747bce5898d98de964d7c453d215254d0dJason Sams            for (size_t i3 = 0; i3 < f->mReplaceables[2].size(); i3++) {
342135c4b747bce5898d98de964d7c453d215254d0dJason Sams                for (size_t i2 = 0; i2 < f->mReplaceables[1].size(); i2++) {
343135c4b747bce5898d98de964d7c453d215254d0dJason Sams                    for (size_t i1 = 0; i1 < f->mReplaceables[0].size(); i1++) {
344135c4b747bce5898d98de964d7c453d215254d0dJason Sams                        writeHeaderFunc(o, f, i1, i2, i3, i4);
345135c4b747bce5898d98de964d7c453d215254d0dJason Sams                    }
346135c4b747bce5898d98de964d7c453d215254d0dJason Sams                }
347135c4b747bce5898d98de964d7c453d215254d0dJason Sams            }
348135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
349135c4b747bce5898d98de964d7c453d215254d0dJason Sams        break;
350135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
351135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
352135c4b747bce5898d98de964d7c453d215254d0dJason Sams
353135c4b747bce5898d98de964d7c453d215254d0dJason Sams
354135c4b747bce5898d98de964d7c453d215254d0dJason Sams
355135c4b747bce5898d98de964d7c453d215254d0dJason Samsint main(int argc, char* argv[])
356135c4b747bce5898d98de964d7c453d215254d0dJason Sams{
357135c4b747bce5898d98de964d7c453d215254d0dJason Sams    const char *inpath = "runtime.spec";
358135c4b747bce5898d98de964d7c453d215254d0dJason Sams    const char *outpath = "rs_core_math.rsh";
359135c4b747bce5898d98de964d7c453d215254d0dJason Sams
360135c4b747bce5898d98de964d7c453d215254d0dJason Sams    gIn = fopen(inpath, "rt");
361135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (!gIn) {
362135c4b747bce5898d98de964d7c453d215254d0dJason Sams        printf("Error opening input file: %s", inpath);
363135c4b747bce5898d98de964d7c453d215254d0dJason Sams        return -1;
364135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
365135c4b747bce5898d98de964d7c453d215254d0dJason Sams
366135c4b747bce5898d98de964d7c453d215254d0dJason Sams    while (1) {
367135c4b747bce5898d98de964d7c453d215254d0dJason Sams        Func *f = scanFunction(gIn);
368135c4b747bce5898d98de964d7c453d215254d0dJason Sams        if (f != NULL) {
369135c4b747bce5898d98de964d7c453d215254d0dJason Sams            gFuncs.push_back(f);
370135c4b747bce5898d98de964d7c453d215254d0dJason Sams        } else {
371135c4b747bce5898d98de964d7c453d215254d0dJason Sams            break;
372135c4b747bce5898d98de964d7c453d215254d0dJason Sams        }
373135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
374135c4b747bce5898d98de964d7c453d215254d0dJason Sams
375135c4b747bce5898d98de964d7c453d215254d0dJason Sams    gOut = fopen(outpath, "wt");
376135c4b747bce5898d98de964d7c453d215254d0dJason Sams    if (!gOut) {
377135c4b747bce5898d98de964d7c453d215254d0dJason Sams        printf("Error opening output file: %s", outpath);
378135c4b747bce5898d98de964d7c453d215254d0dJason Sams        return -1;
379135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
380135c4b747bce5898d98de964d7c453d215254d0dJason Sams
381135c4b747bce5898d98de964d7c453d215254d0dJason Sams    for (size_t ct=0; ct < gFuncs.size(); ct++) {
382135c4b747bce5898d98de964d7c453d215254d0dJason Sams        writeHeaderFuncs(gOut, gFuncs[ct]);
383135c4b747bce5898d98de964d7c453d215254d0dJason Sams    }
384135c4b747bce5898d98de964d7c453d215254d0dJason Sams
385135c4b747bce5898d98de964d7c453d215254d0dJason Sams    fclose (gIn);
386135c4b747bce5898d98de964d7c453d215254d0dJason Sams    fclose (gOut);
387135c4b747bce5898d98de964d7c453d215254d0dJason Sams
388135c4b747bce5898d98de964d7c453d215254d0dJason Sams    printf("%i Functions processed.\n", (int)gFuncs.size());
389135c4b747bce5898d98de964d7c453d215254d0dJason Sams
390135c4b747bce5898d98de964d7c453d215254d0dJason Sams    return 0;
391135c4b747bce5898d98de964d7c453d215254d0dJason Sams}
392135c4b747bce5898d98de964d7c453d215254d0dJason Sams
393135c4b747bce5898d98de964d7c453d215254d0dJason Sams
394