1d9f0492fSopenharmony_ci#!/usr/bin/env python 2d9f0492fSopenharmony_ci# -*- coding: utf-8 -*- 3d9f0492fSopenharmony_ci 4d9f0492fSopenharmony_ci# 5d9f0492fSopenharmony_ci# Copyright (c) 2022 Huawei Device Co., Ltd. 6d9f0492fSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 7d9f0492fSopenharmony_ci# you may not use this file except in compliance with the License. 8d9f0492fSopenharmony_ci# You may obtain a copy of the License at 9d9f0492fSopenharmony_ci# 10d9f0492fSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 11d9f0492fSopenharmony_ci# 12d9f0492fSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 13d9f0492fSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 14d9f0492fSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15d9f0492fSopenharmony_ci# See the License for the specific language governing permissions and 16d9f0492fSopenharmony_ci# limitations under the License. 17d9f0492fSopenharmony_ci# 18d9f0492fSopenharmony_ci 19d9f0492fSopenharmony_ciimport argparse 20d9f0492fSopenharmony_ciimport os 21d9f0492fSopenharmony_ciimport sys 22d9f0492fSopenharmony_ci 23d9f0492fSopenharmony_ci 24d9f0492fSopenharmony_cidef decode_cfg_line(data): 25d9f0492fSopenharmony_ci data.replace('\n', '').replace('\r', '') 26d9f0492fSopenharmony_ci data = data.strip() 27d9f0492fSopenharmony_ci if (len(data) == 0 or data[0] == '#'): 28d9f0492fSopenharmony_ci return "", "" 29d9f0492fSopenharmony_ci strs = data.split('=') 30d9f0492fSopenharmony_ci if len(strs) <= 1: 31d9f0492fSopenharmony_ci return "", "" 32d9f0492fSopenharmony_ci return strs[0].strip(), strs[1].strip() 33d9f0492fSopenharmony_ci 34d9f0492fSopenharmony_ci 35d9f0492fSopenharmony_cidef get_param_from_cfg(cfg_name): 36d9f0492fSopenharmony_ci data_dict = {} 37d9f0492fSopenharmony_ci with open(cfg_name) as afile: 38d9f0492fSopenharmony_ci data = afile.readline() 39d9f0492fSopenharmony_ci while data: 40d9f0492fSopenharmony_ci name, value = decode_cfg_line(data) 41d9f0492fSopenharmony_ci if len(name) != 0 and len(value) != 0: 42d9f0492fSopenharmony_ci data_dict[name] = value 43d9f0492fSopenharmony_ci print("sample file name={%s %s}" % (name, value)) 44d9f0492fSopenharmony_ci data = afile.readline() 45d9f0492fSopenharmony_ci return data_dict 46d9f0492fSopenharmony_ci 47d9f0492fSopenharmony_ci 48d9f0492fSopenharmony_cidef decode_code_line(data): 49d9f0492fSopenharmony_ci data.replace('\n', '').replace('\r', '') 50d9f0492fSopenharmony_ci data = data.strip() 51d9f0492fSopenharmony_ci if (not data.startswith("PARAM_MAP")): 52d9f0492fSopenharmony_ci return "", "" 53d9f0492fSopenharmony_ci data_len = len(data) 54d9f0492fSopenharmony_ci data = data[len("PARAM_MAP") + 1 : data_len - 1] 55d9f0492fSopenharmony_ci data = data.strip() 56d9f0492fSopenharmony_ci strs = data.split(',') 57d9f0492fSopenharmony_ci if len(strs) <= 1: 58d9f0492fSopenharmony_ci return "", "" 59d9f0492fSopenharmony_ci return strs[0].strip(), data[len(strs[0]) + 1:].strip() 60d9f0492fSopenharmony_ci 61d9f0492fSopenharmony_ci 62d9f0492fSopenharmony_cidef get_param_from_c_code(code_name): 63d9f0492fSopenharmony_ci data_dict = {} 64d9f0492fSopenharmony_ci with open(code_name, "r+") as afile: 65d9f0492fSopenharmony_ci data = afile.readline() 66d9f0492fSopenharmony_ci while data: 67d9f0492fSopenharmony_ci name, value = decode_code_line(data) 68d9f0492fSopenharmony_ci if len(name) != 0 and len(value) != 0: 69d9f0492fSopenharmony_ci data_dict[name] = value 70d9f0492fSopenharmony_ci data = afile.readline() 71d9f0492fSopenharmony_ci afile.truncate(0) 72d9f0492fSopenharmony_ci return data_dict 73d9f0492fSopenharmony_ci 74d9f0492fSopenharmony_ci 75d9f0492fSopenharmony_cidef write_map_to_code(code_name, data_dict): 76d9f0492fSopenharmony_ci try: 77d9f0492fSopenharmony_ci with open(code_name, "w") as f: 78d9f0492fSopenharmony_ci # start with 0 79d9f0492fSopenharmony_ci f.seek(0) 80d9f0492fSopenharmony_ci # write file header 81d9f0492fSopenharmony_ci f.write('#ifndef PARAM_LITE_DEF_CFG_' + os.linesep) 82d9f0492fSopenharmony_ci f.write('#define PARAM_LITE_DEF_CFG_' + os.linesep) 83d9f0492fSopenharmony_ci f.write('#include <stdint.h>' + os.linesep + os.linesep) 84d9f0492fSopenharmony_ci f.write('#ifdef __cplusplus' + os.linesep) 85d9f0492fSopenharmony_ci f.write('#if __cplusplus' + os.linesep) 86d9f0492fSopenharmony_ci f.write('extern "C" {' + os.linesep) 87d9f0492fSopenharmony_ci f.write('#endif' + os.linesep) 88d9f0492fSopenharmony_ci f.write('#endif' + os.linesep + os.linesep) 89d9f0492fSopenharmony_ci 90d9f0492fSopenharmony_ci #define struct 91d9f0492fSopenharmony_ci f.write('typedef struct Node_ {' + os.linesep) 92d9f0492fSopenharmony_ci f.write(' const char *name;' + os.linesep) 93d9f0492fSopenharmony_ci f.write(' const char *value;' + os.linesep) 94d9f0492fSopenharmony_ci f.write('} Node;' + os.linesep + os.linesep) 95d9f0492fSopenharmony_ci f.write('#define PARAM_MAP(name, value) {(const char *)#name, (const char *)#value},') 96d9f0492fSopenharmony_ci f.write(os.linesep + os.linesep) 97d9f0492fSopenharmony_ci # write data 98d9f0492fSopenharmony_ci f.write('static Node g_paramDefCfgNodes[] = {' + os.linesep) 99d9f0492fSopenharmony_ci for name, value in data_dict.items(): 100d9f0492fSopenharmony_ci if (value.startswith("\"")): 101d9f0492fSopenharmony_ci tmp_str = " PARAM_MAP({0}, {1})".format(name, value) 102d9f0492fSopenharmony_ci f.write(tmp_str + os.linesep) 103d9f0492fSopenharmony_ci else: 104d9f0492fSopenharmony_ci tmp_str = " PARAM_MAP({0}, \"{1}\")".format(name, value) 105d9f0492fSopenharmony_ci f.write(tmp_str + os.linesep) 106d9f0492fSopenharmony_ci f.write('};' + os.linesep + os.linesep) 107d9f0492fSopenharmony_ci 108d9f0492fSopenharmony_ci #end 109d9f0492fSopenharmony_ci f.write('#ifdef __cplusplus' + os.linesep) 110d9f0492fSopenharmony_ci f.write('#if __cplusplus' + os.linesep) 111d9f0492fSopenharmony_ci f.write('}' + os.linesep) 112d9f0492fSopenharmony_ci f.write('#endif' + os.linesep) 113d9f0492fSopenharmony_ci f.write('#endif' + os.linesep) 114d9f0492fSopenharmony_ci f.write('#endif // PARAM_LITE_DEF_CFG_' + os.linesep) 115d9f0492fSopenharmony_ci f.write(os.linesep) 116d9f0492fSopenharmony_ci f.truncate() 117d9f0492fSopenharmony_ci except IOError: 118d9f0492fSopenharmony_ci print("Error: open or write file %s fail" % {code_name}) 119d9f0492fSopenharmony_ci return 0 120d9f0492fSopenharmony_ci 121d9f0492fSopenharmony_ci 122d9f0492fSopenharmony_cidef add_to_code_dict(code_dict, cfg_dict, high=True): 123d9f0492fSopenharmony_ci for name, value in cfg_dict.items(): 124d9f0492fSopenharmony_ci # check if name exit 125d9f0492fSopenharmony_ci has_key = name in code_dict 126d9f0492fSopenharmony_ci if has_key and high: 127d9f0492fSopenharmony_ci code_dict[name] = value 128d9f0492fSopenharmony_ci elif not has_key: 129d9f0492fSopenharmony_ci code_dict[name] = value 130d9f0492fSopenharmony_ci return code_dict 131d9f0492fSopenharmony_ci 132d9f0492fSopenharmony_ci 133d9f0492fSopenharmony_cidef main(): 134d9f0492fSopenharmony_ci parser = argparse.ArgumentParser( 135d9f0492fSopenharmony_ci description='A common change param.para file to h.') 136d9f0492fSopenharmony_ci parser.add_argument( 137d9f0492fSopenharmony_ci '--source', 138d9f0492fSopenharmony_ci action='append', 139d9f0492fSopenharmony_ci help='The source to change.', 140d9f0492fSopenharmony_ci required=True) 141d9f0492fSopenharmony_ci parser.add_argument( 142d9f0492fSopenharmony_ci '--dest_dir', 143d9f0492fSopenharmony_ci help='Path that the source should be changed to.', 144d9f0492fSopenharmony_ci required=True) 145d9f0492fSopenharmony_ci args = parser.parse_args() 146d9f0492fSopenharmony_ci 147d9f0492fSopenharmony_ci out_dir = args.dest_dir 148d9f0492fSopenharmony_ci if not os.path.exists(out_dir): 149d9f0492fSopenharmony_ci os.makedirs(out_dir, exist_ok=True) 150d9f0492fSopenharmony_ci print("out_dir {}".format(out_dir)) 151d9f0492fSopenharmony_ci 152d9f0492fSopenharmony_ci for source in args.source: 153d9f0492fSopenharmony_ci print("source {}".format(out_dir)) 154d9f0492fSopenharmony_ci if not os.path.exists(source): 155d9f0492fSopenharmony_ci continue 156d9f0492fSopenharmony_ci 157d9f0492fSopenharmony_ci src_dict = get_param_from_cfg(source) 158d9f0492fSopenharmony_ci dst = "".join([out_dir, "param_cfg.h"]) 159d9f0492fSopenharmony_ci 160d9f0492fSopenharmony_ci if os.path.exists(dst): 161d9f0492fSopenharmony_ci dst_dict = get_param_from_c_code(dst) 162d9f0492fSopenharmony_ci else: 163d9f0492fSopenharmony_ci dst_dict = {} 164d9f0492fSopenharmony_ci 165d9f0492fSopenharmony_ci dst_dict = add_to_code_dict(dst_dict, src_dict, False) 166d9f0492fSopenharmony_ci write_map_to_code(dst, dst_dict) 167d9f0492fSopenharmony_ci return 0 168d9f0492fSopenharmony_ci 169d9f0492fSopenharmony_ci 170d9f0492fSopenharmony_ciif __name__ == '__main__': 171d9f0492fSopenharmony_ci sys.exit(main()) 172