#include <unistd.h>
#include "uint32.h"
#include "fmt.h"
#include "buffer.h"
#include "strerr.h"

#define FATAL "cdbdump: fatal: "

void die_write(void)
{
  strerr_die2sys(111,FATAL,"unable to write output: ");
}
void put(char *buf,unsigned int len)
{
  if (buffer_put(buffer_1,buf,len) == -1) die_write();
}
void putflush(void)
{
  if (buffer_flush(buffer_1) == -1) die_write();
}

uint32 pos = 0;

void get(char *buf,unsigned int len)
{
  int r;
  while (len > 0) {
    r = buffer_get(buffer_0,buf,len);
    if (r == -1)
      strerr_die2sys(111,FATAL,"unable to read input: ");
    if (r == 0)
      strerr_die2x(111,FATAL,"unable to read input: truncated file");
    pos += r;
    buf += r;
    len -= r;
  }
}

char buf[512];

void copy(uint32 len)
{
  unsigned int x;

  while (len) {
    x = sizeof buf;
    if (len < x) x = len;
    get(buf,x);
    put(buf,x);
    len -= x;
  }
}

void getnum(uint32 *num)
{
  get(buf,4);
  uint32_unpack(buf,num);
}

char strnum[FMT_ULONG];

int main()
{
  uint32 eod;
  uint32 klen;
  uint32 dlen;

  getnum(&eod);
  while (pos < 2048) getnum(&dlen);

  while (pos < eod) {
    getnum(&klen);
    getnum(&dlen);
    put("+",1); put(strnum,fmt_ulong(strnum,klen));
    put(",",1); put(strnum,fmt_ulong(strnum,dlen));
    put(":",1); copy(klen);
    put("->",2); copy(dlen);
    put("\n",1);
  }

  put("\n",1);
  putflush();
  _exit(0);
}