# Copyright 2021 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.
"""Injects pre main init to ST startup scripts."""

from typing import Optional

import pathlib
import re


def add_pre_main_init(startup: str) -> str:
    """Add pw_stm32cube_Init call to startup file

    The stm32cube startup files directly call main(), while pigweed expects to
    do some setup before main is called. This could include sys_io or system
    clock initialization.

    This adds a call to `pw_stm32cube_Init()` immediately before the call to
    `main()`

    Args:
        startup: The startup script read into a string

    Returns:
        A new startup script with the `pw_stm32cube_Init()` call added.

    Raises:
        ValueError if the `main()` call is not found in `startup`
    """
    match = re.search(r'\s*bl\s+main', startup)
    if match is None:
        raise ValueError("`bl main` not found in startup script")

    return startup[:match.start(
    )] + '\nbl pw_stm32cube_Init' + startup[match.start():]


def inject_init(startup_in: pathlib.Path, startup_out: Optional[pathlib.Path]):
    """Injects pw_stm32cube_Init before main in given ST startup script.

    Args:
        startup_in: path to startup_*.s file
        startup_out: path to write generated startup file or None.
                    If None, output startup script printed to stdout
    """
    with open(startup_in, 'rb') as startup_in_file:
        startup_in_str = startup_in_file.read().decode('utf-8',
                                                       errors='ignore')

    startup_out_str = add_pre_main_init(startup_in_str)

    if startup_out:
        with open(startup_out, 'w') as startup_out_file:
            startup_out_file.write(startup_out_str)
    else:
        print(startup_out_str)
