1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 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
17002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian#include <binder/Debug.h>
18b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross#include <binder/ProcessState.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/misc.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ctype.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const char indentStr[] =
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project"                                                                            "
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project"                                                                            ";
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* stringForIndent(int32_t indentLevel)
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ssize_t off = sizeof(indentStr)-1-(indentLevel*2);
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return indentStr + (off < 0 ? 0 : off);
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
426f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossstatic void defaultPrintFunc(void* /*cookie*/, const char* txt)
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    printf("%s", txt);
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline int isident(int c)
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return isalnum(c) || c == '_';
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline bool isasciitype(char c)
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if( c >= ' ' && c < 127 && c != '\'' && c != '\\' ) return true;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return false;
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline char makehexdigit(uint32_t val)
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return "0123456789abcdef"[val&0xF];
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char* appendhexnum(uint32_t val, char* out)
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for( int32_t i=28; i>=0; i-=4 ) {
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *out++ = makehexdigit( val>>i );
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *out = 0;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return out;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char* appendcharornum(char c, char* out, bool skipzero = true)
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (skipzero && c == 0) return out;
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (isasciitype(c)) {
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *out++ = c;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return out;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *out++ = '\\';
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *out++ = 'x';
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *out++ = makehexdigit(c>>4);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *out++ = makehexdigit(c);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return out;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char* typetostring(uint32_t type, char* out,
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          bool fullContext = true,
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          bool strict = false)
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    char* pos = out;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    char c[4];
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c[0] = (char)((type>>24)&0xFF);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c[1] = (char)((type>>16)&0xFF);
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c[2] = (char)((type>>8)&0xFF);
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c[3] = (char)(type&0xFF);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool valid;
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if( !strict ) {
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // now even less strict!
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // valid = isasciitype(c[3]);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        valid = true;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t i = 0;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bool zero = true;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (valid && i<3) {
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c[i] == 0) {
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!zero) valid = false;
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                zero = false;
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                //if (!isasciitype(c[i])) valid = false;
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            i++;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if all zeros, not a valid type code.
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (zero) valid = false;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        valid = isident(c[3]) ? true : false;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t i = 0;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bool zero = true;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (valid && i<3) {
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c[i] == 0) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!zero) valid = false;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                zero = false;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!isident(c[i])) valid = false;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            i++;
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if( valid && (!fullContext || c[0] != '0' || c[1] != 'x') ) {
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if( fullContext ) *pos++ = '\'';
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pos = appendcharornum(c[0], pos);
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pos = appendcharornum(c[1], pos);
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pos = appendcharornum(c[2], pos);
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pos = appendcharornum(c[3], pos);
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if( fullContext ) *pos++ = '\'';
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *pos = 0;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return pos;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
142c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if( fullContext ) {
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *pos++ = '0';
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *pos++ = 'x';
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return appendhexnum(type, pos);
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid printTypeCode(uint32_t typeCode, debugPrintFunc func, void* cookie)
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    char buffer[32];
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    char* end = typetostring(typeCode, buffer);
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *end = 0;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    func ? (*func)(cookie, buffer) : defaultPrintFunc(cookie, buffer);
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid printHexData(int32_t indent, const void *buf, size_t length,
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t bytesPerLine, int32_t singleLineBytesCutoff,
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t alignment, bool cStyle,
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    debugPrintFunc func, void* cookie)
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (alignment == 0) {
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (bytesPerLine >= 16) alignment = 4;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        else if (bytesPerLine >= 8) alignment = 2;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        else alignment = 1;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (func == NULL) func = defaultPrintFunc;
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t offset;
171c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    unsigned char *pos = (unsigned char *)buf;
173c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pos == NULL) {
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (singleLineBytesCutoff < 0) func(cookie, "\n");
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        func(cookie, "(NULL)");
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
179c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (length == 0) {
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (singleLineBytesCutoff < 0) func(cookie, "\n");
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        func(cookie, "(empty)");
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
185c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((int32_t)length < 0) {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (singleLineBytesCutoff < 0) func(cookie, "\n");
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        char buf[64];
1890ae8c14b4b915b318250484eff9a18700cd934c3Andrew Hsieh        sprintf(buf, "(bad length: %zu)", length);
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        func(cookie, buf);
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
193c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    char buffer[256];
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static const size_t maxBytesPerLine = (sizeof(buffer)-1-11-4)/(3+1);
196c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (bytesPerLine > maxBytesPerLine) bytesPerLine = maxBytesPerLine;
198c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool oneLine = (int32_t)length <= singleLineBytesCutoff;
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool newLine = false;
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (cStyle) {
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        indent++;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        func(cookie, "{\n");
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        newLine = true;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (!oneLine) {
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        func(cookie, "\n");
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        newLine = true;
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
209c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (offset = 0; ; offset += bytesPerLine, pos += bytesPerLine) {
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        long remain = length;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        char* c = buffer;
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!oneLine && !cStyle) {
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sprintf(c, "0x%08x: ", (int)offset);
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c += 12;
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        size_t index;
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        size_t word;
221c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (word = 0; word < bytesPerLine; ) {
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const size_t startIndex = word+(alignment-(alignment?1:0));
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (index = 0; index < alignment || (alignment == 0 && index < bytesPerLine); index++) {
227c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!cStyle) {
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (index == 0 && word > 0 && alignment > 0) {
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *c++ = ' ';
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
232c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (remain-- > 0) {
234c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin                        const unsigned char val = *(pos+startIndex-index);
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *c++ = makehexdigit(val>>4);
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *c++ = makehexdigit(val);
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    } else if (!oneLine) {
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *c++ = ' ';
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *c++ = ' ';
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (remain > 0) {
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        if (index == 0 && word > 0) {
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            *c++ = ',';
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            *c++ = ' ';
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        }
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        if (index == 0) {
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            *c++ = '0';
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            *c++ = 'x';
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        }
251c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin                        const unsigned char val = *(pos+startIndex-index);
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *c++ = makehexdigit(val>>4);
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        *c++ = makehexdigit(val);
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        remain--;
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
258c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            word += index;
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!cStyle) {
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            remain = length;
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *c++ = ' ';
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *c++ = '\'';
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (index = 0; index < bytesPerLine; index++) {
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (remain-- > 0) {
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    const unsigned char val = pos[index];
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *c++ = (val >= ' ' && val < 127) ? val : '.';
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (!oneLine) {
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    *c++ = ' ';
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
275c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *c++ = '\'';
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (length > bytesPerLine) *c++ = '\n';
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (remain > 0) *c++ = ',';
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *c++ = '\n';
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (newLine && indent) func(cookie, stringForIndent(indent));
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *c = 0;
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        func(cookie, buffer);
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        newLine = true;
287c2bf8e837ecf36639425fc3015cce078f6a08fb9Dan Austin
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (length <= bytesPerLine) break;
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        length -= bytesPerLine;
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (cStyle) {
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (indent > 0) func(cookie, stringForIndent(indent-1));
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        func(cookie, "};");
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
298b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Crossssize_t getBinderKernelReferences(size_t count, uintptr_t* buf) {
299b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross    sp<ProcessState> proc = ProcessState::selfOrNull();
300b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross    if (proc.get() == NULL) {
301b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross        return 0;
302b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross    }
303b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross
304b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross    return proc->getKernelReferences(count, buf);
305b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross}
306b869cc94704d1a3d6226f471984eb33ff1bac7d5Colin Cross
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
309