115 lines
2.8 KiB
C++
115 lines
2.8 KiB
C++
/*
|
|
* 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
|