// OPJFile.cc #include #include #include #include #include "OPJFile.h" #define MAX_LEVEL 20 OPJFile::OPJFile(char *filename) : filename(filename) { version=0; nr_spreads=0; for(int i=0;i 0 && col_found < 132) { // should be 0x72, 0x73 or 0x83 //////////////////////////////// COLUMN HEADER ///////////////////////////////////////////// for(i=0;i<0x3D;i++) // skip to value size fread(&c,1,1,f); fread(&valuesize,1,1,f); fprintf(debug," [valuesize = %d @ 0x%X]\n",valuesize,(unsigned int) ftell(f)-1); if(valuesize <= 0) { fprintf(debug," WARNING : found strange valuesize of %d\n",valuesize); valuesize=10; } for(i=0;i<0x1A;i++) // skip to name fread(&c,1,1,f); // read name fprintf(debug," [Spreadsheet @ 0x%X]\n",(unsigned int) ftell(f)); fflush(debug); fread(&name,25,1,f); char* sname = new char[26]; sprintf(sname,"%s",strtok(name,"_")); // spreadsheet name char* cname = strtok(NULL,"_"); // column name while(char* tmpstr = strtok(NULL,"_")) { // get multiple-"_" title correct strcat(sname,"_"); strcat(sname,cname); strcpy(cname,tmpstr); } if(nr_spreads == 0 || strcmp(sname,spreadname[nr_spreads-1])) { fprintf(debug," NEW SPREADSHEET\n"); sprintf(spreadname[nr_spreads++],"%s",sname); current_col=1; maxrows[nr_spreads]=0; } else { current_col++; nr_cols[nr_spreads-1]=current_col; } fprintf(debug," SPREADSHEET = %s COLUMN NAME = %s (%d) (@0x%X)\n", sname, cname,current_col,(unsigned int) ftell(f)); if(cname==0) { fprintf(debug,"NO COLUMN FOUND! GIVING UP.\n"); fprintf(debug,"MAY BE MATRIX OR FUNCTION.\n"); nr_spreads-=1; break; } sprintf(colname[nr_spreads-1][current_col-1],"%s",cname); // NEW ? colname[nr_spreads-1][current_col-1]=cname; ////////////////////////////// SIZE of column ///////////////////////////////////////////// do{ // skip until '\n' fread(&c,1,1,f); } while (c != '\n'); fread(&nbytes,4,1,f); if(fmod(nbytes,(double)valuesize)>0) fprintf(debug,"WARNING: data section could not be read correct\n"); nr = nbytes / valuesize; fprintf(debug," [number of rows = %d (%d Bytes) @ 0x%X]\n",nr,nbytes,(unsigned int) ftell(f)); nr_rows[nr_spreads-1][current_col-1]=nr; maxrows[nr_spreads-1] 16) { // skip 0 0 fread(&c,1,1,f); fread(&c,1,1,f); } fread(&col_found,4,1,f); fread(&c,1,1,f); // skip '\n' fprintf(debug," [column found = %d (@ 0x%X)]\n",col_found,(unsigned int) ftell(f)-5); fflush(debug); } ////////////////////////////////////// SPREADSHEETS //////////////////////////////////////////////// // TODO : use new method ('\n') int POS = ftell(f)-11; fprintf(debug,"\n[position @ 0x%X]\n",POS); fprintf(debug," nr_spreads = %d\n",nr_spreads); fflush(debug); ///////////////////// SPREADSHEET INFOS //////////////////////////////////// int LAYER; int COL_JUMP = 0x1ED; for(i=0; i < nr_spreads; i++) { if(i > 0) { if(version == 750) POS = LAYER+0x2759; else if (version == 700 ) POS += 0x2530 + nr_cols[i-1]*COL_JUMP; else if (version == 610 ) POS += 0x25A4 + nr_cols[i-1]*COL_JUMP; else if (version == 604 ) POS += 0x25A0 + nr_cols[i-1]*COL_JUMP; else if (version == 601 ) POS += 0x2560 + nr_cols[i-1]*COL_JUMP; // ? else if (version == 600 ) POS += 0x2560 + nr_cols[i-1]*COL_JUMP; else if (version == 500 ) POS += 0x92C + nr_cols[i-1]*COL_JUMP; else if (version == 410 ) POS += 0x7FB + nr_cols[i-1]*COL_JUMP; } fprintf(debug,"\n"); // HEADER // check header int ORIGIN = 0x55; if(version == 500) ORIGIN = 0x58; fseek(f,POS + ORIGIN,SEEK_SET); // check for 'O'RIGIN char c; fread(&c,1,1,f); int jump=0; while( c != 'O' && jump < MAX_LEVEL) { // no inf loop fprintf(debug," TRY %d \"O\"RIGIN not found ! : %c (@ 0x%X)",jump+1,c,POS+ORIGIN); fprintf(debug," POS=0x%X | ORIGIN = 0x%X\n",POS,ORIGIN); POS+=0x1F2; fseek(f,POS + ORIGIN,SEEK_SET); fread(&c,1,1,f); jump++; } if(jump == MAX_LEVEL){ fprintf(debug," Spreadsheet SECTION not found ! (@ 0x%X)\n",POS-10*0x1F2+0x55); return -5; } fprintf(debug," OK. Spreadsheet SECTION found (@ 0x%X)\n",POS); fflush(debug); // check spreadsheet name fseek(f,POS + 0x12,SEEK_SET); fread(&name,25,1,f); int spread=i; for(j=0;j