int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify, enum striptype stripmode ) { FILE * infile = NULL; FILE * outfile = NULL; int i = -1; unsigned char headerdata[512]; unsigned long dwLength1, dwLength2, dwLength3, fp = 0; unsigned char blockdata[16+16]; unsigned char out[16]; unsigned char newmunge; signed long lenread; int s = 0; unsigned char * pChecksums, * ppChecksums = 0; unsigned char ck; infile = openinfile(infile_name); outfile = openoutfile(outfile_name); lenread = fread( headerdata, 1, 512, infile ); if( lenread != 512 ) { fprintf( stderr, "This doesn't look like a valid encrypted iHP " "firmware - reason: header length\n" ); fclose(infile); fclose(outfile); return -1; }; i = testheader( headerdata ); if( i == -1 ) { fprintf( stderr, "This firmware is for an unknown model, or is not" " a valid encrypted iHP firmware\n" ); fclose(infile); fclose(outfile); return -2; }; fprintf( stderr, "Model %s\n", models[ i ] ); dwLength1 = headerdata[0] | (headerdata[1]<<8) | (headerdata[2]<<16) | (headerdata[3]<<24); dwLength2 = headerdata[4] | (headerdata[5]<<8) | (headerdata[6]<<16) | (headerdata[7]<<24); dwLength3 = headerdata[8] | (headerdata[9]<<8) | (headerdata[10]<<16) | (headerdata[11]<<24); if( dwLength1 < firmware_minsize[ i ] || dwLength1 > firmware_maxsize[ i ] || dwLength2 < firmware_minsize[ i ] || dwLength2 > dwLength1 || dwLength3 > dwLength1 || dwLength2>>9 != dwLength3 || dwLength2+dwLength3+512 != dwLength1 ) { fprintf( stderr, "This doesn't look like a valid encrypted " "iHP firmware - reason: file 'length' data\n" ); fclose(infile); fclose(outfile); return -3; }; pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) ); if( modify ) { modifyheader( headerdata ); }; if( stripmode == STRIP_NONE ) fwrite( headerdata, 512, 1, outfile ); memset( blockdata, 0, 16 ); ck = 0; while( ( fp < dwLength2 ) && ( lenread = fread( blockdata+16, 1, 16, infile ) ) == 16 ) { fp += 16; for( i=0; i<16; ++i ) { newmunge = blockdata[16+i] ^ munge[i]; out[i] = newmunge ^ blockdata[i]; blockdata[i] = newmunge; ck += out[i]; } if( fp > ESTF_SIZE || stripmode != STRIP_HEADER_CHECKSUM_ESTF ) { fwrite( out+4, 1, 12, outfile ); fwrite( out, 1, 4, outfile ); } else { if( ESTF_SIZE - fp < 16 ) { memcpy( out+4, blockdata+16, 12 ); memcpy( out, blockdata+28, 4 ); fwrite( blockdata+16+ESTF_SIZE-fp, 1, ESTF_SIZE-fp, outfile ); } } if( s == 496 ) { s = 0; memset( blockdata, 0, 16 ); *ppChecksums++ = ck; ck = 0; } else s+=16; }; if( fp != dwLength2 ) { fprintf( stderr, "This doesn't look like a valid encrypted " "iHP firmware - reason: 'length2' mismatch\n" ); fclose(infile); fclose(outfile); return -4; }; fp = 0; ppChecksums = pChecksums; while( ( fp < dwLength3 ) && ( lenread = fread( blockdata, 1, 32, infile ) ) > 0 ) { fp += lenread; if( stripmode == STRIP_NONE ) fwrite( blockdata, 1, lenread, outfile ); if( memcmp( ppChecksums, blockdata, lenread ) != 0 ) { fprintf( stderr, "This doesn't look like a valid encrypted " "iHP firmware - reason: Checksum mismatch!" ); fclose(infile); fclose(outfile); return -5; }; ppChecksums += lenread; }; if( fp != dwLength3 ) { fprintf( stderr, "This doesn't look like a valid encrypted " "iHP firmware - reason: 'length3' mismatch\n" ); fclose(infile); fclose(outfile); return -6; }; fprintf( stderr, "File decoded correctly and all checksums matched!\n" ); switch( stripmode ) { default: case STRIP_NONE: fprintf(stderr, "Output file contains all headers and " "checksums\n"); break; case STRIP_HEADER_CHECKSUM: fprintf( stderr, "NB: output file contains only ESTFBINR header" " and decoded firmware code\n" ); break; case STRIP_HEADER_CHECKSUM_ESTF: fprintf( stderr, "NB: output file contains only raw decoded " "firmware code\n" ); break; }; return 0; }
void scaling() { int nglaciercells=0; float volumechange=0,glacarea=0,glacareanew=0,areachange=0,areachange2=0; int areachange_numbercells; /*number of grid cells to be added or removed*/ float minimum; int min_i,min_j,ii; FILE *outnewDEMglac=NULL; char namenewDEMglac[PFNAME_LEN]; /* --- DETERMINE GLACIER AREA, count number of glacier gridcells -----------*/ /*Note that variable nglac refers to all drainage basin grid cells*/ nglaciercells = 0; for (i=1; i<=nrows; i++) for (j=1; j<=ncols; j++) { if ((griddgmglac[i][j]) != nodata) /*grid of glacier*/ nglaciercells += 1; } /* --- DETERMINE GLACIER AREA, count number of glacier gridcells -----------*/ glacarea = nglaciercells * gridsize * gridsize; /*in m2*/ /* --- CONVERT ANNUAL SPECIFIC MASS BALANCE INTO VOLUME -----------*/ volumechange = x[11]/100/0.9*glacarea; /*assuming 900 kg/m3; x[11] is mean, comes from statist, writeout.c*/ /*divide by 100 to convert cm into meter*/ /* -----------------------------------------------*/ /* --- SCALING ---Arendt JGR 2006 and just simple V-A scaling assumin delta V is prop to delta A--------*/ /* -----------------------------------------------*/ areachange = (volumechange/ (c_coefficient*gammaVA*(pow(glacarea,(gammaVA-1))) )); /*m2, negative in case of retreat*/ areachange2 = pow( (fabs(volumechange)/c_coefficient),(1/gammaVA) ); /*in m2*/ /*fabs=absolute value; has to be positive, otherwise NaN*/ if(volumechange < 0) areachange2 = -areachange2; /* --- DETERMINE NUMBER OF GRID CELLS TO ADD OR REMOVE--------*/ areachange_numbercells = (int)(areachange/(gridsize*gridsize)); /*negative in case of retreat, gridsize in m*/ glacarea = glacarea/1000000; /*convert m2 to km2*/ areachange = areachange/1000000; areachange2 = areachange2/1000000; glacareanew = glacarea + areachange; /*areachange is negative in case of retreat, in km2*/ if(glacareanew < 0) glacareanew = 0; /* --- PRINT AREA AND AREA CHANGE TO MASS BALANCE FILE--------*/ fprintf(outspecificmassbal," %.4f %.4f %.3f %d %.3f\n",glacarea,glacareanew,areachange,areachange_numbercells,areachange2); /* -----------------------------------------------*/ /* --- REMOVE GRID CELLES FROM GLACIER DEM--------*/ /* -----------------------------------------------*/ if((areachange < 0) && (glacareanew > 0))/*;*/ /*only for retreat, no advance*/ { for (ii=1; ii<= -areachange_numbercells; ii++) { /*ueber alle Reihen*/ minimum = 10000.0; /*minimum, must be initialized high*/ for (i=1; i<=nrows; i++) { for (j=1; j<=ncols; j++) { if (griddgmglac[i][j] != nodata) { /*only area to be calcualated*/ if (griddgmglac[i][j] < minimum) { minimum = griddgmglac[i][j]; /*minimum*/ min_i = i; /*store row, col of cell with minimum value*/ min_j = j; } } /*endif*/ } /*for col*/ } /*for row*/ griddgmglac[min_i][min_j] = nodata; } /*for each grid cell to be removed*/ } /*endif retreat*/ /* -----------------------------------------------*/ /* --- WRITE NEW GLACIER DEM TO FILE--------*/ /* -----------------------------------------------*/ sprintf(namenewDEMglac,"DEMglac%04d.bin",(int)year); openoutfile(&outnewDEMglac,outpath,namenewDEMglac); statist(griddgmglac,x); fwrite(&(x[1]),sizeof(float),12,outnewDEMglac); /*FIRST 12 ROWS*/ for (i=1; i<=nrows; i++) /* for all rows (and columns in fwrite command) */ fwrite(&(griddgmglac[i][1]),sizeof(float),ncols,outnewDEMglac); if(outnewDEMglac) closefile(&outnewDEMglac,namenewDEMglac); return; }
int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify ) { FILE * infile = NULL; FILE * outfile = NULL; int i = -1; unsigned char headerdata[512]; unsigned long dwLength1, dwLength2, dwLength3, fp = 0; unsigned char blockdata[16+16]; unsigned char out[16]; unsigned char newmunge; signed long lenread; int s = 0; unsigned char * pChecksums, * ppChecksums; unsigned char ck; infile = openinfile(infile_name); outfile = openoutfile(outfile_name); lenread = fread( headerdata, 1, 512, infile ); if( lenread != 512 ) { fprintf( stderr, "This doesn't look like a valid decoded " "iHP firmware - reason: header length\n" ); fclose(infile); fclose(outfile); return -1; }; if( modify ) { modifyheader( headerdata ); /* reversible */ }; i = testheader( headerdata ); if( i == -1 ) { fprintf( stderr, "This firmware is for an unknown model, or is not" " a valid decoded iHP firmware\n" ); fclose(infile); fclose(outfile); return -2; }; fprintf( stderr, "Model %s\n", models[ i ] ); dwLength1 = headerdata[0] | (headerdata[1]<<8) | (headerdata[2]<<16) | (headerdata[3]<<24); dwLength2 = headerdata[4] | (headerdata[5]<<8) | (headerdata[6]<<16) | (headerdata[7]<<24); dwLength3 = headerdata[8] | (headerdata[9]<<8) | (headerdata[10]<<16) | (headerdata[11]<<24); if( dwLength1 < firmware_minsize[i] || dwLength1 > firmware_maxsize[i] || dwLength2 < firmware_minsize[i] || dwLength2 > dwLength1 || dwLength3 > dwLength1 || dwLength2+dwLength3+512 != dwLength1 ) { fprintf( stderr, "This doesn't look like a valid decoded iHP" " firmware - reason: file 'length' data\n" ); fclose(infile); fclose(outfile); return -3; }; pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) ); fwrite( headerdata, 512, 1, outfile ); memset( blockdata, 0, 16 ); ck = 0; while( ( fp < dwLength2 ) && ( lenread = fread( blockdata+16, 1, 16, infile ) ) == 16 ) { fp += 16; for( i=0; i<16; ++i ) { newmunge = blockdata[16+((12+i)&0xf)] ^ blockdata[i]; out[i] = newmunge ^ munge[i]; ck += blockdata[16+i]; blockdata[i] = newmunge; }; fwrite( out, 1, 16, outfile ); if( s == 496 ) { s = 0; memset( blockdata, 0, 16 ); *ppChecksums++ = ck; ck = 0; } else s+=16; }; if( fp != dwLength2 ) { fprintf( stderr, "This doesn't look like a valid decoded " "iHP firmware - reason: 'length1' mismatch\n" ); fclose(infile); fclose(outfile); return -4; }; /* write out remainder w/out applying descrambler */ fp = 0; lenread = dwLength3; ppChecksums = pChecksums; while( ( fp < dwLength3) && ( lenread = fwrite( ppChecksums, 1, lenread, outfile ) ) > 0 ) { fp += lenread; ppChecksums += lenread; lenread = dwLength3 - fp; }; if( fp != dwLength3 ) { fprintf( stderr, "This doesn't look like a valid decoded " "iHP firmware - reason: 'length2' mismatch\n" ); fclose(infile); fclose(outfile); return -5; }; fprintf( stderr, "File encoded successfully and checksum table built!\n" ); fclose(infile); fclose(outfile); return 0; }