/* This program converts 2MASS .rdo raw data files to .rds raw data files. 
The .rds format data allows a higher degree of gzip compression and is therefore 
useful for data storage. The .rdo format is more directly mapped to the nicmos 
array structure.  There is no loss of information and the rdo <-> rds conversion is 
exactly reversable.  R. Stiening September 15, 2005
COMPILE SCRIPT: gcc rdo2rds.c -ordo2rds
USAGE:  cat file.rdo | rdo2rds > file.rds
*/
#include <stdio.h>

#define pixels   65536
#define pixels2 131072
#define pixels4 262144
#define EOF (-1)

unsigned short int  in_buffer[pixels2];
unsigned short int out_buffer[pixels2];
unsigned short int   r_buffer[pixels2];
unsigned short int   l_buffer[pixels2];

int buffer_toggle=0;
int frames=0;
int true=1;
int i;
int iindx,jindx;
int size_read;
int size_writ;
void reordby();

main(void)
{
       for(i=0;i<2*pixels;i++) 
                {
                r_buffer[i]=0;
                l_buffer[i]=0;
                in_buffer[i]=0;
                out_buffer[i]=0;
                }
        buffer_toggle=0;
	while(true)
        {
	size_read=fread(in_buffer,1,sizeof(in_buffer),stdin);
	if(size_read != sizeof(in_buffer)) break;
	frames++;
                if(buffer_toggle == 0) {
                  for(iindx=0,jindx=pixels;iindx < pixels; iindx++,jindx++) {
                    r_buffer[iindx]=in_buffer[iindx];
                    r_buffer[jindx]=in_buffer[jindx]-in_buffer[iindx];
                  }
                  for(iindx=0;iindx<pixels2;iindx++)
                   l_buffer[iindx]=r_buffer[iindx]-l_buffer[iindx]+64;
                  swab((char*)l_buffer,(char*)out_buffer,pixels4);
                  reordby((char*)out_buffer);
                  buffer_toggle = 1;
                  }
                else {
                  for(iindx=0,jindx=pixels;iindx < pixels; iindx++,jindx++) {
                    l_buffer[iindx]=in_buffer[iindx];
                    l_buffer[jindx]=in_buffer[jindx]-in_buffer[iindx];
                  }
                  for(iindx=0;iindx<pixels2;iindx++)
                    r_buffer[iindx]=l_buffer[iindx]-r_buffer[iindx]+64;
                  swab((char*)r_buffer,(char*)out_buffer,pixels4);
                  reordby((char*)out_buffer);
                  buffer_toggle = 0;
                  }
        size_writ = fwrite(out_buffer,2,pixels2,stdout);
	}
}

void reordby(b)
char *b;
{
        int rei;
        char bbb;
        for(rei=0; rei < pixels2; rei +=2)
               {
                bbb =   b[rei];
                b[rei]= b[rei+ pixels2 + 1];
                b[rei + 2*pixels + 1] = bbb;
               }
        return;
}
