1/* 2 * layout_dump.c - 3 * 4 * Written by Eryk Vershen 5 */ 6 7/* 8 * Copyright 1996,1997 by Apple Computer, Inc. 9 * All Rights Reserved 10 * 11 * Permission to use, copy, modify, and distribute this software and 12 * its documentation for any purpose and without fee is hereby granted, 13 * provided that the above copyright notice appears in all copies and 14 * that both the copyright notice and this permission notice appear in 15 * supporting documentation. 16 * 17 * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 19 * FOR A PARTICULAR PURPOSE. 20 * 21 * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 22 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 23 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 24 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 25 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 26 */ 27 28// for printf() 29#include <stdio.h> 30// for strlen() 31#include <string.h> 32#include "layout_dump.h" 33 34 35/* 36 * Defines 37 */ 38 39 40/* 41 * Types 42 */ 43 44 45/* 46 * Global Constants 47 */ 48unsigned char bitmasks[] = { 49 0x01, 0x03, 0x07, 0x0F, 50 0x1F, 0x3F, 0x7F, 0xFF 51}; 52 53 54/* 55 * Global Variables 56 */ 57 58 59/* 60 * Forward declarations 61 */ 62 63 64/* 65 * Routines 66 */ 67void 68dump_using_layout(void *buffer, layout *desc) 69{ 70 layout *entry; 71 int byte_length; 72 long value; 73 int max_name; 74 int i; 75 76 max_name = 0; 77 for (entry = desc; entry->format != kEnd; entry++) { 78 value = strlen(entry->name); 79 if (value > max_name) { 80 max_name = value; 81 } 82 } 83 84 85 for (entry = desc; entry->format != kEnd; entry++) { 86 87 if (entry->format != kBit) { 88 printf("%*s: ", max_name, entry->name); 89 90 byte_length = entry->bit_length / 8; 91 92 if (entry->bit_offset != 0 || (entry->bit_length % 8) != 0) { 93 printf("entry %d, can't handle bitfields yet.\n", entry - desc); 94 continue; 95 } 96 97 value = 0; 98 for (i = entry->byte_offset; byte_length > 0;i++) { 99 value = value << 8; 100 value |= ((unsigned char *)buffer)[i]; 101 byte_length--; 102 } 103 } else { 104 if (entry->bit_offset < 0 || entry->bit_offset > 8) { 105 printf("entry %d, bad bit offset (%d).\n", entry - desc, entry->bit_offset); 106 continue; 107 } else if (entry->bit_length <= 0 108 || entry->bit_length > (entry->bit_offset + 1)) { 109 printf("entry %d, bad bit length (%d,%d).\n", entry - desc, 110 entry->bit_offset, entry->bit_length); 111 continue; 112 } 113 value = (((unsigned char *)buffer)[entry->byte_offset] 114 & bitmasks[entry->bit_offset]) 115 >> ((entry->bit_offset + 1) - entry->bit_length); 116 } 117 118 switch (entry->format) { 119 case kHex: 120 printf("0x%x\n", (unsigned int) value); 121 break; 122 case kDec: 123 byte_length = entry->bit_length / 8; 124 switch (byte_length) { 125 case 4: printf("%ld\n", (signed long)value); break; 126 case 2: printf("%d\n", (signed short)value); break; 127 case 1: printf("%d\n", (signed char)value); break; 128 } 129 break; 130 case kUns: 131 byte_length = entry->bit_length / 8; 132 switch (byte_length) { 133 case 4: printf("%lu\n", (unsigned long)value); break; 134 case 2: printf("%u\n", (unsigned short)value); break; 135 case 1: printf("%u\n", (unsigned char)value); break; 136 } 137 break; 138 case kBit: 139 if (value) { 140 printf("%*s %s\n", max_name, "", entry->name); 141 } 142 break; 143 default: 144 printf("entry %d, unknown format (%d).\n", entry - desc, entry->format); 145 break; 146 } 147 } 148} 149 150 151void 152DumpRawBuffer(unsigned char *bufferPtr, int length ) 153{ 154 register int i; 155 int lineStart; 156 int lineLength; 157 short c; 158 159#define kLineSize 16 160 for (lineStart = 0; lineStart < length; lineStart += lineLength) { 161 lineLength = kLineSize; 162 if (lineStart + lineLength > length) 163 lineLength = length - lineStart; 164 printf("%03x %3d:", lineStart, lineStart); 165 for (i = 0; i < lineLength; i++) 166 printf(" %02x", bufferPtr[lineStart + i] & 0xFF); 167 for (; i < kLineSize; i++) 168 printf(" "); 169 printf(" "); 170 for (i = 0; i < lineLength; i++) { 171 c = bufferPtr[lineStart + i] & 0xFF; 172 if (c > ' ' && c < '~') 173 printf("%c", c); 174 else { 175 printf("."); 176 } 177 } 178 printf("\n"); 179 } 180} 181