12bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers/* 22bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * Copyright (C) 2012 The Android Open Source Project 32bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * 42bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 52bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * you may not use this file except in compliance with the License. 62bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * You may obtain a copy of the License at 72bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * 82bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 92bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * 102bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * Unless required by applicable law or agreed to in writing, software 112bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 122bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * See the License for the specific language governing permissions and 142bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * limitations under the License. 152bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers */ 162bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_INDENTER_H_ 18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_INDENTER_H_ 192bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 20761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h" 212bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers#include <streambuf> 222bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 232bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogersconst char kIndentChar =' '; 242bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogersconst size_t kIndentBy1Count = 2; 252bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 262bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogersclass Indenter : public std::streambuf { 272bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers public: 282bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers Indenter(std::streambuf* out, char text, size_t count) 292bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers : indent_next_(true), out_sbuf_(out), text_(text), count_(count) {} 302bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 312bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers private: 322bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers int_type overflow(int_type c) { 332bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers if (c != std::char_traits<char>::eof()) { 342bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers if (indent_next_) { 352bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers for (size_t i = 0; i < count_; ++i) { 362bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers out_sbuf_->sputc(text_); 372bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers } 382bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers } 392bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers out_sbuf_->sputc(c); 402bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers indent_next_ = (c == '\n'); 412bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers } 422bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers return std::char_traits<char>::not_eof(c); 432bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers } 442bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 452bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers int sync() { 462bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers return out_sbuf_->pubsync(); 472bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers } 482bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 492bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers bool indent_next_; 502bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 512bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers // Buffer to write output to. 522bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers std::streambuf* const out_sbuf_; 532bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 542bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers // Text output as indent. 552bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers const char text_; 562bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 572bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers // Number of times text is output. 582bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers const size_t count_; 592bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 602bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers DISALLOW_COPY_AND_ASSIGN(Indenter); 612bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers}; 622bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers 63fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif // ART_RUNTIME_INDENTER_H_ 64