/* This program converts 2MASS .rds raw data files to .rdo 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 rds2rdo.c -ords2rdo
USAGE:  cat file.rds | rds2rdo > file.rdo
*/
#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 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++;
	reordby((char*)in_buffer);
//convert these to PC words and load in correct buffer
        if(buffer_toggle==0)
            {
            swab((char*)in_buffer,(char*)r_buffer,pixels4);
            for(i=0;i<pixels2;i++)
                r_buffer[i]=r_buffer[i]+l_buffer[i]-64;
            for(i=0;i<pixels2;i++)
                out_buffer[i]=r_buffer[i];
            for(i=pixels;i<pixels2;i++)
                out_buffer[i]=out_buffer[i]+out_buffer[i-pixels];
            buffer_toggle=1;
            }
        else 
            {
            swab((char*)in_buffer,(char*)l_buffer,pixels4);
            for(i=0;i<pixels2;i++)
                l_buffer[i]=l_buffer[i]+r_buffer[i]-64;
            for(i=0;i<pixels2;i++)
                out_buffer[i]=l_buffer[i];
            for(i=pixels;i<pixels2;i++)
                out_buffer[i]=out_buffer[i]+out_buffer[i-pixels];
            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;
}
