<filename>Mk/bin/copyright.py
#!/usr/bin/env python3
# vim: set ft=python list et ts=8 sts=4 sw=4:

# Update the copyright headers in all source files passed on the command line.
# The copyright headers are comments at the beginning of lines that are
# marked by a dash immediately at the start of the comment.
# The entire copyright header is replaced by the copyright in LICENSE, with the
# exception of contributor's additional Copyright lines, which are kept intact
# as found in each source file.

import sys
import os

MAIN_NAME = '<NAME>'
MAIN_EMAIL = '<EMAIL>'
TITLE = ('SSLsplit - transparent SSL/TLS interception\n'
         'https://www.roe.ch/SSLsplit\n\n')

class Language:
    def __init__(self, begin, each, end):
        self.begin = begin
        self.each = each
        self.end = end

    def is_end(self, line):
        if self.end != None:
            return line.startswith(self.end)
        else:
            return not line.startswith(self.each)

languages = []
languages.append(Language('/*-',   ' *',   ' */'))  # c
languages.append(Language('#-',    '#',    None))   # scripts and make files
languages.append(Language('.\\"-', '.\\"', None))   # troff


def split_before(s, delimiter):
    s1, s2 = s.split(delimiter, 1)
    return s1, delimiter + s2

def commentline(prefix, line):
    if len(line) > 0:
        return prefix + ' ' + line + '\n'
    return prefix + '\n'

def license(outfile, language, contribrights=''):
    with open('LICENSE', 'r') as f:
        license = f.read()
    header, rest = split_before(license, 'Copyright')
    copyright, legalese = split_before(rest, 'All rights reserved')
    copyright = copyright.replace('and contributors', '<%s>' % MAIN_EMAIL)
    text = TITLE + copyright + contribrights + legalese
    outfile.write('%s\n' % language.begin)
    for line in text.splitlines():
        outfile.write(commentline(language.each, line))

def mangle(outfile, infile):
    contribs = []
    language = None
    have_first = False
    have_header = False
    for line in infile:
        if have_header:
            outfile.write(line)
        elif have_first:
            if language.is_end(line):
                license(outfile, language, ''.join(contribs))
                outfile.write(line)
                have_header = True
            elif 'Copyright' in line and not MAIN_NAME in line:
                prefix, copyright = split_before(line, 'Copyright')
                contribs.append(copyright)
        else:
            for lang in languages:
                if line.startswith(lang.begin):
                    language = lang
                    break
            if language == None:
                outfile.write(line)
                continue
            have_first = True

for fn in sys.argv[1:]:
    with open(fn, 'r') as infile:
        with open(fn + '~', 'w') as outfile:
            mode = os.fstat(infile.fileno()).st_mode
            os.fchmod(outfile.fileno(), mode)
            mangle(outfile, infile)
    os.rename(fn + '~', fn)

