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