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

import sys

blacklist = [
    '/opt/local',
    '3rd-party/yxml',
    '3rd-party/tinydir',
    'chipset/zephyr',
    'platform/embedded/btstack_audio_embedded.c',
    'platform/embedded/btstack_em9304_spi_embedded.c',
    'platform/embedded/btstack_stdin_embedded.c',
    'platform/embedded/btstack_tlv_flash_bank.c',
    'platform/embedded/btstack_uart_block_embedded.c',
    'platform/embedded/hal_flash_bank_memory.c',
    'platform/freertos/btstack_run_loop_freertos.c',
    'platform/freertos/btstack_uart_block_freertos.c',
    'platform/libusb',
    'platform/posix',
    'port/libusb',
    'src/ble/ancs_client.c',
    'src/ble/le_device_db_memory.c',
    'src/ble/gatt-service/cycling_power_service_server.c',
    'src/ble/gatt-service/cycling_speed_and_cadence_service_server.c',
    'src/ble/gatt-service/heart_rate_service_server.c',
    'src/ble/gatt-service/hids_device.c',
    'src/ble/gatt-service/nordic_spp_service_server.c',
    'src/ble/gatt-service/ublox_spp_service_server.c',
    'src/btstack_audio.c',
    'src/btstack_base64_decoder.c',
    'src/btstack_event.h',
    'src/btstack_hid_parser.c',
    'src/btstack_resample.c',
    'src/btstack_slip.c',
    'src/hci_transport_em9304_spi.c',
    'src/hci_transport_h5.c',
    'src/mesh/',
    'src/classic',
]

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

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")