#!/usr/bin/python

import os, sys, string

# this does in-place replacements of 


if ( len( sys.argv ) < 5 ):
    print("Usage: replaceTextureInSli.py <in> <symbolname> <sliFile> <donorFile|outputFile> [extractTexture] [-error]")
    sys.exit( -1 )

f = open( sys.argv[ 1 ] )
lines = f.readlines();
f.close()

symbol = sys.argv[ 2 ]
sliFile = sys.argv[ 3 ]
donorFile = sys.argv[ 4 ]

ripOutTextureP = 0
alignError = 0

if ( len( sys.argv ) > 5 ):
    for i in range( 5, len( sys.argv ) ):
        if ( sys.argv[ i ] == "-error" ):
            alignError = string.atoi( sys.argv[ i+1 ] );
        elif ( sys.argv[ i ] == "extractTexture") :
            ripOutTextureP = 1




def execute( command ):
    print ( command );
    os.system( command );


def getCommandOutput( command ):
    print ( command )
    temp = os.popen( command, "r" );
    lines = temp.readlines();
    temp.close();
    return lines;

if ( ripOutTextureP == 0 ):
    tmpLines = getCommandOutput( "wc " + donorFile )
    bobs = string.split( tmpLines[ 0 ] );
    donorSize = string.atoi( bobs[ 2 ] )

address = 0;
offset = 0
count = 0;

foundSymbolP = 0;

for line in lines:
    print line
    if ( string.find( line, ".byte" ) != -1 ):
        print("ERROR: Symbol " + symbol + " not found");
        break    
    if ( string.find( line, "." ) != -1 ): continue

    tokens = string.split( line );

    if ( len( tokens ) != 3 ): continue;
    if ( string.find( tokens[ 1 ], "=" ) == -1 ): continue

    oldAddress = address;
    address = string.atoi( tokens[ 2 ] , 16 );
    
    if ( count == 0 ): oldAddress = address;
    count = count + 1

    if ( foundSymbolP == 0 ):
        offset = offset + address - oldAddress;

    print("Address = " + str( address ) + " old Address = " + str( oldAddress )  ); 
    

    if ( symbol == tokens[ 0 ] ):
        print( "Offset = " + str( offset ) +" Address = %0x" % address);
        foundSymbolP = 1;
        if ( ripOutTextureP == 0 ):
            break;
        continue;

    if ( foundSymbolP ):
        donorSize = address - oldAddress
        print(" Size = " + str( donorSize ) );        
        break;


if ( ripOutTextureP == 0 ):
    
    execute("cp "+ sliFile + " " + sliFile + ".bak" ); # make backup
    execute("dd bs=1 count=" + str(offset + alignError ) + " < " + sliFile +"  > /tmp/part1 ");
    execute("dd bs=1 < " + donorFile + " > /tmp/part2 ");
    if ( donorSize < 0 ):     
        execute("dd bs=1 skip=" + str(offset + alignError) + " < " + sliFile +"  > /tmp/part3 ");
    else:
        execute("dd bs=1 skip=" + str(offset + donorSize  + alignError) + " < " + sliFile +"  > /tmp/part3 ");    
    execute("cat /tmp/part1 /tmp/part2 /tmp/part3 > " + sliFile );
    execute("cmp " + sliFile + " " + sliFile + ".bak");
    execute("ls -l " + sliFile + " " + sliFile + ".bak");

else:

    if ( donorSize < 0 ): 
        execute("dd bs=1 skip=" + str( offset + alignError ) + " < " + sliFile + " > " + donorFile )
    else:
        execute("dd bs=1 skip=" + str( offset + alignError ) + " count=" + str(donorSize) + "< " + sliFile + " > " + donorFile )


                     
