int DoBdiff( const char *srcPath, const char *tgtPath, const char *name ) { long savings; foff buffsize; int i; // if( !MsgInit() ) exit( EXIT_FAILURE ); /* initialize static variables each time */ SimilarRegions = NULL; DiffRegions = NULL; HoleRegions = NULL; SimilarSize = 0; NumHoles = 0; NumDiffs = 0; DiffSize = 0; HolesInRegion = 0; HoleHeaders = 0; for( i = 0; i < 3; i += 1 ) { HoleCount[i] = 0; } init_diff(); newName = name; EndOld = FileSize( srcPath, &OldCorrection ); EndNew = FileSize( tgtPath, &NewCorrection ); buffsize = ( EndOld > EndNew ) ? ( EndOld ) : ( EndNew ); buffsize += sizeof( PATCH_LEVEL ); OldFile = ReadIn( srcPath, buffsize, EndOld ); NewFile = ReadIn( tgtPath, buffsize, EndNew ); ScanSyncString( SyncString ); FindRegions(); if( NumHoles == 0 && DiffSize == 0 && EndOld == EndNew ) { printf( "Patch file not created - files are identical\n" ); MsgFini(); exit( EXIT_SUCCESS ); } MakeHoleArray(); SortHoleArray(); ProcessHoleArray( 0 ); savings = HolesToDiffs(); WritePatchFile( "", newName ); FreeHoleArray(); VerifyCorrect( tgtPath ); print_stats( savings ); MsgFini(); return ( EXIT_SUCCESS ); }
void main( int argc, char **argv ) { long savings; foff buffsize; algorithm alg; if( !MsgInit() ) exit( EXIT_FAILURE ); alg = ParseArgs( argc, argv ); EndOld = FileSize( argv[1], &OldCorrection ); EndNew = FileSize( argv[2], &NewCorrection ); buffsize = ( EndOld > EndNew ) ? ( EndOld ) : ( EndNew ); buffsize += sizeof( PATCH_LEVEL ); OldFile = ReadIn( argv[1], buffsize, EndOld ); NewFile = ReadIn( argv[2], buffsize, EndNew ); ScanSyncString( SyncString ); switch( alg ) { case ALG_NOTHING: FindRegions(); break; #ifdef USE_DBGINFO case ALG_ONLY_NEW: case ALG_BOTH: SymbolicDiff( alg, argv[1], argv[2] ); break; #endif } if( NumHoles == 0 && DiffSize == 0 && EndOld == EndNew ) { printf( "Patch file not created - files are identical\n" ); MsgFini(); exit( EXIT_SUCCESS ); } MakeHoleArray(); SortHoleArray(); ProcessHoleArray( 0 ); savings = HolesToDiffs(); WritePatchFile( argv[3], newName ); FreeHoleArray(); VerifyCorrect( argv[2] ); print_stats( savings ); MsgFini(); exit( EXIT_SUCCESS ); }
MultipleAlignment* AlignAlignments(MultipleAlignment *originalSrcMA1, MultipleAlignment *originalSrcMA2, int index1, int index2, int selfAlignDistance) { int i,j,k; /* New multiple alignment */ MultipleAlignment *ma = (MultipleAlignment *)calloc(1, sizeof(MultipleAlignment)); /* Duplicate source alignments. Moves the index1 chain to the front. * Also realigns and extends the aligned blocks. */ MultipleAlignment *srcMA1 = DuplicateAlignment(originalSrcMA1, index1); MultipleAlignment *srcMA2 = DuplicateAlignment(originalSrcMA2, index2); MatchedBlockPair *regions; int numRegions; ma->order = CombineAssemblyOrders(srcMA1->order, srcMA2->order); ma->numChains = srcMA1->numChains + srcMA2->numChains; ma->chains = (ResiduePositions **)malloc(ma->numChains * sizeof(ResiduePositions *)); memcpy(ma->chains, srcMA1->chains, srcMA1->numChains * sizeof(ResiduePositions *)); memcpy(ma->chains + srcMA1->numChains, srcMA2->chains, srcMA2->numChains * sizeof(ResiduePositions *)); FindRegions(®ions, &numRegions, srcMA1, srcMA2, selfAlignDistance); for (i=0; i < numRegions; i++) { ma->numResidues += regions[i].len; } ma->score = -5000; /* Alignment found (If no alignment, will return what we already have). */ if (numRegions) { int pos = 0; ma->score = regions[numRegions-1].bestAssembledScore; ma->numBlocks = numRegions; ma->blocks = (AlignedBlock *) malloc(numRegions * sizeof(AlignedBlock)); ma->residues = (WeightedResiduePositions*) malloc(ma->numChains*sizeof(WeightedResiduePositions)); for (i=0; i<ma->numChains; i++) { ma->residues[i].res = (ResiduePosition*) malloc(ma->numResidues*sizeof(ResiduePosition)); ma->residues[i].weight = 0; } for (i=0; i < numRegions; i++) { ma->blocks[i].first = pos; ma->blocks[i].last = pos + regions[i].len-1; pos += regions[i].len; for (j=0; j<regions[i].len; j++) { for (k=0; k<srcMA1->numChains; k++) { ma->residues[k].res[ma->blocks[i].first+j] = srcMA1->residues[k].res[regions[i].p1 + j]; } for (; k<ma->numChains; k++) { ma->residues[k].res[ma->blocks[i].first+j] = srcMA2->residues[k-srcMA1->numChains].res[regions[i].p2 + j]; transformVect(&ma->residues[k].res[ma->blocks[i].first+j].coords, ®ions[i].m, &srcMA2->residues[k-srcMA1->numChains].res[regions[i].p2 + j].coords); } } } free(regions); } CleanupAlignment(srcMA1); CleanupAlignment(srcMA2); return ma; }