1#!/usr/bin/env python
2#
3# Copyright (C) 2011-2012 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#      http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
17
18import os
19import sys
20
21try:
22    import hashlib
23    sha1 = hashlib.sha1
24except ImportError, e:
25    import sha
26    sha1 = sha.sha
27
28def compute_sha1(h, path):
29    f = open(path, 'rb')
30    while True:
31        buf = f.read(1024)
32        h.update(buf)
33        if len(buf) < 1024:
34            break
35    f.close()
36
37"""The result is a list of pair of file path and its SHA-1 digest"""
38def compute_sha1_list(path_list):
39    result = []
40    for path in path_list:
41        h = sha1()
42        compute_sha1(h, path)
43        result.append((path, h.digest()))
44    return result
45
46"""For each path like /xxx/libfoo.so, generate a symbol named libfoo_so_SHA1"""
47def get_symbol_name(path):
48    return os.path.basename(path).replace('.', '_') + '_SHA1';
49
50"""Print out header for assembly file."""
51def print_asm_header(symbols):
52    sys.stdout.write("""
53/*\
54 * The mid-2007 version of gcc that ships with Macs requires a\n\
55 * comma on the .section line, but the rest of the world thinks\n\
56 * that's a syntax error. It also wants globals to be explicitly\n\
57 * prefixed with \"_\" as opposed to modern gccs that do the\n\
58 * prefixing for you.\n\
59 */\n\
60""")
61    for sym in symbols:
62        sys.stdout.write("""
63#ifdef __APPLE_CC__
64.globl _%s\n\
65#else\n\
66.globl %s\n\
67#endif\
68""" % (sym, sym))
69    sys.stdout.write("""
70#ifdef __APPLE_CC__
71  .section .rodata,\n\
72#else\n\
73  .section .rodata\n\
74#endif\
75""" )
76
77def print_asm_data(data, size):
78    col = 0
79    sys.stdout.write(".align 8\n")
80    for i in xrange(size):
81        c = data[i]
82        if col == 0:
83            sys.stdout.write(".byte ")
84        elif col % 4 == 0:
85            sys.stdout.write(", ")
86        else:
87            sys.stdout.write(",")
88        sys.stdout.write("0x%02x" % ord(c))
89        col += 1
90        if col == 8:
91            sys.stdout.write("\n")
92            col = 0
93    if col != 0:
94        sys.stdout.write("\n")
95
96def print_asm_symbol_data(sym, h):
97    sys.stdout.write("""
98#ifdef __APPLE_CC__
99_%s:\n\
100#else\n\
101%s:\n\
102#endif\n\
103""" % (sym, sym))
104    print_asm_data(h, 20)
105
106def print_asm(x):
107    symbols = [get_symbol_name(item[0]) for item in x]
108    print_asm_header(symbols)
109    for (symbol, y) in zip(symbols, x):
110        print_asm_symbol_data(symbol, y[1])
111
112def main():
113    if len(sys.argv) < 2:
114        print 'USAGE:', sys.argv[0], '[OUTPUT] [INPUTs]'
115        sys.exit(1)
116
117    result = compute_sha1_list(sys.argv[1:])
118    print_asm(result)
119
120if __name__ == '__main__':
121    main()
122