/* ************************************************************* * * * WOODS HOLE OCEANOGRAPHIC INSTITUTION * * UPPER OCEAN PROCESSES GROUP * * PHYSICAL OCEANOGRAPHY DEPT. * * WOODS HOLE, MASSACHUSETTS USA 02543 * * * * File: vwndswab.c Model: - * * * * Function: VOS WND binary data file byte swapper * * * Project: VOS * * * * Programmer: G.A. * * * * Copyright (c) 1998 Woods Hole Oceanographic Institution * * * ************************************************************* */ /* Additional reserved words not recognized by Source Print. uchar */ /* * Program to do two-byte (short) and four-byte (long) swapping on * a VOS C51 binary input file and produce a binary output file. * Must match VOS WND data format... * * This program was designed to run on a * binary MET file before producing ascii files using * "vwndasc" in the PC environment. * * Usage: vwndswab inputfile outputfile */ #include #include main(int argc,char *argv[]) { int ret; int j; char buff[4]; FILE *fd1,*fd2; if (argc < 3) { printf("Usage: vwndswab inputfile outputfile\n"); exit(-1); } /* handle input file */ fd1 = fopen(argv[1],"rb"); if ( fd1 == NULL ) { printf("Usage: vwndswab inputfile outputfile\n"); exit(-1); } /* handle output file */ fd2 = fopen(argv[2],"wb"); if ( fd2 == NULL ) { printf("Usage: vwndswab inputfile outputfile\n"); exit(-1); } /* main loop */ while(1) { /* first 8 bytes are time stuff - only swap last 2 bytes (year) */ for (j=0; j<6; 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 240 bytes are short int - swap 2 on 120 shorts; get bytes in 2,1 order */ for (j=0; j<120; 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 120 bytes are unsigned char - don't swap */ for (j=0; j<120; 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 240 bytes are unsigned short - swap 2 on 120 shorts; get bytes in 2,1 order */ for (j=0; j<120; 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 120 bytes are char - don't swap */ for (j=0; j<120; 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 8 bytes are unsigned char - don't swap */ for (j=0; j<8; 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 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); } } end: fclose(fd1); fclose(fd2); }