#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
# reserved. Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file.

"""
A simple utility function to merge pack resource files into a single resource file.
"""

from date_util import *
from file_util import *
import os
import re
import string
import sys


def MakeFileSegment(input):
  result = """

// ---------------------------------------------------------------------------
// From $FILE$:
"""

  filename = os.path.split(input)[1]
  result = result.replace('$FILE$', filename)

  contents = read_file(input)

  # identify the defines in the file
  p = re.compile('#define\s([A-Za-z0-9_]{1,})\s([0-9]{1,})')
  list = p.findall(contents)
  for name, id in list:
    result += "\n#define %s %s" % (name, id)

  return result


def MakeFile(output, input):
  # header string
  result = \
"""// Copyright (c) $YEAR$ Marshall A. Greenblatt. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ---------------------------------------------------------------------------
//
// This file is generated by the make_pack_header.py tool.
//

#ifndef $GUARD$
#define $GUARD$
#pragma once"""

  # sort the input files by name
  input = sorted(input, key=lambda path: os.path.split(path)[1])

  # generate the file segments
  for file in input:
    result += MakeFileSegment(file)

  # footer string
  result += \
"""

#endif  // $GUARD$
"""

  # add the copyright year
  result = result.replace('$YEAR$', get_year())
  # add the guard string
  filename = os.path.split(output)[1]
  guard = 'CEF_INCLUDE_'+string.upper(filename.replace('.', '_'))+'_'
  result = result.replace('$GUARD$', guard)

  if path_exists(output):
    old_contents = read_file(output)
  else:
    old_contents = ''

  if (result != old_contents):
    write_file(output, result)
    sys.stdout.write('File '+output+' updated.\n')
  else:
    sys.stdout.write('File '+output+' is already up to date.\n')

def main(argv):
  if len(argv) < 3:
    print ("Usage:\n  %s <output_filename> <input_file1> [input_file2] ... " %
           argv[0])
    sys.exit(-1)
  MakeFile(argv[1], argv[2:])


if '__main__' == __name__:
  main(sys.argv)
