fast_dump.c

FIX Adapted for STreaming API dump utility

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 }

Generated on Thu Feb 9 13:11:32 2006 for fastapi by doxygen 1.4.6-NO    FAST ProtocolSM