Home | History | Annotate | Download | only in utils
      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 // ---------------------------------------------------------------------------
     26 namespace android {
     27 
     28 class TextOutput
     29 {
     30 public:
     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).
     52 extern TextOutput& alog;
     53 
     54 // Text output stream for printing to stdout.
     55 extern TextOutput& aout;
     56 
     57 // Text output stream for printing to stderr.
     58 extern TextOutput& aerr;
     59 
     60 typedef TextOutput& (*TextOutputManipFunc)(TextOutput&);
     61 
     62 TextOutput& endl(TextOutput& to);
     63 TextOutput& indent(TextOutput& to);
     64 TextOutput& dedent(TextOutput& to);
     65 
     66 TextOutput& operator<<(TextOutput& to, const char* str);
     67 TextOutput& operator<<(TextOutput& to, char);     // writes raw character
     68 TextOutput& operator<<(TextOutput& to, bool);
     69 TextOutput& operator<<(TextOutput& to, int);
     70 TextOutput& operator<<(TextOutput& to, long);
     71 TextOutput& operator<<(TextOutput& to, unsigned int);
     72 TextOutput& operator<<(TextOutput& to, unsigned long);
     73 TextOutput& operator<<(TextOutput& to, long long);
     74 TextOutput& operator<<(TextOutput& to, unsigned long long);
     75 TextOutput& operator<<(TextOutput& to, float);
     76 TextOutput& operator<<(TextOutput& to, double);
     77 TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func);
     78 TextOutput& operator<<(TextOutput& to, const void*);
     79 
     80 class TypeCode
     81 {
     82 public:
     83     inline TypeCode(uint32_t code);
     84     inline ~TypeCode();
     85 
     86     inline uint32_t typeCode() const;
     87 
     88 private:
     89     uint32_t mCode;
     90 };
     91 
     92 TextOutput& operator<<(TextOutput& to, const TypeCode& val);
     93 
     94 class HexDump
     95 {
     96 public:
     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 
    112 private:
    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 
    121 TextOutput& operator<<(TextOutput& to, const HexDump& val);
    122 
    123 // ---------------------------------------------------------------------------
    124 // No user servicable parts below.
    125 
    126 inline TextOutput& endl(TextOutput& to)
    127 {
    128     to.print("\n", 1);
    129     return to;
    130 }
    131 
    132 inline TextOutput& indent(TextOutput& to)
    133 {
    134     to.moveIndent(1);
    135     return to;
    136 }
    137 
    138 inline TextOutput& dedent(TextOutput& to)
    139 {
    140     to.moveIndent(-1);
    141     return to;
    142 }
    143 
    144 inline TextOutput& operator<<(TextOutput& to, const char* str)
    145 {
    146     to.print(str, strlen(str));
    147     return to;
    148 }
    149 
    150 inline TextOutput& operator<<(TextOutput& to, char c)
    151 {
    152     to.print(&c, 1);
    153     return to;
    154 }
    155 
    156 inline TextOutput& operator<<(TextOutput& to, TextOutputManipFunc func)
    157 {
    158     return (*func)(to);
    159 }
    160 
    161 inline TypeCode::TypeCode(uint32_t code) : mCode(code) { }
    162 inline TypeCode::~TypeCode() { }
    163 inline uint32_t TypeCode::typeCode() const { return mCode; }
    164 
    165 inline HexDump::~HexDump() { }
    166 
    167 inline HexDump& HexDump::setBytesPerLine(size_t bytesPerLine) {
    168     mBytesPerLine = bytesPerLine; return *this;
    169 }
    170 inline HexDump& HexDump::setSingleLineCutoff(int32_t bytes) {
    171     mSingleLineCutoff = bytes; return *this;
    172 }
    173 inline HexDump& HexDump::setAlignment(size_t alignment) {
    174     mAlignment = alignment; return *this;
    175 }
    176 inline HexDump& HexDump::setCArrayStyle(bool enabled) {
    177     mCArrayStyle = enabled; return *this;
    178 }
    179 
    180 inline const void* HexDump::buffer() const { return mBuffer; }
    181 inline size_t HexDump::size() const { return mSize; }
    182 inline size_t HexDump::bytesPerLine() const { return mBytesPerLine; }
    183 inline int32_t HexDump::singleLineCutoff() const { return mSingleLineCutoff; }
    184 inline size_t HexDump::alignment() const { return mAlignment; }
    185 inline bool HexDump::carrayStyle() const { return mCArrayStyle; }
    186 
    187 // ---------------------------------------------------------------------------
    188 }; // namespace android
    189 
    190 #endif // ANDROID_TEXTOUTPUT_H
    191