Printer.cpp revision 93190b79d11d874199cfe7258526a48cfc8399fc
193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski/*
293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * Copyright (C) 2017 The Android Open Source Project
393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski *
493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * you may not use this file except in compliance with the License.
693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * You may obtain a copy of the License at
793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski *
893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski *
1093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * Unless required by applicable law or agreed to in writing, software
1193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * See the License for the specific language governing permissions and
1493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski * limitations under the License.
1593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski */
1693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
1793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski#include "text/Printer.h"
1893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
1993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski#include <algorithm>
2093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
2193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski#include "io/Util.h"
2293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
2393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskiusing ::aapt::io::OutputStream;
2493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskiusing ::android::StringPiece;
2593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
2693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskinamespace aapt {
2793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskinamespace text {
2893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
2993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskivoid Printer::Println(const StringPiece& str) {
3093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  Print(str);
3193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  Print("\n");
3293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski}
3393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
3493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskivoid Printer::Println() {
3593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  Print("\n");
3693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski}
3793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
3893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskivoid Printer::Print(const StringPiece& str) {
3993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  if (error_) {
4093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    return;
4193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  }
4293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
4393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  auto remaining_str_begin = str.begin();
4493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  const auto remaining_str_end = str.end();
4593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  while (remaining_str_end != remaining_str_begin) {
4693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    // Find the next new-line.
4793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    const auto new_line_iter = std::find(remaining_str_begin, remaining_str_end, '\n');
4893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
4993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    // We will copy the string up until the next new-line (or end of string).
5093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    const StringPiece str_to_copy = str.substr(remaining_str_begin, new_line_iter);
5193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    if (!str_to_copy.empty()) {
5293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      if (needs_indent_) {
5393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski        for (int i = 0; i < indent_level_; i++) {
5493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski          if (!io::Copy(out_, "  ")) {
5593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski            error_ = true;
5693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski            return;
5793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski          }
5893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski        }
5993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski        needs_indent_ = false;
6093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      }
6193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
6293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      if (!io::Copy(out_, str_to_copy)) {
6393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski        error_ = true;
6493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski        return;
6593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      }
6693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    }
6793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
6893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    // If we found a new-line.
6993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    if (new_line_iter != remaining_str_end) {
7093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      if (!io::Copy(out_, "\n")) {
7193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski        error_ = true;
7293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski        return;
7393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      }
7493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      needs_indent_ = true;
7593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      // Ok to increment iterator here because we know that the '\n' character is one byte.
7693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      remaining_str_begin = new_line_iter + 1;
7793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    } else {
7893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski      remaining_str_begin = new_line_iter;
7993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski    }
8093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  }
8193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski}
8293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
8393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskivoid Printer::Indent() {
8493190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  ++indent_level_;
8593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski}
8693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
8793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskivoid Printer::Undent() {
8893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  --indent_level_;
8993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski}
9093190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
9193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski}  // namespace text
9293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski}  // namespace aapt
93