blob: c29c89db20ee3316d35f2c714474fbe3e99aa6d0 [file] [log] [blame]
Jason Sams1b6a0882012-03-12 15:07:58 -07001/*
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
40using namespace std;
41
42namespace slang {
43
44static 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
63RSReflectionBase::RSReflectionBase(const RSContext *con) {
Jason Sams192392f2012-03-13 16:22:12 -070064 mRSContext = con;
65 mLicenseNote = gApacheLicenseNote;
Jason Sams1b6a0882012-03-12 15:07:58 -070066
67}
68
69RSReflectionBase::~RSReflectionBase() {
70
71}
72
73/*
74bool 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
92void RSReflectionBase::startFile(const string &filename) {
Jason Sams192392f2012-03-13 16:22:12 -070093 if(mVerbose) {
94 printf("Generating %s\n", filename.c_str());
95 }
Jason Sams1b6a0882012-03-12 15:07:58 -070096
Jason Sams192392f2012-03-13 16:22:12 -070097 // License
98 write(mLicenseNote);
Jason Sams1b6a0882012-03-12 15:07:58 -070099
Jason Sams192392f2012-03-13 16:22:12 -0700100 // 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 Sams1b6a0882012-03-12 15:07:58 -0700106}
107
108string RSReflectionBase::stripRS(const string &s) const {
Jason Sams192392f2012-03-13 16:22:12 -0700109 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 Sams1b6a0882012-03-12 15:07:58 -0700116}
117
118void RSReflectionBase::write(const std::string &t) {
Jason Sams192392f2012-03-13 16:22:12 -0700119 //printf("%s%s\n", mIndent.c_str(), t.c_str());
120 mText.push_back(mIndent + t);
121}
122
123void RSReflectionBase::write(const std::stringstream &t) {
124 mText.push_back(mIndent + t.str());
Jason Sams1b6a0882012-03-12 15:07:58 -0700125}
126
127
128void RSReflectionBase::incIndent() {
129 mIndent.append(" ");
130}
131
132void RSReflectionBase::decIndent() {
133 mIndent.erase(0, 4);
134}
135
136bool RSReflectionBase::writeFile(const string &filename, const vector< string > &txt) {
Jason Sams192392f2012-03-13 16:22:12 -0700137 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
151string 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 Sams1b6a0882012-03-12 15:07:58 -0700165 }
166
Jason Sams192392f2012-03-13 16:22:12 -0700167 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 Sams1b6a0882012-03-12 15:07:58 -0700175 }
Jason Sams192392f2012-03-13 16:22:12 -0700176
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 Sams1b6a0882012-03-12 15:07:58 -0700190}
191
192
193}