| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "tools/kazoo/writer.h" |
| |
| #include <zircon/assert.h> |
| |
| #include "tools/kazoo/string_util.h" |
| |
| Writer::Writer() {} |
| |
| void Writer::Printf(const char* format, ...) { |
| va_list ap; |
| va_start(ap, format); |
| std::string result = StringVPrintf(format, ap); |
| va_end(ap); |
| Puts(result); |
| } |
| |
| void Writer::Puts(const std::string& str) { |
| out_ += str; |
| } |
| |
| void Writer::PrintSpacerLine() { |
| size_t size = out_.size(); |
| if (size < 2 || (out_[size - 2] == '\n' && out_[size - 1] == '\n')) { |
| // The last line was empty. |
| return; |
| } |
| Puts("\n"); |
| } |
| |
| bool WriteFileIfChanged(const std::string& filename, const std::string& data) { |
| std::string old_data; |
| if (ReadFileToString(filename, &old_data) && old_data == data) { |
| // No need to rewrite the file. |
| return true; |
| } |
| |
| FILE* outf = fopen(filename.c_str(), "wb"); |
| if (!outf) { |
| fprintf(stderr, "Couldn't open '%s' for output.\n", filename.c_str()); |
| return false; |
| } |
| size_t written = fwrite(data.data(), 1, data.size(), outf); |
| if (written != data.size()) { |
| fprintf(stderr, "Writing file '%s' failed, %zu written but %zu expected.\n", filename.c_str(), |
| written, data.size()); |
| return false; |
| } |
| if (fclose(outf) != 0) { |
| fprintf(stderr, "fclose() failed writing '%s'.\n", filename.c_str()); |
| return false; |
| } |
| return true; |
| } |