/*******************************************************************************
    OpenAirInterface 
    Copyright(c) 1999 - 2014 Eurecom

    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.


    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with OpenAirInterface.The full GNU General Public License is 
   included in this distribution in the file called "COPYING". If not, 
   see <http://www.gnu.org/licenses/>.

  Contact Information
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr
  
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE

 *******************************************************************************/
#ifdef USER_MODE

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

int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format) {

  FILE *fp;
  int i;
 
 
  printf("Writing %d elements of type %d to %s\n",length,format,fname);
  

   if (format == 10 || format ==11 || format == 12 )
   {
	   fp = fopen(fname,"a+");
   }
   else if (format != 10 && format !=11  && format != 12 ) 
   {
	   fp = fopen(fname,"w+");
       fprintf(fp,"%s = [",vname);
   }
  


  if (fp== NULL) {
    printf("[OPENAIR][FILE OUTPUT] Cannot open file %s\n",fname);
    return(-1);
  }

  
   
  switch (format) 
    {
    case 0:   // real 16-bit
      
      for (i=0;i<length;i+=dec) {
	fprintf(fp,"%d\n",((short *)data)[i]);
      }
      break;
      
    case 1:  // complex 16-bit
      
     
		for (i=0;i<length<<1;i+=(2*dec)) 
		{
			fprintf(fp,"%d + j*(%d)\n",((short *)data)[i],((short *)data)[i+1]);
			
		} 
      		

      break;
      
    case 2:  // real 32-bit
      for (i=0;i<length;i+=dec) {
	fprintf(fp,"%d\n",((int *)data)[i]);
      }
      break;
      
    case 3: // complex 32-bit
      for (i=0;i<length<<1;i+=(2*dec)) {
	fprintf(fp,"%d + j*(%d)\n",((int *)data)[i],((int *)data)[i+1]);
      }
      break;

    case 4: // real 8-bit
      for (i=0;i<length;i+=dec) {
	   fprintf(fp,"%d\n",((char *)data)[i]);
      }
      break;

    case 5: // complex 8-bit
      for (i=0;i<length<<1;i+=(2*dec)) {
	fprintf(fp,"%d + j*(%d)\n",((char *)data)[i],((char *)data)[i+1]);
      }
      break;

    case 6:  // real 64-bit
      for (i=0;i<length;i+=dec) {
	fprintf(fp,"%lld\n",((long long*)data)[i]);
      }
      break;

    case 7: // real double
      for (i=0;i<length;i+=dec) {
	fprintf(fp,"%g\n",((double *)data)[i]);
      }
      break;

    case 8: // complex double
      for (i=0;i<length<<1;i+=2*dec) {
	fprintf(fp,"%g + j*(%g)\n",((double *)data)[i], ((double *)data)[i+1]);
      }
      break;

    case 9: // real unsigned 8-bit
      for (i=0;i<length;i+=dec) {
	   fprintf(fp,"%d\n",((unsigned char *)data)[i]);
      }
      break;
      
      
     case 10 : // case eren 16 bit complex : 
       
       for (i=0;i<length<<1;i+=(2*dec)) 
		{

			if((i < 2*(length-1)) && (i > 0))
			fprintf(fp,"%d + j*(%d),",((short *)data)[i],((short *)data)[i+1]);
			else if ((i == 2*(length-1)))
			fprintf(fp,"%d + j*(%d);",((short *)data)[i],((short *)data)[i+1]);
			else if ((i == 0))
			fprintf(fp,"\n%d + j*(%d),",((short *)data)[i],((short *)data)[i+1]);
			
				
			
		}
	    break; 
      
     case 11 : //case eren 16 bit real for channel magnitudes:
		for (i=0;i<length;i+=dec) 
		{
 
			if((i <(length-1))&& (i > 0))
			fprintf(fp,"%d,",((short *)data)[i]);
			else if ((i == (length-1)))
			fprintf(fp,"%d;",((short *)data)[i]);
			else if (i == 0)
			fprintf(fp,"\n%d,",((short *)data)[i]);	
		}
		printf("\n erennnnnnnnnnnnnnn: length :%d",length);
      	break;
      	
     case 12 : // case eren for log2_maxh real unsigned 8 bit
	  fprintf(fp,"%d \n",((unsigned char *)&data)[0]);
	  break;
      	 
      	 
    }
  if (format != 10 && format !=11 && format !=12 )
  {	
	fprintf(fp,"];\n");
	fclose(fp);
	 return(0);
  }
  else if (format == 10 || format ==11 || format == 12 )
  {
	fclose(fp);  
	return(0);
  }
  return 0;
}

#endif // USER_MODE
