/*
*************************************************************
*                                                           *
*  WOODS HOLE OCEANOGRAPHIC INSTITUTION                     *
*  UPPER OCEAN PROCESSES GROUP                              *
*  PHYSICAL OCEANOGRAPHY DEPT.                              *
*  WOODS HOLE, MASSACHUSETTS USA  02543                     *
*                                                           *
*  File: vmcm2swab.c            Model: -                    *
*                                                           *
*  Function: VMCM2 binary data file byte swapper
*           34 byte records - Ver2.5x
*           for FLASH cards directly read to file
*           *** NOT FOR XMODEM-DUMPED FILES ***
*                                                           *
*  Project: VMCM2                                           *
*                                                           *
*  Programmer: G.A.                                         *
*                                                           *
*  Copyright (c) 2002 Woods Hole Oceanographic Institution  *
*                                                           *
*************************************************************
 
*/

/* Additional reserved words not recognized by Source Print.
   <e> uchar
*/

/*
*   Program to do two-byte and four-byte swapping on an input
*   file and produce a binary output file.  Must match VMCM2
*   data format...
*
*   This program was designed to run on a 
*   binary .dat file before producing ascii files using
*   "vm2asc" in the PC environment.
*
*   Usage:   vm2swab inputfile outputfile
*/

#include <stdio.h>
#include <stdlib.h>

main(argc,argv)
int argc;
char *argv[];
{
   int ret;
   unsigned long i;
   int j;
   char buff[4];
   FILE *fd1,*fd2;

   if (argc < 3)
      {
      printf("Usage: vm2swab inputfile outputfile\n");
      exit(-1);
      }

   /* handle input file */
   fd1 = fopen(argv[1],"rb");
   if ( fd1 == NULL )
      {
      printf("Usage: vm2swab inputfile outputfile\n");
      exit(-1);
      }

   /* handle output file */
   fd2 = fopen(argv[2],"wb");
   if ( fd2 == NULL )
      {
      printf("Usage: vm2swab inputfile outputfile\n");
      exit(-1);
      }

   /* throw away the first 128k bytes (reserved space in FLASH) */
   /* REMOVE THIS LOOP IF YOUR RAW DATA FILE WAS CREATED BY XMODEM DUMP */
   for (j=0; j < 0x20000; j++)
     {
       /* get bytes */
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            goto end;
     }

   /* main loop begins at start of records @ 20000H in FLASH memory */
   while(1)
      {
      /* first 7 bytes are time stuff - only swap last 2 bytes (year) */
      for (j=0; j<5; j++)
         {
         /* read a character */
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            goto end;

         /* write the character */
         fwrite(&buff[0],sizeof(char),1,fd2);
         }

      /* swap year bytes */
      ret = fread(&buff[1],sizeof(char),1,fd1);
      if ( ret != 1 )
         break;
      ret = fread(&buff[0],sizeof(char),1,fd1);
      if ( ret != 1 )
         break;

      /* write bytes in 1,2 order */
      fwrite(&buff[0],sizeof(char),1,fd2);
      fwrite(&buff[1],sizeof(char),1,fd2);

      /* next byte is muxed parameter number - read a character */
      ret = fread(&buff[0],sizeof(char),1,fd1);
      if ( ret != 1 )
         goto end;

      /* write the character */
      fwrite(&buff[0],sizeof(char),1,fd2);

      /* next 10 bytes are short int - swap 2 on 5 shorts;  get bytes in 2,1 order */
      for (j=0; j<5; j++)
         {
         ret = fread(&buff[1],sizeof(char),1,fd1);
         if ( ret != 1 )
            break;
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            break;

         /* write bytes in 1,2 order */
         fwrite(&buff[0],sizeof(char),1,fd2);
         fwrite(&buff[1],sizeof(char),1,fd2);
         }

      /* next 2 bytes are char - don't swap */
      for (j=0; j<2; j++)
         {
         /* read a character */
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            goto end;

         /* write the character */
         fwrite(&buff[0],sizeof(char),1,fd2);
         }

      /* next 2 bytes are short int - swap 2 on 1 shorts;  get bytes in 2,1 order */
      for (j=0; j<1; j++)
         {
         ret = fread(&buff[1],sizeof(char),1,fd1);
         if ( ret != 1 )
            break;
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            break;

         /* write bytes in 1,2 order */
         fwrite(&buff[0],sizeof(char),1,fd2);
         fwrite(&buff[1],sizeof(char),1,fd2);
         }

      /* next 4 bytes are little-endian float (res_therm) - don't swap */
      for (j=0; j<4; j++)
         {
         /* read a character */
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            goto end;

         /* write the character */
         fwrite(&buff[0],sizeof(char),1,fd2);
         }

      /* next 4 bytes are little-endian float (opt_parm) - don't swap */
      for (j=0; j<4; j++)
         {
         /* read a character */
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            goto end;

         /* write the character */
         fwrite(&buff[0],sizeof(char),1,fd2);
         }

      /* last 4 bytes are unsigned short int - swap 2 on 2 shorts;  get bytes in 2,1 order */
      for (j=0; j<2; j++)
         {
         ret = fread(&buff[1],sizeof(char),1,fd1);
         if ( ret != 1 )
            break;
         ret = fread(&buff[0],sizeof(char),1,fd1);
         if ( ret != 1 )
            break;

         /* write bytes in 1,2 order */
         fwrite(&buff[0],sizeof(char),1,fd2);
         fwrite(&buff[1],sizeof(char),1,fd2);
         }
      /* bump record swap counter */
      i++;
      }

end:
   printf("Number of records swapped: %5lu\n",i);
   fclose(fd1);
   fclose(fd2);
}
