/* * Copyright (C) 2015, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "code_writer.h" #include <iostream> #include <stdarg.h> #include <android-base/stringprintf.h> using std::cerr; using std::endl; namespace android { namespace aidl { namespace { class StringCodeWriter : public CodeWriter { public: explicit StringCodeWriter(std::string* output_buffer) : output_(output_buffer) {} virtual ~StringCodeWriter() = default; bool Write(const char* format, ...) override { va_list ap; va_start(ap, format); android::base::StringAppendV(output_, format, ap); va_end(ap); return true; } bool Close() override { return true; } private: std::string* output_; }; // class StringCodeWriter class FileCodeWriter : public CodeWriter { public: FileCodeWriter(FILE* output_file, bool close_on_destruction) : output_(output_file), close_on_destruction_(close_on_destruction) {} virtual ~FileCodeWriter() { if (close_on_destruction_ && output_ != nullptr) { fclose(output_); } } bool Write(const char* format, ...) override { bool success; va_list ap; va_start(ap, format); success = vfprintf(output_, format, ap) >= 0; va_end(ap); no_error_ = no_error_ && success; return success; } bool Close() override { if (output_ != nullptr) { no_error_ = fclose(output_) == 0 && no_error_; output_ = nullptr; } return no_error_; } private: bool no_error_ = true; FILE* output_; bool close_on_destruction_; }; // class StringCodeWriter } // namespace CodeWriterPtr GetFileWriter(const std::string& output_file) { CodeWriterPtr result; FILE* to = nullptr; bool close_on_destruction = true; if (output_file == "-") { to = stdout; close_on_destruction = false; } else { // open file in binary mode to ensure that the tool produces the // same output on all platforms !! to = fopen(output_file.c_str(), "wb"); } if (to != nullptr) { result.reset(new FileCodeWriter(to, close_on_destruction)); } else { cerr << "unable to open " << output_file << " for write" << endl; } return result; } CodeWriterPtr GetStringWriter(std::string* output_buffer) { return CodeWriterPtr(new StringCodeWriter(output_buffer)); } } // namespace aidl } // namespace android