#!/usr/bin/env python
#
# Copyright (C) 2011-2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import os
import sys

try:
    import hashlib
    sha1 = hashlib.sha1
except ImportError, e:
    import sha
    sha1 = sha.sha

def compute_sha1(h, path):
    f = open(path, 'rb')
    while True:
        buf = f.read(1024)
        h.update(buf)
        if len(buf) < 1024:
            break
    f.close()

"""The result is a list of pair of file path and its SHA-1 digest"""
def compute_sha1_list(path_list):
    result = []
    for path in path_list:
        h = sha1()
        compute_sha1(h, path)
        result.append((path, h.digest()))
    return result

"""For each path like /xxx/libfoo.so, generate a symbol named libfoo_so_SHA1"""
def get_symbol_name(path):
    return os.path.basename(path).replace('.', '_') + '_SHA1';

"""Print out header for assembly file."""
def print_asm_header(symbols):
    sys.stdout.write("""
/*\
 * The mid-2007 version of gcc that ships with Macs requires a\n\
 * comma on the .section line, but the rest of the world thinks\n\
 * that's a syntax error. It also wants globals to be explicitly\n\
 * prefixed with \"_\" as opposed to modern gccs that do the\n\
 * prefixing for you.\n\
 */\n\
""")
    for sym in symbols:
        sys.stdout.write("""
#ifdef __APPLE_CC__
.globl _%s\n\
#else\n\
.globl %s\n\
#endif\
""" % (sym, sym))
    sys.stdout.write("""
#ifdef __APPLE_CC__
  .section .rodata,\n\
#else\n\
  .section .rodata\n\
#endif\
""" )

def print_asm_data(data, size):
    col = 0
    sys.stdout.write(".align 8\n")
    for i in xrange(size):
        c = data[i]
        if col == 0:
            sys.stdout.write(".byte ")
        elif col % 4 == 0:
            sys.stdout.write(", ")
        else:
            sys.stdout.write(",")
        sys.stdout.write("0x%02x" % ord(c))
        col += 1
        if col == 8:
            sys.stdout.write("\n")
            col = 0
    if col != 0:
        sys.stdout.write("\n")

def print_asm_symbol_data(sym, h):
    sys.stdout.write("""
#ifdef __APPLE_CC__
_%s:\n\
#else\n\
%s:\n\
#endif\n\
""" % (sym, sym))
    print_asm_data(h, 20)

def print_asm(x):
    symbols = [get_symbol_name(item[0]) for item in x]
    print_asm_header(symbols)
    for (symbol, y) in zip(symbols, x):
        print_asm_symbol_data(symbol, y[1])

def main():
    if len(sys.argv) < 2:
        print 'USAGE:', sys.argv[0], '[OUTPUT] [INPUTs]'
        sys.exit(1)

    result = compute_sha1_list(sys.argv[1:])
    print_asm(result)

if __name__ == '__main__':
    main()
