cdbdump.c
changeset 0 eeadadee24f6
equal deleted inserted replaced
-1:000000000000 0:eeadadee24f6
       
     1 #include "uint32.h"
       
     2 #include "fmt.h"
       
     3 #include "buffer.h"
       
     4 #include "strerr.h"
       
     5 
       
     6 #define FATAL "cdbdump: fatal: "
       
     7 
       
     8 void die_write(void)
       
     9 {
       
    10   strerr_die2sys(111,FATAL,"unable to write output: ");
       
    11 }
       
    12 void put(char *buf,unsigned int len)
       
    13 {
       
    14   if (buffer_put(buffer_1,buf,len) == -1) die_write();
       
    15 }
       
    16 void putflush(void)
       
    17 {
       
    18   if (buffer_flush(buffer_1) == -1) die_write();
       
    19 }
       
    20 
       
    21 uint32 pos = 0;
       
    22 
       
    23 void get(char *buf,unsigned int len)
       
    24 {
       
    25   int r;
       
    26   while (len > 0) {
       
    27     r = buffer_get(buffer_0,buf,len);
       
    28     if (r == -1)
       
    29       strerr_die2sys(111,FATAL,"unable to read input: ");
       
    30     if (r == 0)
       
    31       strerr_die2x(111,FATAL,"unable to read input: truncated file");
       
    32     pos += r;
       
    33     buf += r;
       
    34     len -= r;
       
    35   }
       
    36 }
       
    37 
       
    38 char buf[512];
       
    39 
       
    40 void copy(uint32 len)
       
    41 {
       
    42   unsigned int x;
       
    43 
       
    44   while (len) {
       
    45     x = sizeof buf;
       
    46     if (len < x) x = len;
       
    47     get(buf,x);
       
    48     put(buf,x);
       
    49     len -= x;
       
    50   }
       
    51 }
       
    52 
       
    53 void getnum(uint32 *num)
       
    54 {
       
    55   get(buf,4);
       
    56   uint32_unpack(buf,num);
       
    57 }
       
    58 
       
    59 char strnum[FMT_ULONG];
       
    60 
       
    61 main()
       
    62 {
       
    63   uint32 eod;
       
    64   uint32 klen;
       
    65   uint32 dlen;
       
    66 
       
    67   getnum(&eod);
       
    68   while (pos < 2048) getnum(&dlen);
       
    69 
       
    70   while (pos < eod) {
       
    71     getnum(&klen);
       
    72     getnum(&dlen);
       
    73     put("+",1); put(strnum,fmt_ulong(strnum,klen));
       
    74     put(",",1); put(strnum,fmt_ulong(strnum,dlen));
       
    75     put(":",1); copy(klen);
       
    76     put("->",2); copy(dlen);
       
    77     put("\n",1);
       
    78   }
       
    79 
       
    80   put("\n",1);
       
    81   putflush();
       
    82   _exit(0);
       
    83 }