1bae44755Sopenharmony_ci#!/usr/bin/env python3 2bae44755Sopenharmony_ci# -*- coding: utf-8 -*- 3bae44755Sopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd. 4bae44755Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 5bae44755Sopenharmony_ci# you may not use this file except in compliance with the License. 6bae44755Sopenharmony_ci# You may obtain a copy of the License at 7bae44755Sopenharmony_ci# 8bae44755Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 9bae44755Sopenharmony_ci# 10bae44755Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 11bae44755Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 12bae44755Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bae44755Sopenharmony_ci# See the License for the specific language governing permissions and 14bae44755Sopenharmony_ci# limitations under the License. 15bae44755Sopenharmony_ci 16bae44755Sopenharmony_ci''' 17bae44755Sopenharmony_ci注意: 18bae44755Sopenharmony_ci1. 扩展syscap头文件的枚举定义,须在开始位置标记最小值,且必须大于等于500。 19bae44755Sopenharmony_ci''' 20bae44755Sopenharmony_ciimport argparse 21bae44755Sopenharmony_ciimport os 22bae44755Sopenharmony_ci 23bae44755Sopenharmony_ciLICENCE = '''/* 24bae44755Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 25bae44755Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 26bae44755Sopenharmony_ci * you may not use this file except in compliance with the License. 27bae44755Sopenharmony_ci * You may obtain a copy of the License at 28bae44755Sopenharmony_ci * 29bae44755Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 30bae44755Sopenharmony_ci * 31bae44755Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 32bae44755Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 33bae44755Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 34bae44755Sopenharmony_ci * See the License for the specific language governing permissions and 35bae44755Sopenharmony_ci * limitations under the License. 36bae44755Sopenharmony_ci */ 37bae44755Sopenharmony_ci 38bae44755Sopenharmony_ci''' 39bae44755Sopenharmony_ci 40bae44755Sopenharmony_ciBEFORE_ENUM = '''#ifndef SYSCAP_DEFINE_H 41bae44755Sopenharmony_ci#define SYSCAP_DEFINE_H 42bae44755Sopenharmony_ci 43bae44755Sopenharmony_ci#include <stdint.h> 44bae44755Sopenharmony_ci 45bae44755Sopenharmony_ci#define SINGLE_SYSCAP_LEN (256 + 17) 46bae44755Sopenharmony_ci#ifdef __cplusplus 47bae44755Sopenharmony_ci#if __cplusplus 48bae44755Sopenharmony_ciextern "C" { 49bae44755Sopenharmony_ci#endif /* __cplusplus */ 50bae44755Sopenharmony_ci#endif /* __cplusplus */ 51bae44755Sopenharmony_ci 52bae44755Sopenharmony_citypedef struct SystemCapabilityWithNum { 53bae44755Sopenharmony_ci char str[SINGLE_SYSCAP_LEN]; 54bae44755Sopenharmony_ci uint16_t num; 55bae44755Sopenharmony_ci} SyscapWithNum; 56bae44755Sopenharmony_ci 57bae44755Sopenharmony_ci/* 58bae44755Sopenharmony_ci * New SyscapNum must be added last and 59bae44755Sopenharmony_ci * don't delete anyone, just comment after it. 60bae44755Sopenharmony_ci */ 61bae44755Sopenharmony_ci''' 62bae44755Sopenharmony_ci 63bae44755Sopenharmony_ciAFTER_STRUCT = ''' 64bae44755Sopenharmony_ci#ifdef __cplusplus 65bae44755Sopenharmony_ci#if __cplusplus 66bae44755Sopenharmony_ci} 67bae44755Sopenharmony_ci#endif /* __cplusplus */ 68bae44755Sopenharmony_ci#endif /* __cplusplus */ 69bae44755Sopenharmony_ci#endif // SYSCAP_DEFINE_H 70bae44755Sopenharmony_ci''' 71bae44755Sopenharmony_ci 72bae44755Sopenharmony_ci 73bae44755Sopenharmony_cidef gen_define_enum(enum:list): 74bae44755Sopenharmony_ci header = 'typedef enum SystemCapabilityNum {\n' 75bae44755Sopenharmony_ci tail = '} SyscapNum;\n\n' 76bae44755Sopenharmony_ci trunk = ''.join(enum) 77bae44755Sopenharmony_ci return header + trunk + tail 78bae44755Sopenharmony_ci 79bae44755Sopenharmony_ci 80bae44755Sopenharmony_cidef gen_define_array(stru:list): 81bae44755Sopenharmony_ci header = 'const static SyscapWithNum g_arraySyscap[] = {\n' 82bae44755Sopenharmony_ci tail = '};\n\n' 83bae44755Sopenharmony_ci trunk = ''.join(stru) 84bae44755Sopenharmony_ci return header + trunk + tail 85bae44755Sopenharmony_ci 86bae44755Sopenharmony_ci 87bae44755Sopenharmony_cidef read_syscap(path): 88bae44755Sopenharmony_ci syscap_enum = [] 89bae44755Sopenharmony_ci op_flag = False 90bae44755Sopenharmony_ci with open(path, 'r') as fb: 91bae44755Sopenharmony_ci f = fb.readlines() 92bae44755Sopenharmony_ci for line in f: 93bae44755Sopenharmony_ci if line.startswith('typedef enum '): 94bae44755Sopenharmony_ci op_flag = True 95bae44755Sopenharmony_ci continue 96bae44755Sopenharmony_ci elif op_flag and line.startswith('}'): 97bae44755Sopenharmony_ci break 98bae44755Sopenharmony_ci if op_flag: 99bae44755Sopenharmony_ci syscap_enum.append(line) 100bae44755Sopenharmony_ci 101bae44755Sopenharmony_ci syscap_stru = [] 102bae44755Sopenharmony_ci op_flag = False 103bae44755Sopenharmony_ci for line in f: 104bae44755Sopenharmony_ci if line.startswith('const static SyscapWithNum '): 105bae44755Sopenharmony_ci op_flag = True 106bae44755Sopenharmony_ci continue 107bae44755Sopenharmony_ci elif op_flag and line.startswith('}'): 108bae44755Sopenharmony_ci op_flag = False 109bae44755Sopenharmony_ci break 110bae44755Sopenharmony_ci if op_flag: 111bae44755Sopenharmony_ci syscap_stru.append(line) 112bae44755Sopenharmony_ci 113bae44755Sopenharmony_ci return syscap_enum, syscap_stru 114bae44755Sopenharmony_ci 115bae44755Sopenharmony_ci 116bae44755Sopenharmony_cidef merge_define(base, extern): 117bae44755Sopenharmony_ci base_enmu, base_stru = read_syscap(base) 118bae44755Sopenharmony_ci ext_enmu, ext_stru = read_syscap(extern) 119bae44755Sopenharmony_ci 120bae44755Sopenharmony_ci if '500' in base_enmu[-1] and '500,' in ext_enmu[0]: 121bae44755Sopenharmony_ci res_enmu = base_enmu[:-1] + ext_enmu 122bae44755Sopenharmony_ci else: 123bae44755Sopenharmony_ci res_enmu = base_enmu + ext_enmu 124bae44755Sopenharmony_ci 125bae44755Sopenharmony_ci res_stru = base_stru + ext_stru 126bae44755Sopenharmony_ci return res_enmu, res_stru 127bae44755Sopenharmony_ci 128bae44755Sopenharmony_ci 129bae44755Sopenharmony_cidef assemble_header_file(fenum, fstru): 130bae44755Sopenharmony_ci enum, stru = merge_define(fenum, fstru) 131bae44755Sopenharmony_ci enum_def = gen_define_enum(enum) 132bae44755Sopenharmony_ci stru_def = gen_define_array(stru) 133bae44755Sopenharmony_ci return LICENCE + BEFORE_ENUM + enum_def + stru_def + AFTER_STRUCT 134bae44755Sopenharmony_ci 135bae44755Sopenharmony_ci 136bae44755Sopenharmony_cidef parse_args(): 137bae44755Sopenharmony_ci parser = argparse.ArgumentParser() 138bae44755Sopenharmony_ci parser.add_argument('--base', 139bae44755Sopenharmony_ci help='base syscap config header.') 140bae44755Sopenharmony_ci parser.add_argument('--extern', 141bae44755Sopenharmony_ci help='extern syscap config header.') 142bae44755Sopenharmony_ci parser.add_argument('--output', 143bae44755Sopenharmony_ci help='output app file') 144bae44755Sopenharmony_ci arguments = parser.parse_args() 145bae44755Sopenharmony_ci return arguments 146bae44755Sopenharmony_ci 147bae44755Sopenharmony_ci 148bae44755Sopenharmony_ciif __name__ == '__main__': 149bae44755Sopenharmony_ci args = parse_args() 150bae44755Sopenharmony_ci base_file = args.base 151bae44755Sopenharmony_ci extern_file = args.extern 152bae44755Sopenharmony_ci output_file = args.output 153bae44755Sopenharmony_ci 154bae44755Sopenharmony_ci full = assemble_header_file(base_file, extern_file) 155bae44755Sopenharmony_ci with os.fdopen(os.open(output_file, os.O_WRONLY | os.O_CREAT, mode=0o640), 'w') as out: 156bae44755Sopenharmony_ci out.writelines(full) 157bae44755Sopenharmony_ci 158