//Written By Michael Gibson
//for Gibson Digital Enterprises
//(c) 2010
// under GPL 2
// spread sheet reader for testing
// for reading gss 1.0 files

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

int cell_width=1;
char value[32][32][32];
char valueo[32][32][32];
long valuel[32][32];

char filename[50];
//////////////////////////////
//////////////////////////////
void read_data(void){

int equ_type;

float sum_total=0.00;
float avg_total=0.00;
float max=0.00;
float min=9999999.99;

int celltotal=0;
int sum_type=0;
int start_col=0;
int end_col=0;
int start_row=0;
int end_row=0;

int xloop=0;
int yloop=0;

char * pEnd;
int dp=0; //decimal point
char vercheck[24];
char infodata[24];
char reada[24];
int  readb;
int  readc;
int  readd;
int  reade;
char readf[24];
FILE *fp;

fp=fopen(filename,"r");
fscanf(fp,"%s",vercheck);
printf("Version %s\n",vercheck);
fscanf(fp,"%s",infodata);

do{
fscanf(fp,"%s",reada);
fscanf(fp,"%d",&readb);
fscanf(fp,"%d",&readc);
fscanf(fp,"%d",&readd);
fscanf(fp,"%d",&reade);
fscanf(fp,"%s",readf);

if(strcmp(reada,"ssp")==0){
 dp=readb;  //decimal point
 cell_width=readc;
}

if(strcmp(reada,"des")==0){
  //for ts, rem out when not needed
  //printf("%s %d %d %d %d %s\n",reada,readb,readc,readd,reade,readf);
  strcpy(value[readb][readc],readf);
  strcpy(valueo[readb][readc],readf);

  if(readf[0]=='='){        //equation
    if(readf[1]=='s'||readf[1]=='a'||readf[1]=='m'||readf[1]=='c'){      //cou,sum,avg,max,min example: =sum(a1:a5) =avg(a1:a5)

      if(readf[1]=='s' && readf[2]=='u') equ_type=1; //sum
      if(readf[1]=='a' && readf[2]=='v') equ_type=2; //average
      if(readf[1]=='m' && readf[2]=='a') equ_type=3; //max
      if(readf[1]=='m' && readf[2]=='i') equ_type=4; //min
      if(readf[1]=='c' && readf[2]=='o') equ_type=5; //count

      if(readf[5]=='a') start_col=0;
      if(readf[5]=='b') start_col=1;
      if(readf[5]=='c') start_col=2;
      if(readf[5]=='d') start_col=3;
      if(readf[5]=='e') start_col=4;
      if(readf[5]=='f') start_col=5;
      if(readf[5]=='g') start_col=6;
      if(readf[5]=='h') start_col=7;
      if(readf[5]=='i') start_col=8;
      if(readf[5]=='j') start_col=9;
      if(readf[5]=='k') start_col=10;
      if(readf[5]=='l') start_col=11;
      if(readf[5]=='m') start_col=12;
      if(readf[5]=='n') start_col=13;
      if(readf[5]=='o') start_col=14;

      if(readf[6]=='0') start_row=0;
      if(readf[6]=='1') start_row=1;
      if(readf[6]=='2') start_row=2;
      if(readf[6]=='3') start_row=3;
      if(readf[6]=='4') start_row=4;
      if(readf[6]=='5') start_row=5;
      if(readf[6]=='6') start_row=6;
      if(readf[6]=='7') start_row=7;
      if(readf[6]=='8') start_row=8;
      if(readf[6]=='9') start_row=9;

      if(readf[7]==',') sum_type=0; // two numbers
      if(readf[7]==':') sum_type=1; // multiple numbers

      if(readf[8]=='a') end_col=0;
      if(readf[8]=='b') end_col=1;
      if(readf[8]=='c') end_col=2;
      if(readf[8]=='d') end_col=3;
      if(readf[8]=='e') end_col=4;
      if(readf[8]=='f') end_col=5;
      if(readf[8]=='g') end_col=6;
      if(readf[8]=='h') end_col=7;
      if(readf[8]=='i') end_col=8;
      if(readf[8]=='j') end_col=9;
      if(readf[8]=='k') end_col=10;
      if(readf[8]=='l') end_col=11;
      if(readf[8]=='m') end_col=12;
      if(readf[8]=='n') end_col=13;
      if(readf[8]=='o') end_col=14;
      if(readf[8]=='p') end_col=15;
      if(readf[8]=='q') end_col=16;
      if(readf[8]=='r') end_col=17;
      if(readf[8]=='s') end_col=18;
      if(readf[8]=='t') end_col=19;
      if(readf[8]=='u') end_col=20;
      if(readf[8]=='v') end_col=21;
      if(readf[8]=='w') end_col=22;
      if(readf[8]=='x') end_col=23;
      if(readf[8]=='y') end_col=24;
      if(readf[8]=='z') end_col=25;

      if(readf[9]=='0') end_row=0;
      if(readf[9]=='1' && readf[10] ==')' ) end_row=1;
      if(readf[9]=='2' && readf[10] ==')' ) end_row=2;
      if(readf[9]=='3') end_row=3;
      if(readf[9]=='4') end_row=4;
      if(readf[9]=='5') end_row=5;
      if(readf[9]=='6') end_row=6;
      if(readf[9]=='7') end_row=7;
      if(readf[9]=='8') end_row=8;
      if(readf[9]=='9') end_row=9;
      if(readf[9]=='1' && readf[10]=='0') end_row=10;
      if(readf[9]=='1' && readf[10]=='1') end_row=11;
      if(readf[9]=='1' && readf[10]=='2') end_row=12;
      if(readf[9]=='1' && readf[10]=='3') end_row=13;
      if(readf[9]=='1' && readf[10]=='4') end_row=14;
      if(readf[9]=='1' && readf[10]=='5') end_row=15;
      if(readf[9]=='1' && readf[10]=='6') end_row=16;
      if(readf[9]=='1' && readf[10]=='7') end_row=17;
      if(readf[9]=='1' && readf[10]=='8') end_row=18;
      if(readf[9]=='1' && readf[10]=='9') end_row=19;
      if(readf[9]=='2' && readf[10]=='0') end_row=20;
      if(readf[9]=='2' && readf[10]=='1') end_row=21;
      if(readf[9]=='2' && readf[10]=='2') end_row=22;
      if(readf[9]=='2' && readf[10]=='3') end_row=23;
      if(readf[9]=='2' && readf[10]=='4') end_row=24;
      if(readf[9]=='2' && readf[10]=='5') end_row=25;
      if(readf[9]=='2' && readf[10]=='6') end_row=26;
      if(readf[9]=='2' && readf[10]=='7') end_row=27;
      if(readf[9]=='2' && readf[10]=='8') end_row=28;
      if(readf[9]=='2' && readf[10]=='9') end_row=29;

      //count of multiple values
      if(sum_type==1 && equ_type==5){
         for(xloop=start_col;xloop<=end_col;xloop++){
            for(yloop=start_row;yloop<=end_row;yloop++){
               if(valuel[xloop][yloop]>=.01)sum_total++;
            }
         }
         sprintf(readf,"%7.0f",sum_total);
         strcpy(value[readb][readc],readf);
         sum_total=0.00;
      }



      //sum of two values
      if(sum_type==0 && equ_type==1){
         sum_total= valuel[start_col][start_row] + valuel[end_col][end_row];
         if(dp==0)sprintf(readf,"%7.0f",sum_total);
         if(dp==1)sprintf(readf,"%7.1f",sum_total);
         if(dp==2)sprintf(readf,"%7.2f",sum_total);
         if(dp==3)sprintf(readf,"%7.3f",sum_total);
         if(dp==4)sprintf(readf,"%7.4f",sum_total);
         if(dp==5)sprintf(readf,"%7.5f",sum_total);
         strcpy(value[readb][readc],readf);
         sum_total=0.00;
      }

      //sum of multiple values
      if(sum_type==1 && equ_type==1){
         for(xloop=start_col;xloop<=end_col;xloop++){
            for(yloop=start_row;yloop<=end_row;yloop++){
               sum_total= valuel[xloop][yloop]+sum_total;
            }
         }
         if(dp==0)sprintf(readf,"%7.0f",sum_total);
         if(dp==1)sprintf(readf,"%7.1f",sum_total);
         if(dp==2)sprintf(readf,"%7.2f",sum_total);
         if(dp==3)sprintf(readf,"%7.3f",sum_total);
         if(dp==4)sprintf(readf,"%7.4f",sum_total);
         if(dp==5)sprintf(readf,"%7.5f",sum_total);
         strcpy(value[readb][readc],readf);
         sum_total=0.00;
      }

      //average of multiple values
      if(sum_type==1 && equ_type==2){
         for(xloop=start_col;xloop<=end_col;xloop++){
            for(yloop=start_row;yloop<=end_row;yloop++){
               sum_total= valuel[xloop][yloop]+sum_total;
               if(valuel[xloop][yloop]>=.01)celltotal++;
            }
         }
         avg_total=sum_total/celltotal;
         if(dp==0)sprintf(readf,"%7.0f",avg_total);
         if(dp==1)sprintf(readf,"%7.1f",avg_total);
         if(dp==2)sprintf(readf,"%7.2f",avg_total);
         if(dp==3)sprintf(readf,"%7.3f",avg_total);
         if(dp==4)sprintf(readf,"%7.4f",avg_total);
         if(dp==5)sprintf(readf,"%7.5f",avg_total);
         strcpy(value[readb][readc],readf);
         avg_total=0.00;
         sum_total=0.00;
      }

      //largest of multiple values
      if(sum_type==1 && equ_type==3){
         for(xloop=start_col;xloop<=end_col;xloop++){
            for(yloop=start_row;yloop<=end_row;yloop++){
               if(valuel[xloop][yloop]>=max)max=valuel[xloop][yloop];
            }
         }
         if(dp==0)sprintf(readf,"%7.0f",max);
         if(dp==1)sprintf(readf,"%7.1f",max);
         if(dp==2)sprintf(readf,"%7.2f",max);
         if(dp==3)sprintf(readf,"%7.3f",max);
         if(dp==4)sprintf(readf,"%7.4f",max);
         if(dp==5)sprintf(readf,"%7.5f",max);
         strcpy(value[readb][readc],readf);
         max=0.00;
      }

      //smallest of multiple values
      if(sum_type==1 && equ_type==4){
         for(xloop=start_col;xloop<=end_col;xloop++){
            for(yloop=start_row;yloop<=end_row;yloop++){
               if(valuel[xloop][yloop]<=min && valuel[xloop][yloop]>=.00001)min=valuel[xloop][yloop];
            }
         }
         if(dp==0)sprintf(readf,"%7.0f",min);
         if(dp==1)sprintf(readf,"%7.1f",min);
         if(dp==2)sprintf(readf,"%7.2f",min);
         if(dp==3)sprintf(readf,"%7.3f",min);
         if(dp==4)sprintf(readf,"%7.4f",min);
         if(dp==5)sprintf(readf,"%7.5f",min);
         strcpy(value[readb][readc],readf);
         min=0.00;
      }





    } // end if sum,min,max or avg
  } // end if equation

}

if(strcmp(reada,"den")==0){
  //for ts, rem out when not needed
  //printf("%s %d %d %d %d %s\n",reada,readb,readc,readd,reade,readf);
  strcpy(value[readb][readc],readf);
  valuel[readb][readc]=strtof(readf,&pEnd);
}


}while(strcmp(reada,"stp")!=0);
fclose(fp);

}

