1 /* 2 * Copyright 2012, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <sys/stat.h> 18 19 #include <cstdarg> 20 #include <cctype> 21 22 #include <algorithm> 23 #include <sstream> 24 #include <string> 25 #include <utility> 26 27 #include "os_sep.h" 28 #include "slang_rs_context.h" 29 #include "slang_rs_export_var.h" 30 #include "slang_rs_export_foreach.h" 31 #include "slang_rs_export_func.h" 32 #include "slang_rs_reflect_utils.h" 33 #include "slang_version.h" 34 #include "slang_utils.h" 35 36 #include "slang_rs_reflection_base.h" 37 38 39 40 using namespace std; 41 42 namespace slang { 43 44 static const char *const gApacheLicenseNote = 45 "/*\n" 46 " * Copyright (C) 2012 The Android Open Source Project\n" 47 " *\n" 48 " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 49 " * you may not use this file except in compliance with the License.\n" 50 " * You may obtain a copy of the License at\n" 51 " *\n" 52 " * http://www.apache.org/licenses/LICENSE-2.0\n" 53 " *\n" 54 " * Unless required by applicable law or agreed to in writing, software\n" 55 " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 56 " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 57 " * See the License for the specific language governing permissions and\n" 58 " * limitations under the License.\n" 59 " */\n" 60 "\n"; 61 62 63 RSReflectionBase::RSReflectionBase(const RSContext *con) { 64 mRSContext = con; 65 mLicenseNote = gApacheLicenseNote; 66 67 } 68 69 RSReflectionBase::~RSReflectionBase() { 70 71 } 72 73 /* 74 bool RSReflectionBase::openFile(const string &name, string &errorMsg) { 75 if(!mUseStdout) { 76 mOF.clear(); 77 if(!SlangUtils::CreateDirectoryWithParents(mOutputPath, &errorMsg)) { 78 return false; 79 } 80 81 string cf(mOutputPath + OS_PATH_SEPARATOR_STR + name); 82 mOF.open(cf.c_str()); 83 if(!mOF.good()) { 84 errorMsg = "failed to open file '" + cf + "' for write"; 85 return false; 86 } 87 } 88 return true; 89 } 90 */ 91 92 void RSReflectionBase::startFile(const string &filename) { 93 if(mVerbose) { 94 printf("Generating %s\n", filename.c_str()); 95 } 96 97 // License 98 write(mLicenseNote); 99 100 // Notice of generated file 101 write("/*"); 102 write(" * This file is auto-generated. DO NOT MODIFY!"); 103 write(" * The source Renderscript file: " + mInputFileName); 104 write(" */"); 105 write(""); 106 } 107 108 string RSReflectionBase::stripRS(const string &s) const { 109 size_t pos = s.rfind(".rs"); 110 if(pos != string::npos) { 111 string tmp(s); 112 tmp.erase(pos); 113 return tmp; 114 } 115 return s; 116 } 117 118 void RSReflectionBase::write(const std::string &t) { 119 //printf("%s%s\n", mIndent.c_str(), t.c_str()); 120 mText.push_back(mIndent + t); 121 } 122 123 void RSReflectionBase::write(const std::stringstream &t) { 124 mText.push_back(mIndent + t.str()); 125 } 126 127 128 void RSReflectionBase::incIndent() { 129 mIndent.append(" "); 130 } 131 132 void RSReflectionBase::decIndent() { 133 mIndent.erase(0, 4); 134 } 135 136 bool RSReflectionBase::writeFile(const string &filename, const vector< string > &txt) { 137 FILE *pfin = fopen(filename.c_str(), "wt"); 138 if (pfin == NULL) { 139 fprintf(stderr, "Error: could not write file %s\n", filename.c_str()); 140 return false; 141 } 142 143 for(size_t ct=0; ct < txt.size(); ct++) { 144 fprintf(pfin, "%s\n", txt[ct].c_str()); 145 } 146 fclose(pfin); 147 return true; 148 } 149 150 151 string RSReflectionBase::genInitValue(const clang::APValue &Val, bool asBool) { 152 stringstream tmp; 153 switch (Val.getKind()) { 154 case clang::APValue::Int: { 155 llvm::APInt api = Val.getInt(); 156 if(asBool) { 157 tmp << ((api.getSExtValue() == 0) ? "false" : "true"); 158 } else { 159 tmp << api.getSExtValue(); 160 if (api.getBitWidth() > 32) { 161 tmp << "L"; 162 } 163 } 164 break; 165 } 166 167 case clang::APValue::Float: { 168 llvm::APFloat apf = Val.getFloat(); 169 if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { 170 tmp << apf.convertToFloat() << "f"; 171 } else { 172 tmp << apf.convertToDouble(); 173 } 174 break; 175 } 176 177 case clang::APValue::ComplexInt: 178 case clang::APValue::ComplexFloat: 179 case clang::APValue::LValue: 180 case clang::APValue::Vector: { 181 slangAssert(false && "Primitive type cannot have such kind of initializer"); 182 break; 183 } 184 185 default: { 186 slangAssert(false && "Unknown kind of initializer"); 187 } 188 } 189 return tmp.str(); 190 } 191 192 193 } 194