/*
 * todocnv.c		Kazuya 'Sharl' Masuda <sharl@hauN.org>
 *
 * v0.4 内容の CRLF を SPACE に変換
 * v0.3 UNIX でもだいじょうぶ
 * v0.2 シークレット情報追加
 * v0.1 削除済みフラグ追加
 * v0.0 とりあえず作る
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

/* size 16 */
typedef struct {
  unsigned long endmark;	/* チェック用? */
  unsigned long offset;		/* データファイル先頭からのオフセット */
  unsigned long startmark;	/* チェック用? */
  unsigned long dummy;		/* わからん */
} INDEX;

/* size 37 */
typedef struct {
  unsigned char startmark[4];	/* チェック用? */
  unsigned char dummy[3];	/* なんだこれ? */
  unsigned char endmark[4];	/* チェック用? */
  unsigned char date[16];	/* 期限日、記入日が連続して入ってる */
  unsigned char delete;		/* 削除マーク */
  unsigned char rank;		/* ランク */
  unsigned char secret;		/* シークレット */
  unsigned char moto;		/* 依頼元文字列長 */
  unsigned char saki;		/* 依頼先文字列長 */
  unsigned char content[3];	/* 内容文字列長 content[1] だけ必要 */
  unsigned char end[2];		/* 終端? */
} DATA;

#define IDXFILE	"todo.idx"
#define DATFILE	"todo.dat"

#ifdef MSDOS
#define ENDIAN(x) (x)
#else
#define ENDIAN(x) ((x << 24) | ((x << 8) & 0xFF0000) | ((x >> 8) & 0xFF00) | ((x >> 24) & 0xFF))
#endif

char *progname;
INDEX idx;
DATA data;
unsigned char buf[256];
unsigned char strbuf[255 * 3 + 1];
int delete = 0;
unsigned long del_offset;

int debug = 0;

/****************************************
****************************************/
int
main(int argc, char *argv[])
{
  FILE *ifp, *dfp;
  unsigned long startmark, endmark;

  progname = argv[0];

  if (argc != 1)
    debug = 1;

  if (sizeof(INDEX) != 16) {
    fprintf(stderr, "%s: INDEX is %d\n", progname, sizeof(INDEX));
    return EXIT_FAILURE;
  }

  if (sizeof(DATA) != 37) {
    fprintf(stderr, "%s: DATA is %d\n", progname, sizeof(DATA));
    return EXIT_FAILURE;
  }

  if ((ifp = fopen(IDXFILE, "rb")) == NULL) {
    perror(IDXFILE);
    return EXIT_FAILURE;
  }
  if ((dfp = fopen(DATFILE, "rb")) == NULL) {
    perror(DATFILE);
    return EXIT_FAILURE;
  }

  /* header read */
  fread(&idx, sizeof(INDEX), 1, ifp);

  for (;;) {
    int rdlen;

    /**/
    rdlen = fread(&idx, sizeof(INDEX), 1, ifp);
    if (rdlen == 0)
      break;
    if (rdlen != 1) {
      fprintf(stderr, "%s: index read error\n", progname);
      return EXIT_FAILURE;
    }

    fseek(dfp, ENDIAN(idx.offset), SEEK_SET);
    fread(&data, sizeof(DATA), 1, dfp);
    fread(strbuf, data.moto + data.saki + data.content[1], 1, dfp);

    memcpy(&startmark, data.startmark, sizeof(unsigned long));
    memcpy(&endmark, data.endmark, sizeof(unsigned long));

    if (idx.startmark != startmark && idx.endmark != endmark) {
      fprintf(stderr, "%s: data mismath\n", progname);
      return EXIT_FAILURE;
    }
    
    /* data.dummy 表示 */
    if (debug) {
      printf("[%02x][%02x][%02x],",
	     data.dummy[0],
	     data.dummy[1], 
	     data.dummy[2] /* 更新回数かな? */);
    }

    /* 削除フラグ、記入日、期限日表示 */
    memcpy(buf, data.date, 16);
    buf[16] = 0;
    {
      int limy, limm, limd;
      int inpy, inpm, inpd;
      sscanf(buf, "%4d%2d%2d%4d%2d%2d",
	     &limy, &limm, &limd, &inpy, &inpm, &inpd);
      printf("%c,\"%4d/%02d/%02d\",\"%4d/%02d/%02d\",",
	     data.delete, inpy, inpm, inpd, limy, limm, limd);
    }

    /* ランク表示 */
    printf("\"%c\",", data.rank);
    if (debug)
      printf("[%c],", data.secret);

    /* 依頼元表示 */
    memcpy(buf, strbuf, data.moto);
    buf[data.moto] = 0;
    printf("\"%s\",", buf);
    
    /* 依頼先表示 */
    memcpy(buf, strbuf + data.moto, data.saki);
    buf[data.saki] = 0;
    printf("\"%s\",", buf);

    /* 内容表示 */
    memcpy(buf, strbuf + data.moto + data.saki, data.content[1]);
    buf[data.content[1]] = 0;
    {
      unsigned char *p;

      for (p = buf; *p; p++)
	if (*p == 0x0D || *p == 0x0A)
	  *p = ' ';
    }
    printf("\"%s\"\n", buf);

  }
  
  fclose(dfp);
  fclose(ifp);
  
  return EXIT_SUCCESS;
}
