chromium/sandbox/policy/mac/package_sb_file.py

#!/usr/bin/env python
# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from __future__ import print_function

import os
import sys

"""Pack MacOS sandbox seatbelt .sb files as C-style strings, escaping
quotes and backslashes as needed.
"""

header = '// Generated by package_sb_file.py. Do not edit !!!\n\n'
namespace = 'namespace sandbox {\nnamespace policy{\n\n'
namespace_end = '\n}  // namespace policy\n}  // namespace sandbox\n'
h_include = '#include "sandbox/policy/export.h"\n'
h_definition = ('SANDBOX_POLICY_EXPORT\n' +
                'extern const char kSeatbeltPolicyString_%s[];\n\n')
cc_include = '#include "sandbox/policy/mac/%s.sb.h"\n'
cc_definition = 'const char kSeatbeltPolicyString_%s[] = \n'
cc_definition_end = '"";\n'  # Add "" so the definition has some content
                             # (the empty string) if the sb file is empty.

def escape_for_c(line):
  if line and line[0] == ';':
    return ''
  return line.replace('\\', '\\\\').replace('\"', '\\\"')

def pack_file(argv):
  if len(argv) != 2:
    print >> sys.stderr, 'usage: package_sb_file.py input_filename output_dir'
    return 1
  input_filename = argv[0]
  output_directory = argv[1]
  input_basename = os.path.basename(input_filename)
  (module_name, module_ext) = os.path.splitext(input_basename)
  output_h_file = output_directory + '/' + input_basename + '.h'
  output_cc_file = output_directory + '/' + input_basename + '.cc'
  try:
    with open(input_filename, 'r') as infile:
      with open(output_h_file, 'w') as outfile:
        outfile.write(header)
        outfile.write(h_include)
        outfile.write(namespace)
        outfile.write(h_definition % module_name)
        outfile.write(namespace_end)
      with open(output_cc_file, 'w') as outfile:
        outfile.write(header)
        outfile.write(cc_include % module_name)
        outfile.write(namespace)
        outfile.write(cc_definition % module_name)
        for line in infile:
          escaped_line = escape_for_c(line.rstrip())
          if escaped_line:
            outfile.write('    "' + escaped_line + '\\n"\n')
        outfile.write(cc_definition_end)
        outfile.write(namespace_end)
  except IOError:
    print('Failed to process %s' % input_filename, file=sys.stderr)
    return 1
  return 0

if __name__ == '__main__':
  sys.exit(pack_file(sys.argv[1:]))