153aa9179Sopenharmony_ci#!/usr/bin/env python
253aa9179Sopenharmony_ci# -*- coding: utf-8 -*-
353aa9179Sopenharmony_ci
453aa9179Sopenharmony_ci#
553aa9179Sopenharmony_ci# Copyright (c) 2022 Huawei Device Co., Ltd.
653aa9179Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
753aa9179Sopenharmony_ci# you may not use this file except in compliance with the License.
853aa9179Sopenharmony_ci# You may obtain a copy of the License at
953aa9179Sopenharmony_ci#
1053aa9179Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
1153aa9179Sopenharmony_ci#
1253aa9179Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
1353aa9179Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
1453aa9179Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1553aa9179Sopenharmony_ci# See the License for the specific language governing permissions and
1653aa9179Sopenharmony_ci# limitations under the License.
1753aa9179Sopenharmony_ci#
1853aa9179Sopenharmony_ci
1953aa9179Sopenharmony_ciimport argparse
2053aa9179Sopenharmony_ciimport json
2153aa9179Sopenharmony_ciimport os
2253aa9179Sopenharmony_ciimport re
2353aa9179Sopenharmony_ci
2453aa9179Sopenharmony_ci
2553aa9179Sopenharmony_ciclass ConfigHeader:
2653aa9179Sopenharmony_ci
2753aa9179Sopenharmony_ci    def __init__(self, config_json_path):
2853aa9179Sopenharmony_ci        self.read_buffer = []
2953aa9179Sopenharmony_ci        self.write_buffer = []
3053aa9179Sopenharmony_ci        with os.fdopen(os.open(config_json_path, os.O_RDONLY, 0o755), 'r') as file:
3153aa9179Sopenharmony_ci            self.configs = json.load(file)
3253aa9179Sopenharmony_ci
3353aa9179Sopenharmony_ci    def parse_file(self, file_path):
3453aa9179Sopenharmony_ci        with os.fdopen(os.open(file_path, os.O_RDONLY, 0o755), 'r') as file:
3553aa9179Sopenharmony_ci            self.read_buffer = file.readlines()
3653aa9179Sopenharmony_ci        for item in self.read_buffer:
3753aa9179Sopenharmony_ci            if not item.startswith("#cmakedefine") and not item.startswith("#define"):
3853aa9179Sopenharmony_ci                self.write_buffer.append(item)
3953aa9179Sopenharmony_ci                continue
4053aa9179Sopenharmony_ci
4153aa9179Sopenharmony_ci            value = item
4253aa9179Sopenharmony_ci            if item.startswith("#cmakedefine"):
4353aa9179Sopenharmony_ci                value = item.replace("#cmakedefine", "#define")
4453aa9179Sopenharmony_ci            match_object = re.search(r' \w+ ', value)
4553aa9179Sopenharmony_ci            if match_object is None:
4653aa9179Sopenharmony_ci                self.write_buffer.append("/* " + item + " */")
4753aa9179Sopenharmony_ci                continue
4853aa9179Sopenharmony_ci            key = match_object.group()
4953aa9179Sopenharmony_ci            key_index = key.replace(" ", "")
5053aa9179Sopenharmony_ci            if key_index not in self.configs:
5153aa9179Sopenharmony_ci                self.write_buffer.append("/* " + item + " */")
5253aa9179Sopenharmony_ci                continue
5353aa9179Sopenharmony_ci
5453aa9179Sopenharmony_ci            match_object = re.search(r'@\w+@', value)
5553aa9179Sopenharmony_ci            if match_object is None:
5653aa9179Sopenharmony_ci                self.write_buffer.append(value)
5753aa9179Sopenharmony_ci                continue
5853aa9179Sopenharmony_ci            key = match_object.group()
5953aa9179Sopenharmony_ci            key_index = key.replace("@", "")
6053aa9179Sopenharmony_ci            if key_index not in self.configs:
6153aa9179Sopenharmony_ci                self.write_buffer.append("/* " + item + " */")
6253aa9179Sopenharmony_ci                continue
6353aa9179Sopenharmony_ci            value = value.replace(key, self.configs[key_index])
6453aa9179Sopenharmony_ci            self.write_buffer.append(value)
6553aa9179Sopenharmony_ci
6653aa9179Sopenharmony_ci    def write_file(self, file_path):
6753aa9179Sopenharmony_ci        with os.fdopen(os.open(file_path, os.O_WRONLY | os.O_CREAT, 0o755), 'w') as file:
6853aa9179Sopenharmony_ci            file.writelines(self.write_buffer)
6953aa9179Sopenharmony_ci
7053aa9179Sopenharmony_ci
7153aa9179Sopenharmony_ciclass XmlVersionHeader:
7253aa9179Sopenharmony_ci
7353aa9179Sopenharmony_ci    def __init__(self, xmlversion_json_path):
7453aa9179Sopenharmony_ci        self.read_buffer = []
7553aa9179Sopenharmony_ci        self.write_buffer = []
7653aa9179Sopenharmony_ci        with os.fdopen(os.open(xmlversion_json_path, os.O_RDONLY, 0o755), 'r') as file:
7753aa9179Sopenharmony_ci            self.configs = json.load(file)
7853aa9179Sopenharmony_ci
7953aa9179Sopenharmony_ci    def parse_file(self, file_path):
8053aa9179Sopenharmony_ci        with os.fdopen(os.open(file_path, os.O_RDONLY, 0o755), 'r') as file:
8153aa9179Sopenharmony_ci            self.read_buffer = file.readlines()
8253aa9179Sopenharmony_ci        for item in self.read_buffer:
8353aa9179Sopenharmony_ci            if not item.startswith("#if") and not item.startswith("#define"):
8453aa9179Sopenharmony_ci                self.write_buffer.append(item)
8553aa9179Sopenharmony_ci                continue
8653aa9179Sopenharmony_ci
8753aa9179Sopenharmony_ci            match_object = re.search(r'@\w+@', item)
8853aa9179Sopenharmony_ci            if match_object is None:
8953aa9179Sopenharmony_ci                self.write_buffer.append(item)
9053aa9179Sopenharmony_ci                continue
9153aa9179Sopenharmony_ci            key = match_object.group()
9253aa9179Sopenharmony_ci            index_key = key.replace("@", "")
9353aa9179Sopenharmony_ci            value = ""
9453aa9179Sopenharmony_ci            if index_key in self.configs:
9553aa9179Sopenharmony_ci                value = item.replace(key, self.configs[index_key])
9653aa9179Sopenharmony_ci            else:
9753aa9179Sopenharmony_ci                value = item.replace(key, "0")
9853aa9179Sopenharmony_ci            self.write_buffer.append(value)
9953aa9179Sopenharmony_ci
10053aa9179Sopenharmony_ci    def write_file(self, file_path):
10153aa9179Sopenharmony_ci        with os.fdopen(os.open(file_path, os.O_WRONLY | os.O_CREAT, 0o755), 'w') as file:
10253aa9179Sopenharmony_ci            file.writelines(self.write_buffer)
10353aa9179Sopenharmony_ci
10453aa9179Sopenharmony_ciif __name__ == "__main__":
10553aa9179Sopenharmony_ci    parser = argparse.ArgumentParser()
10653aa9179Sopenharmony_ci    parser.add_argument('--config-input-path', help='input path to config.h')
10753aa9179Sopenharmony_ci    parser.add_argument('--config-path', help='output path to config.h')
10853aa9179Sopenharmony_ci    parser.add_argument('--xmlversion-input-path', help='input path to xmlversion.h')
10953aa9179Sopenharmony_ci    parser.add_argument('--xmlversion-path', help='output path to xmlversion.h')
11053aa9179Sopenharmony_ci    parser.add_argument('--config-json', help='config value for config.h')
11153aa9179Sopenharmony_ci    parser.add_argument('--xmlversion-json', help='config value for xmlversion.h')
11253aa9179Sopenharmony_ci    options = parser.parse_args()
11353aa9179Sopenharmony_ci    config_header = ConfigHeader(options.config_json)
11453aa9179Sopenharmony_ci    config_header.parse_file(options.config_input_path)
11553aa9179Sopenharmony_ci    config_header.write_file(options.config_path)
11653aa9179Sopenharmony_ci
11753aa9179Sopenharmony_ci    xmlversion_header = XmlVersionHeader(options.xmlversion_json)
11853aa9179Sopenharmony_ci    xmlversion_header.parse_file(options.xmlversion_input_path)
11953aa9179Sopenharmony_ci    xmlversion_header.write_file(options.xmlversion_path)
120