00001 // $Id: fast__dump_8c-example.html,v 1.2 2006/02/09 19:12:40 Daniel.May Exp $ 00002 // The fast_dump utility will dump a fast data stream to stdout. This utility is useful for debuging fast output 00003 // 00004 // Copyright (c), Pantor Engineering AB, 2005 00005 // All rights reserved. 00006 00007 00013 #include "common.h" 00014 #include "fastapi.h" 00015 00017 00018 static u32 field_array [128]; 00019 00020 00021 static u32 count_bits (u8* data, int size) 00022 { 00023 u32 count = 0; 00024 int p1, p2; 00025 00026 assert (size > 0); 00027 memset (field_array, 0, sizeof (field_array)); 00028 00029 for (p1 = 0 ; p1 < size ; p1 ++) 00030 { 00031 for (p2 = 0 ; p2 < 7 ; p2 ++) 00032 { 00033 if ((data [p1] & (0x40 >> p2)) != 0) 00034 { 00035 field_array [count ++] = p1 * 7 + p2; 00036 } 00037 } 00038 } 00039 return count; 00040 } 00041 00042 static u32 decode_u32 (u8* data, int size) 00043 { 00044 u32 temp = 0; 00045 int p1; 00046 00047 assert (size > 0); 00048 00049 for (p1 = 0 ; p1 < size ; p1 ++) 00050 { 00051 temp = (temp << 7) | data [p1]; 00052 } 00053 return temp; 00054 } 00055 00057 00058 static void dump_hex (u8* data, u32 size,FILE *out) 00059 { 00060 u32 p1; 00061 00062 assert (size > 0); 00063 00064 for (p1 = 0 ; p1 < size ; p1 ++) 00065 fprintf (out, " %02x", data [p1]); 00066 00067 /* print last byte again, with high bit set */ 00068 fprintf (out, " (%02x)", data [p1-1] | 0x80); 00069 fprintf (out, "%*s |", 20 - 3 * size - 5, ""); 00070 } 00071 00072 static void dump_pmap (u8* data, u32 size, u32 count, FILE *out) 00073 { 00074 dump_hex (data, size,out); 00075 fprintf (out, " -- [PMAP %u fields]\n", count); 00076 } 00077 00078 static void dump_data (u32 offset, u8* data, u32 size, int printable, FILE *out) 00079 { 00080 u32 temp = decode_u32 (data, size); 00081 00082 dump_hex (data, size,out); 00083 00084 fprintf (out, " %2u", field_array [offset]); 00085 00086 if (printable) 00087 { 00088 fprintf (out, " '%.*s'", size, data); 00089 fprintf (out, "%*s", 10 - size, ""); 00090 00091 if (size < 5) 00092 fprintf (out, " %u", temp); 00093 } 00094 else 00095 { 00096 fprintf (out, " "); 00097 fprintf (out, "%u", temp); 00098 } 00099 fprintf (out, "\n"); 00100 } 00101 00103 00104 static void dump_stream (FILE *in, FILE *out) 00105 { 00106 u32 stream_offset = 0; 00107 u32 field_offset = 0; 00108 u32 msg_offset = 0; 00109 00110 for (;;) 00111 { 00112 u8 data [128]; 00113 u32 size = 0; 00114 u32 printable = 1; 00115 u32 count = 0; 00116 00117 for (;;) 00118 { 00119 int chr = getc (in); 00120 00121 if (chr == EOF) 00122 goto eof_label; 00123 00124 stream_offset ++; 00125 00126 data [size ++] = chr & 0x7f; 00127 00128 printable = printable && isprint (chr & 0x7f); 00129 00130 if (chr >= 0x80) 00131 { 00132 if (count == 0) 00133 { 00134 msg_offset ++; 00135 00136 fprintf (out, "--------------+"); 00137 fprintf (out, "---------------------+"); 00138 fprintf (out, "-----------------\n"); 00139 00140 fprintf (out, "%8u %4u |", 00141 stream_offset - size, msg_offset); 00142 00143 count = count_bits (data, size); 00144 dump_pmap (data, size, count,out); 00145 00146 field_offset = 0; 00147 } 00148 else 00149 { 00150 fprintf (out, "%8u |", stream_offset - size); 00151 dump_data (field_offset ++, data, size, printable,out); 00152 } 00153 00154 if (field_offset >= count) 00155 break; 00156 00157 printable = 1; 00158 size = 0; 00159 } 00160 } 00161 } 00162 eof_label: 00163 fprintf (out, "\n"); 00164 return; 00165 } 00166 00168 00169 int main (int argc, char* argv []) 00170 { 00171 FILE *in,*out; 00172 init_platform_io (); 00173 00174 in = stdin; 00175 out = stdout; 00176 00177 for (;;) 00178 { 00179 int option = getopt (argc, argv, "?"); 00180 00181 if (option == EOF) 00182 break; 00183 00184 switch (option) 00185 { 00186 case '?': 00187 fprintf (stderr, "usage: fast_dump <infile>\n"); 00188 break; 00189 00190 default: 00191 fprintf (stderr, "error: unknown switch '%c'\n", option); 00192 exit (1); 00193 } 00194 } 00195 00196 dump_stream (in,out); 00197 exit (0); 00198 }