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