1 #!/usr/bin/env python 2 # 3 # Copyright (C) 2010 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 18 19 """Convert Slang data files to assembly output.""" 20 21 import sys 22 23 24 def PrintHeader(var_name): 25 """Print out header for assembly file.""" 26 sys.stdout.write(""" 27 #ifdef __APPLE_CC__ 28 /*\n\ 29 * The mid-2007 version of gcc that ships with Macs requires a\n\ 30 * comma on the .section line, but the rest of the world thinks\n\ 31 * that's a syntax error. It also wants globals to be explicitly\n\ 32 * prefixed with \"_\" as opposed to modern gccs that do the\n\ 33 * prefixing for you.\n\ 34 */\n\ 35 .globl _%s\n\ 36 .section .rodata,\n\ 37 .align 8\n\ 38 _%s:\n\ 39 #else\n\ 40 .globl %s\n\ 41 .section .rodata\n\ 42 .align 8\n\ 43 %s:\n\ 44 #endif\n\ 45 """ % (var_name, var_name, var_name, var_name)) 46 47 48 def File2Asm(var_name): 49 """Convert file to assembly output.""" 50 PrintHeader(var_name) 51 52 input_size = 0 53 col = 0 54 while True: 55 buf = sys.stdin.read(1024) 56 if len(buf) <= 0: 57 break 58 input_size += len(buf) 59 for c in buf: 60 if col == 0: 61 sys.stdout.write(".byte ") 62 sys.stdout.write("0x%02x" % ord(c)) 63 col += 1 64 if col == 16: 65 sys.stdout.write("\n") 66 col = 0 67 elif col % 4 == 0: 68 sys.stdout.write(", ") 69 else: 70 sys.stdout.write(",") 71 # always ends with 0x0 72 sys.stdout.write("0x00") 73 if col != 0: 74 sys.stdout.write("\n") 75 76 # encode file size 77 PrintHeader(var_name + "_size") 78 sys.stdout.write(" .long %d\n" % input_size) 79 80 81 def main(argv): 82 if len(argv) < 2: 83 print "usage: %s <name>" % argv[0] 84 return 1 85 86 File2Asm(argv[1]) 87 88 if __name__ == "__main__": 89 main(sys.argv) 90