#!/usr/bin/python

import os, sys

search_strings = (
    #(String, min_offset, max_offset),
    ("U\0S\0B\0 \0C\0l\0i\0e\0n\0t", 0x112, 0x300),
    ("\x00\x00\x00\x40", 0x104),
    ("\x02\x10"),
    )
fw_size = 0x1B40



def dump(data):
    import struct
    for b in data:
        sys.stdout.write("%02X "%(struct.unpack("b", b)))
    sys.stdout.write("\n");

def get_revision(data):
    string = "HCF$Revision:"
    start = data.find(string)
    start += len(string)
    end = data.find('$', start)
    if end == -1:
        return None
    return data[start:end].strip()
    
def handle_file(path):
    offsets = [None,None,None]
    data = file(path).read()
    
    offsets[0] = data.find(search_strings[0][0])
    if offsets[0] == -1:
        return
    offsets[1] = data.rfind(search_strings[1][0], 0, offsets[0])
    if offsets[1] == -1:
        print "Error: %s"%(str(offsets))
        
    offsets[2] = data.rfind(search_strings[2][0], 0, offsets[1]-0x100)
    if offsets[2] == -1:
        print "Error: %s"%(str(offsets))
    fw_start = offsets[2];
    for i in range(len(offsets)):
        offsets[i] -= fw_start

    if offsets[0] < search_strings[0][1]:
        print "Warning: offsets[0]=0x%04X"%(offsets[0])
    if offsets[0] > search_strings[0][2]:
        print "Warning: offsets[0]=0x%04X"%(offsets[0])
    if offsets[1] != search_strings[1][1]:
        print "Warning: offsets[1]=0x%04X"%(offsets[0])

    print "MATCH: %s"%path
    path = os.path.join("firmwares", path.replace("/", "_"))
    path += "_v"+get_revision(data)+"_"+".bin"
    file(path, "w").write(data[fw_start:fw_start+fw_size])
    print "SAVED: %s"%path

def handle_directory(parent):
    for path in os.listdir(parent):
        full_path=os.path.join(parent,path)
        if os.path.isdir(full_path):
            handle_directory(full_path)
        else:
            handle_file(full_path)
try:
    os.mkdir("firmwares")
except OSError:
    pass
for dir in sys.argv[1:]:
        handle_directory(dir)
