15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Convert any unicode characters found in the input file to C literals."""
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import codecs
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import optparse
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main(argv):
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser = optparse.OptionParser()
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  usage = 'Usage: %prog -o <output_dir> <input_file>'
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.set_usage(usage)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option('-o', dest='output_dir')
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options, arglist = parser.parse_args(argv)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not options.output_dir:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "output_dir required"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if len(arglist) != 2:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "input_file required"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_filename = arglist[1]
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not in_filename.endswith('.utf8'):
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "input_file should end in .utf8"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  out_filename = os.path.join(options.output_dir, os.path.basename(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      os.path.splitext(in_filename)[0]))
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteEscapedFile(in_filename, out_filename)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def WriteEscapedFile(in_filename, out_filename):
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_data = codecs.open(in_filename, 'r', 'utf8').read()
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  with codecs.open(out_filename, 'w', 'ascii') as out_file:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for i, char in enumerate(input_data):
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ord(char) > 127:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out_file.write(repr(char.encode('utf8'))[1:-1])
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if input_data[i + 1:i + 2] in '0123456789abcdefABCDEF':
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          out_file.write('""')
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        out_file.write(char.encode('ascii'))
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(main(sys.argv))
57