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
21import sys
22
23
24def 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
48def 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
81def main(argv):
82  if len(argv) < 2:
83    print "usage: %s <name>" % argv[0]
84    return 1
85
86  File2Asm(argv[1])
87
88if __name__ == "__main__":
89  main(sys.argv)
90