1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_TEXTOUTPUT_H 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_TEXTOUTPUT_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 2178f2a376144057e1390563c22c4f00a872e37671Wei Wang#include <utils/String8.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 2513c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang#include <sstream> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass TextOutput 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 3383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian TextOutput(); 3483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian virtual ~TextOutput(); 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual status_t print(const char* txt, size_t len) = 0; 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void moveIndent(int delta) = 0; 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project class Bundle { 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public: 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline Bundle(TextOutput& to) : mTO(to) { to.pushBundle(); } 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline ~Bundle() { mTO.popBundle(); } 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project private: 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project TextOutput& mTO; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void pushBundle() = 0; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void popBundle() = 0; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Text output stream for printing to the log (via utils/Log.h). 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectextern TextOutput& alog; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Text output stream for printing to stdout. 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectextern TextOutput& aout; 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Text output stream for printing to stderr. 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectextern TextOutput& aerr; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttypedef TextOutput& (*TextOutputManipFunc)(TextOutput&); 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTextOutput& endl(TextOutput& to); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTextOutput& indent(TextOutput& to); 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTextOutput& dedent(TextOutput& to); 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6813c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wangtemplate<typename T> 6913c41d3c7b20c6890889509dbf36b23bd7c20121Wei WangTextOutput& operator<<(TextOutput& to, const T& val) 7013c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang{ 7113c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang std::stringstream strbuf; 7213c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang strbuf << val; 7313c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang std::string str = strbuf.str(); 7413c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang to.print(str.c_str(), str.size()); 7513c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang return to; 7613c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang} 7713c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTextOutput& operator<<(TextOutput& to, TextOutputManipFunc func); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 8013c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wangclass TypeCode 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline TypeCode(uint32_t code); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline ~TypeCode(); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline uint32_t typeCode() const; 8713c41d3c7b20c6890889509dbf36b23bd7c20121Wei Wang 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t mCode; 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTextOutput& operator<<(TextOutput& to, const TypeCode& val); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass HexDump 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project HexDump(const void *buf, size_t size, size_t bytesPerLine=16); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline ~HexDump(); 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline HexDump& setBytesPerLine(size_t bytesPerLine); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline HexDump& setSingleLineCutoff(int32_t bytes); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline HexDump& setAlignment(size_t alignment); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline HexDump& setCArrayStyle(bool enabled); 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline const void* buffer() const; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline size_t size() const; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline size_t bytesPerLine() const; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline int32_t singleLineCutoff() const; 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline size_t alignment() const; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline bool carrayStyle() const; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const void* mBuffer; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t mSize; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t mBytesPerLine; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t mSingleLineCutoff; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t mAlignment; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool mCArrayStyle; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectTextOutput& operator<<(TextOutput& to, const HexDump& val); 12278f2a376144057e1390563c22c4f00a872e37671Wei Wanginline TextOutput& operator<<(TextOutput& to, 12378f2a376144057e1390563c22c4f00a872e37671Wei Wang decltype(std::endl<char, 12478f2a376144057e1390563c22c4f00a872e37671Wei Wang std::char_traits<char>>) 12578f2a376144057e1390563c22c4f00a872e37671Wei Wang /*val*/) { 12678f2a376144057e1390563c22c4f00a872e37671Wei Wang endl(to); 12778f2a376144057e1390563c22c4f00a872e37671Wei Wang return to; 12878f2a376144057e1390563c22c4f00a872e37671Wei Wang} 12978f2a376144057e1390563c22c4f00a872e37671Wei Wang 13078f2a376144057e1390563c22c4f00a872e37671Wei Wanginline TextOutput& operator<<(TextOutput& to, const char &c) 13178f2a376144057e1390563c22c4f00a872e37671Wei Wang{ 13278f2a376144057e1390563c22c4f00a872e37671Wei Wang to.print(&c, 1); 13378f2a376144057e1390563c22c4f00a872e37671Wei Wang return to; 13478f2a376144057e1390563c22c4f00a872e37671Wei Wang} 13578f2a376144057e1390563c22c4f00a872e37671Wei Wang 13678f2a376144057e1390563c22c4f00a872e37671Wei Wanginline TextOutput& operator<<(TextOutput& to, const bool &val) 13778f2a376144057e1390563c22c4f00a872e37671Wei Wang{ 13878f2a376144057e1390563c22c4f00a872e37671Wei Wang if (val) to.print("true", 4); 13978f2a376144057e1390563c22c4f00a872e37671Wei Wang else to.print("false", 5); 14078f2a376144057e1390563c22c4f00a872e37671Wei Wang return to; 14178f2a376144057e1390563c22c4f00a872e37671Wei Wang} 14278f2a376144057e1390563c22c4f00a872e37671Wei Wang 14378f2a376144057e1390563c22c4f00a872e37671Wei Wanginline TextOutput& operator<<(TextOutput& to, const String16& val) 14478f2a376144057e1390563c22c4f00a872e37671Wei Wang{ 14578f2a376144057e1390563c22c4f00a872e37671Wei Wang to << String8(val).string(); 14678f2a376144057e1390563c22c4f00a872e37671Wei Wang return to; 14778f2a376144057e1390563c22c4f00a872e37671Wei Wang} 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// No user servicable parts below. 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline TextOutput& endl(TextOutput& to) 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project to.print("\n", 1); 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return to; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline TextOutput& indent(TextOutput& to) 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project to.moveIndent(1); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return to; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline TextOutput& dedent(TextOutput& to) 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project to.moveIndent(-1); 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return to; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func) 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (*func)(to); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline TypeCode::TypeCode(uint32_t code) : mCode(code) { } 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline TypeCode::~TypeCode() { } 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline uint32_t TypeCode::typeCode() const { return mCode; } 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline HexDump::~HexDump() { } 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline HexDump& HexDump::setBytesPerLine(size_t bytesPerLine) { 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mBytesPerLine = bytesPerLine; return *this; 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline HexDump& HexDump::setSingleLineCutoff(int32_t bytes) { 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mSingleLineCutoff = bytes; return *this; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline HexDump& HexDump::setAlignment(size_t alignment) { 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mAlignment = alignment; return *this; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline HexDump& HexDump::setCArrayStyle(bool enabled) { 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mCArrayStyle = enabled; return *this; 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline const void* HexDump::buffer() const { return mBuffer; } 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline size_t HexDump::size() const { return mSize; } 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline size_t HexDump::bytesPerLine() const { return mBytesPerLine; } 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline int32_t HexDump::singleLineCutoff() const { return mSingleLineCutoff; } 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline size_t HexDump::alignment() const { return mAlignment; } 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline bool HexDump::carrayStyle() const { return mCArrayStyle; } 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_TEXTOUTPUT_H 205