#!/usr/bin/env python3
#
# Filter coverage reported by lcov
#
# Copyright 2020 BlueKitchen GmbH
#

import sys

whitelist = [
    '3rd-party/micro-ecc/uECC.c',
    '3rd-party/rijndael/rijndael.c',
    'src/ad_parser.c',
    'src/ble/att_db.c',
    'src/ble/att_db_util.c',
    'src/ble/att_dispatch.c',
    'src/ble/att_server.c',
    'src/ble/gatt_client.c',
    'src/ble/gatt-service/ancs_client.c',
    'src/ble/gatt-service/battery_service_server.c',
    'src/ble/gatt-service/battery_service_client.c',
    'src/ble/gatt-service/device_information_service_server.c',
    'src/ble/gatt-service/device_information_service_client.c',
    'src/ble/le_device_db_tlv.c',
    'src/ble/sm.c',
    'src/btstack_crypto.c',
    'src/btstack_linked_list.c',
    'src/btstack_memory.c',
    'src/btstack_memory_pool.c',
    'src/btstack_run_loop.c',
    'src/btstack_run_loop_base.c',
    'src/btstack_tlv.c',
    'src/btstack_util.c',
    'src/hci.c',
    'src/hci_cmd.c',
    'src/hci_dump.c',
    'src/hci_transport_h4.c',
    'src/l2cap.c',
    'src/l2cap_signaling.c',
    'platform/embedded/btstack_stdin_embedded.c',
    'platform/embedded/btstack_run_loop_embedded.c',
    'platform/embedded/btstack_uart_block_embedded.c',
]

def include_file(filename):
    for pattern in whitelist:
        if pattern in filename:
            print("Add " + filename)
            return True
    return False

if len(sys.argv) != 3:
    print ('lcov .info filter')
    print ('Usage: ', sys.argv[0], 'input.info output.info')
    exit(0)

infile = sys.argv[1]
outfile = sys.argv[2]

with open(infile, 'rt') as fin:
    with open(outfile, 'wt') as fout:
        mirror = False
        read_tn = False
        for line in fin:
            line = line.strip()
            if line == 'TN:':
                read_tn = True
                continue
            if line == 'end_of_record':
                if mirror:
                    fout.write(line+'\n')
                mirror = False
                continue
            parts = line.split(':')
            if len(parts) == 2 and parts[0] == 'SF':
                filename = parts[1]
                mirror = include_file(filename)
                if mirror and read_tn:
                    fout.write("TN:\n")
                    read_tn = False
            if not mirror:
                continue
            fout.write(line+"\n")