예제 #1
0
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 );
}
예제 #2
0
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 );
}
예제 #3
0
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(&regions, &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, &regions[i].m, &srcMA2->residues[k-srcMA1->numChains].res[regions[i].p2 + j].coords);
				}
			}
		}
		free(regions);
	}
	CleanupAlignment(srcMA1);
	CleanupAlignment(srcMA2);
	return ma;
}