#!/usr/bin/env python3
# Copyright 2022 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Generates freertos_tsktcb.h from FreeRTOS source.

Extracts the tskTCB struct from FreeRTOS sources and writes it as a header to
the specified output path.
"""
import argparse
import re
import sys
from typing import TextIO
from pathlib import Path

_GENERATED_HEADER = """\
// This header is generated by generate_freertos_tsktcb.py, DO NOT EDIT!
#pragma once

#include "FreeRTOS.h"
#include "task.h"

"""


def _parse_args() -> argparse.Namespace:
    """Parses arguments for this script, splitting out the command to run."""

    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--freertos-src-dir',
                        type=Path,
                        help='Path to the FreeRTOS source directory.')
    parser.add_argument('--output',
                        '-o',
                        type=argparse.FileType('w'),
                        help=('Path to write generated tskTCB.h file to'))
    return parser.parse_args()


def _extract_struct(tasks_src: str):
    tsk_tcb_struct = re.search(
        r'(typedef struct tskTaskControlBlock.*tskTCB;\n)',
        tasks_src,
        flags=re.DOTALL)
    if tsk_tcb_struct:
        return tsk_tcb_struct.group(1)
    raise ValueError('Could not find tskTCB struct in tasks.c')


def _main(freertos_src_dir: Path, output: TextIO):
    with open(freertos_src_dir / 'tasks.c', 'r') as tasks_c:
        output.write(_GENERATED_HEADER)
        output.write(_extract_struct(tasks_c.read()))


if __name__ == '__main__':
    sys.exit(_main(**vars(_parse_args())))
