#include <stdio.h>
#include <string.h>

typedef struct {
      int fromNum;
      int toNum;
      char fromName[40];
      char toName[40];
      char unk3[40];
      char unk4[40];
      char unk5[40];
      char unk6[40];
      int unk7;
      int k1,k2,k3,k4;
      char subject[64];
      char unk11_null2[2];
      char date[40];
      int unk12;
      int unk13;
      char unk14[76];
      char unk15_nulls[12];
      char basename[8];
      int unk16;
      int msgLen;
      char unk18_nulls[96];

} __attribute((packed)) HEADER;

/* the __attribute commands keeps the compiler from padding stuff out to 
   a 4 byte boundry.  If using MSSVC++  try one of the /Z options */

void printHeader(HEADER* pHd);
void stripper(char* msg);

void main(int argc, char* argv[]) {

      HEADER hd;
      FILE *fpData = NULL, *fpBin = NULL;
      char baseName[9];
      char dataFile[13];
      char binFile[13];
      char *msg = NULL;
      int szMsg = 0;
           
      if(argc < 2) {
            printf("usage: vbbsparse <BASENAME>\n");
            return;
      }
      if(strlen(argv[1]) > 8) {
            printf("error BASENAME is more than 8 chars.\n");
            return;
      }
      
      dataFile[0] = binFile[0] = '\0';
      strcpy(baseName,argv[1]);

      strcat(dataFile,baseName);
      strcat(dataFile,".DAT");

      strcat(binFile,baseName);
      strcat(binFile,".BIN");


      fpData = fopen(dataFile,"rb");
      if(!fpData) {
            printf("error opening data file %s\n",dataFile);
            return;
      }

      fpBin = fopen(binFile,"rb");
      if(!fpBin) {
            printf("error opening bin file %s\n",binFile);
            return;
      }

      while(!feof(fpData)) {
            fread(&hd, sizeof(hd),1,fpData);
            printHeader(&hd);
            if(szMsg < hd.msgLen) {
                  if(msg != NULL) 
                        free(msg);
                  msg = malloc(sizeof(char)*(hd.msgLen+1));
                  szMsg = hd.msgLen;
            }
            fread(msg,1,hd.msgLen,fpBin);
            msg[hd.msgLen] = '\0';
            /* need to strip the high/low ascii chars out of this before printing */
            printf("--- message ---\n");
            stripper(msg);
            printf("%s\n",msg);
      }
      fclose(fpData);
      fclose(fpBin);
}

void printHeader(HEADER* pHd) {

      char tempStr[81];

      printf("--- HEADER ---\n");

      strncpy(tempStr,pHd->fromName,40);
      tempStr[40] = '\0';
      printf("   from: %s (%d)\n",tempStr, pHd->fromNum);

      strncpy(tempStr,pHd->toName,40);
      tempStr[40] = '\0';
      printf("     to: %s (%d)\n",tempStr, pHd->toNum);

      strncpy(tempStr,pHd->subject,64);
      tempStr[64] = '\0';
      printf("subject: %s\n",tempStr);

      strncpy(tempStr,pHd->date,40);
      tempStr[40] = '\0';
      printf("   date: %s\n",tempStr);

      strncpy(tempStr,pHd->basename,8);
      tempStr[8] = '\0';
      printf("baesname: %s\n",tempStr);
      printf("Message Len: %d\n", pHd->msgLen);

/*
      strncpy(tempStr,pHd->unk3,40);
      tempStr[40] = '\0';
      printf("unk3: %s\n",tempStr);

      strncpy(tempStr,pHd->unk4,40);
      tempStr[40] = '\0';
      printf("unk4: %s\n",tempStr);

      strncpy(tempStr,pHd->unk5,40);
      tempStr[40] = '\0';
      printf("unk5: %s\n",tempStr);

      strncpy(tempStr,pHd->unk6,40);
      tempStr[40] = '\0';
      printf("unk6: %s\n",tempStr);
      
      printf("unk7:%d, k1: %d, k2: %d, k3: %d, k4: %d\n",
            pHd->unk7, pHd->k1, pHd->k2, pHd->k3, pHd->k4);

      printf("unk12: %d, unk13: %d, unk16: %d\n",
            pHd->unk12, pHd->unk13, pHd->unk16);
*/

}

void stripper(char *msg) {

      char* p = msg;
      char* m = msg;

      while(*m != NULL) {
/*            printf("m: %X, p: %X\n",m,p); */
            if(*m != 0x03) {
                  *p =  *m;
                  m++;
                  p++;
            } else {
                  m += 2;
                  *p =  *m;
            }
      }
      *p = NULL;
}
