#include <stdio.h>
#include <string.h>
#include <math.h>
#include "mex.h"

FILE *fIn;

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    char *FileName;
    char GetString[200], test[20];
    int   l=1, FileNameLength, epochs, satnum, i,  k, j,satmatrix[35000][12]={0},   datenmatrix[35000][12]={0},ausmatrix[35000][32]={0} ;
    float T_SAMP,  START_TIME, zwischen;
    double data[]={0};
    
    mxArray *mlDouble;
    
    FileNameLength = (mxGetM(prhs[0])*mxGetN(prhs[0]))+1;
    FileName =(char *)mxCalloc(FileNameLength, sizeof(char));
    mxGetString(prhs[0], FileName, FileNameLength);
    /* Try to open file. */
    
    fIn = fopen(FileName, "r");
    if (fIn==NULL)
        mexErrMsgTxt("Could not open file.");
    
    /* Check for valid RINEX file.*/
    
    fgets(GetString, 82, fIn);
    
    if(strstr(GetString, "COMPACT") == 0) {
        printf("\n%s", GetString);
        mexErrMsgTxt("Invalid TEQC-Format.");
    }
    /* Header einlesen */
    while (l=1) {
        
        fgets(GetString, 200, fIn);
        if(GetString[0]==84)   /*wenn mit T startet*/
        { sscanf(GetString, "%s %f", test, &T_SAMP);
        /*  printf("%f \n", T_SAMP);    */}
        if(GetString[1]==84)   /*wenn mit T startet*/
        { sscanf(GetString, "%s %f", test, &START_TIME);
       /*   printf("%f \n", START_TIME);  * /
          /*  Look for the 2st 'T' in 'END OF HEADER' */
          break;}
    }
    /* Output T_SAMP.*/
    data[0]=T_SAMP;
    mlDouble = mxCreateDoubleMatrix(1, 1, mxREAL);
    memcpy(mxGetPr(mlDouble), data, sizeof(data));
    plhs[0]=mlDouble;
    
    data[0]=START_TIME;
    mlDouble = mxCreateDoubleMatrix(1, 1, mxREAL);
    memcpy(mxGetPr(mlDouble), data, sizeof(data));
    plhs[1]=mlDouble;
    
    /* Daten einlesen */
    epochs=0;
   /* printf("\n%s", GetString);*/
    
    while (fgets(GetString, 200, fIn)) {
        sscanf(GetString, "%i", &satnum);
        
        for(i=0;i<satnum;i++)
        { satmatrix[epochs][i]=atoi(&GetString[3*(1+i)]);
           /*  printf(" %i\n", satmatrix[i][epochs]);*/}
        fgets(GetString, 200, fIn);
        
        for(i=0;i<satnum;i++)
        { zwischen=atof(&GetString[10*i]);
            datenmatrix[epochs][i]=(int)(zwischen*1000);}
             /* printf("%f\n", datenmatrix[i][epochs]);*/
        
        epochs++;
    }
    
    fclose(fIn);
    /* ausgabemetrix schreiben*/
    for (k=0;k<epochs;k++)
    {  j=0;
       for (i=1;i<=32;i++)
        {if (satmatrix[k][j]==i)
         {ausmatrix[k][i-1]=(datenmatrix[k][j]);
          j++;
         }
        }
    }
      
    data[0]=epochs;
    mlDouble = mxCreateDoubleMatrix(1, 1, mxREAL);
    memcpy(mxGetPr(mlDouble), data, sizeof(data));
    plhs[2]=mlDouble;
  /*  
    mlDouble = mxCreateDoubleMatrix(16,epochs, mxREAL);
    memcpy(mxGetPr(mlDouble), satmatrix, epochs*16*sizeof(double));
    plhs[3]=mlDouble;
 
    mlDouble = mxCreateDoubleMatrix(16,epochs, mxREAL);
    memcpy(mxGetPr(mlDouble), datenmatrix, epochs*16*sizeof(double));
    plhs[4]=mlDouble;
   */
    mlDouble = mxCreateNumericMatrix(32,epochs,mxINT32_CLASS,mxREAL);
    memcpy(mxGetPr(mlDouble), ausmatrix,32*epochs*sizeof(mxINT32_CLASS));
    plhs[3]=mlDouble;
}