1/* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ANDROID_TEXTOUTPUT_H 18#define ANDROID_TEXTOUTPUT_H 19 20#include <utils/Errors.h> 21 22#include <stdint.h> 23#include <string.h> 24 25// --------------------------------------------------------------------------- 26namespace android { 27 28class String8; 29class String16; 30 31class TextOutput 32{ 33public: 34 TextOutput(); 35 virtual ~TextOutput(); 36 37 virtual status_t print(const char* txt, size_t len) = 0; 38 virtual void moveIndent(int delta) = 0; 39 40 class Bundle { 41 public: 42 inline Bundle(TextOutput& to) : mTO(to) { to.pushBundle(); } 43 inline ~Bundle() { mTO.popBundle(); } 44 private: 45 TextOutput& mTO; 46 }; 47 48 virtual void pushBundle() = 0; 49 virtual void popBundle() = 0; 50}; 51 52// --------------------------------------------------------------------------- 53 54// Text output stream for printing to the log (via utils/Log.h). 55extern TextOutput& alog; 56 57// Text output stream for printing to stdout. 58extern TextOutput& aout; 59 60// Text output stream for printing to stderr. 61extern TextOutput& aerr; 62 63typedef TextOutput& (*TextOutputManipFunc)(TextOutput&); 64 65TextOutput& endl(TextOutput& to); 66TextOutput& indent(TextOutput& to); 67TextOutput& dedent(TextOutput& to); 68 69TextOutput& operator<<(TextOutput& to, const char* str); 70TextOutput& operator<<(TextOutput& to, char); // writes raw character 71TextOutput& operator<<(TextOutput& to, bool); 72TextOutput& operator<<(TextOutput& to, int); 73TextOutput& operator<<(TextOutput& to, long); 74TextOutput& operator<<(TextOutput& to, unsigned int); 75TextOutput& operator<<(TextOutput& to, unsigned long); 76TextOutput& operator<<(TextOutput& to, long long); 77TextOutput& operator<<(TextOutput& to, unsigned long long); 78TextOutput& operator<<(TextOutput& to, float); 79TextOutput& operator<<(TextOutput& to, double); 80TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func); 81TextOutput& operator<<(TextOutput& to, const void*); 82TextOutput& operator<<(TextOutput& to, const String8& val); 83TextOutput& operator<<(TextOutput& to, const String16& val); 84 85class TypeCode 86{ 87public: 88 inline TypeCode(uint32_t code); 89 inline ~TypeCode(); 90 91 inline uint32_t typeCode() const; 92 93private: 94 uint32_t mCode; 95}; 96 97TextOutput& operator<<(TextOutput& to, const TypeCode& val); 98 99class HexDump 100{ 101public: 102 HexDump(const void *buf, size_t size, size_t bytesPerLine=16); 103 inline ~HexDump(); 104 105 inline HexDump& setBytesPerLine(size_t bytesPerLine); 106 inline HexDump& setSingleLineCutoff(int32_t bytes); 107 inline HexDump& setAlignment(size_t alignment); 108 inline HexDump& setCArrayStyle(bool enabled); 109 110 inline const void* buffer() const; 111 inline size_t size() const; 112 inline size_t bytesPerLine() const; 113 inline int32_t singleLineCutoff() const; 114 inline size_t alignment() const; 115 inline bool carrayStyle() const; 116 117private: 118 const void* mBuffer; 119 size_t mSize; 120 size_t mBytesPerLine; 121 int32_t mSingleLineCutoff; 122 size_t mAlignment; 123 bool mCArrayStyle; 124}; 125 126TextOutput& operator<<(TextOutput& to, const HexDump& val); 127 128// --------------------------------------------------------------------------- 129// No user servicable parts below. 130 131inline TextOutput& endl(TextOutput& to) 132{ 133 to.print("\n", 1); 134 return to; 135} 136 137inline TextOutput& indent(TextOutput& to) 138{ 139 to.moveIndent(1); 140 return to; 141} 142 143inline TextOutput& dedent(TextOutput& to) 144{ 145 to.moveIndent(-1); 146 return to; 147} 148 149inline TextOutput& operator<<(TextOutput& to, const char* str) 150{ 151 to.print(str, strlen(str)); 152 return to; 153} 154 155inline TextOutput& operator<<(TextOutput& to, char c) 156{ 157 to.print(&c, 1); 158 return to; 159} 160 161inline TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func) 162{ 163 return (*func)(to); 164} 165 166inline TypeCode::TypeCode(uint32_t code) : mCode(code) { } 167inline TypeCode::~TypeCode() { } 168inline uint32_t TypeCode::typeCode() const { return mCode; } 169 170inline HexDump::~HexDump() { } 171 172inline HexDump& HexDump::setBytesPerLine(size_t bytesPerLine) { 173 mBytesPerLine = bytesPerLine; return *this; 174} 175inline HexDump& HexDump::setSingleLineCutoff(int32_t bytes) { 176 mSingleLineCutoff = bytes; return *this; 177} 178inline HexDump& HexDump::setAlignment(size_t alignment) { 179 mAlignment = alignment; return *this; 180} 181inline HexDump& HexDump::setCArrayStyle(bool enabled) { 182 mCArrayStyle = enabled; return *this; 183} 184 185inline const void* HexDump::buffer() const { return mBuffer; } 186inline size_t HexDump::size() const { return mSize; } 187inline size_t HexDump::bytesPerLine() const { return mBytesPerLine; } 188inline int32_t HexDump::singleLineCutoff() const { return mSingleLineCutoff; } 189inline size_t HexDump::alignment() const { return mAlignment; } 190inline bool HexDump::carrayStyle() const { return mCArrayStyle; } 191 192// --------------------------------------------------------------------------- 193}; // namespace android 194 195#endif // ANDROID_TEXTOUTPUT_H 196