Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 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) { |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 64 | mRSContext = con; |
| 65 | mLicenseNote = gApacheLicenseNote; |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 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) { |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 93 | if(mVerbose) { |
| 94 | printf("Generating %s\n", filename.c_str()); |
| 95 | } |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 96 | |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 97 | // License |
| 98 | write(mLicenseNote); |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 99 | |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 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(""); |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | string RSReflectionBase::stripRS(const string &s) const { |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 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; |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 116 | } |
| 117 | |
| 118 | void RSReflectionBase::write(const std::string &t) { |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 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()); |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 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) { |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 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; |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 165 | } |
| 166 | |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 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; |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 175 | } |
Jason Sams | 192392f | 2012-03-13 16:22:12 -0700 | [diff] [blame] | 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(); |
Jason Sams | 1b6a088 | 2012-03-12 15:07:58 -0700 | [diff] [blame] | 190 | } |
| 191 | |
| 192 | |
| 193 | } |