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