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