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 TextOutput
29{
30public:
31                        TextOutput();
32    virtual             ~TextOutput();
33
34    virtual status_t    print(const char* txt, size_t len) = 0;
35    virtual void        moveIndent(int delta) = 0;
36
37    class Bundle {
38    public:
39        inline Bundle(TextOutput& to) : mTO(to) { to.pushBundle(); }
40        inline ~Bundle() { mTO.popBundle(); }
41    private:
42        TextOutput&     mTO;
43    };
44
45    virtual void        pushBundle() = 0;
46    virtual void        popBundle() = 0;
47};
48
49// ---------------------------------------------------------------------------
50
51// Text output stream for printing to the log (via utils/Log.h).
52extern TextOutput& alog;
53
54// Text output stream for printing to stdout.
55extern TextOutput& aout;
56
57// Text output stream for printing to stderr.
58extern TextOutput& aerr;
59
60typedef TextOutput& (*TextOutputManipFunc)(TextOutput&);
61
62TextOutput& endl(TextOutput& to);
63TextOutput& indent(TextOutput& to);
64TextOutput& dedent(TextOutput& to);
65
66TextOutput& operator<<(TextOutput& to, const char* str);
67TextOutput& operator<<(TextOutput& to, char);     // writes raw character
68TextOutput& operator<<(TextOutput& to, bool);
69TextOutput& operator<<(TextOutput& to, int);
70TextOutput& operator<<(TextOutput& to, long);
71TextOutput& operator<<(TextOutput& to, unsigned int);
72TextOutput& operator<<(TextOutput& to, unsigned long);
73TextOutput& operator<<(TextOutput& to, long long);
74TextOutput& operator<<(TextOutput& to, unsigned long long);
75TextOutput& operator<<(TextOutput& to, float);
76TextOutput& operator<<(TextOutput& to, double);
77TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func);
78TextOutput& operator<<(TextOutput& to, const void*);
79
80class TypeCode
81{
82public:
83    inline TypeCode(uint32_t code);
84    inline ~TypeCode();
85
86    inline uint32_t typeCode() const;
87
88private:
89    uint32_t mCode;
90};
91
92TextOutput& operator<<(TextOutput& to, const TypeCode& val);
93
94class HexDump
95{
96public:
97    HexDump(const void *buf, size_t size, size_t bytesPerLine=16);
98    inline ~HexDump();
99
100    inline HexDump& setBytesPerLine(size_t bytesPerLine);
101    inline HexDump& setSingleLineCutoff(int32_t bytes);
102    inline HexDump& setAlignment(size_t alignment);
103    inline HexDump& setCArrayStyle(bool enabled);
104
105    inline const void* buffer() const;
106    inline size_t size() const;
107    inline size_t bytesPerLine() const;
108    inline int32_t singleLineCutoff() const;
109    inline size_t alignment() const;
110    inline bool carrayStyle() const;
111
112private:
113    const void* mBuffer;
114    size_t mSize;
115    size_t mBytesPerLine;
116    int32_t mSingleLineCutoff;
117    size_t mAlignment;
118    bool mCArrayStyle;
119};
120
121TextOutput& operator<<(TextOutput& to, const HexDump& val);
122
123// ---------------------------------------------------------------------------
124// No user servicable parts below.
125
126inline TextOutput& endl(TextOutput& to)
127{
128    to.print("\n", 1);
129    return to;
130}
131
132inline TextOutput& indent(TextOutput& to)
133{
134    to.moveIndent(1);
135    return to;
136}
137
138inline TextOutput& dedent(TextOutput& to)
139{
140    to.moveIndent(-1);
141    return to;
142}
143
144inline TextOutput& operator<<(TextOutput& to, const char* str)
145{
146    to.print(str, strlen(str));
147    return to;
148}
149
150inline TextOutput& operator<<(TextOutput& to, char c)
151{
152    to.print(&c, 1);
153    return to;
154}
155
156inline TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func)
157{
158    return (*func)(to);
159}
160
161inline TypeCode::TypeCode(uint32_t code) : mCode(code) { }
162inline TypeCode::~TypeCode() { }
163inline uint32_t TypeCode::typeCode() const { return mCode; }
164
165inline HexDump::~HexDump() { }
166
167inline HexDump& HexDump::setBytesPerLine(size_t bytesPerLine) {
168    mBytesPerLine = bytesPerLine; return *this;
169}
170inline HexDump& HexDump::setSingleLineCutoff(int32_t bytes) {
171    mSingleLineCutoff = bytes; return *this;
172}
173inline HexDump& HexDump::setAlignment(size_t alignment) {
174    mAlignment = alignment; return *this;
175}
176inline HexDump& HexDump::setCArrayStyle(bool enabled) {
177    mCArrayStyle = enabled; return *this;
178}
179
180inline const void* HexDump::buffer() const { return mBuffer; }
181inline size_t HexDump::size() const { return mSize; }
182inline size_t HexDump::bytesPerLine() const { return mBytesPerLine; }
183inline int32_t HexDump::singleLineCutoff() const { return mSingleLineCutoff; }
184inline size_t HexDump::alignment() const { return mAlignment; }
185inline bool HexDump::carrayStyle() const { return mCArrayStyle; }
186
187// ---------------------------------------------------------------------------
188}; // namespace android
189
190#endif // ANDROID_TEXTOUTPUT_H
191