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