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