15f9996aaSopenharmony_ci#!/usr/bin/env python
25f9996aaSopenharmony_ci# -*- coding: utf-8 -*-
35f9996aaSopenharmony_ci# Copyright (c) 2021-2023 Huawei Device Co., Ltd.
45f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
55f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
65f9996aaSopenharmony_ci# You may obtain a copy of the License at
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
95f9996aaSopenharmony_ci#
105f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
115f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
125f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
145f9996aaSopenharmony_ci# limitations under the License.
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_ciimport sys
175f9996aaSopenharmony_ciimport os
185f9996aaSopenharmony_ciimport stat
195f9996aaSopenharmony_ciimport json
205f9996aaSopenharmony_ciimport argparse
215f9996aaSopenharmony_ciimport zipfile
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_cifrom collections import Counter
245f9996aaSopenharmony_ci
255f9996aaSopenharmony_cisys.path.append(
265f9996aaSopenharmony_ci    os.path.dirname(
275f9996aaSopenharmony_ci        os.path.dirname(
285f9996aaSopenharmony_ci            os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
295f9996aaSopenharmony_ci
305f9996aaSopenharmony_cifrom third_party.PyYAML.lib import yaml  # noqa: E402
315f9996aaSopenharmony_ci
325f9996aaSopenharmony_ci_DUPLICATE_KEY_DEF = "duplicate key definition"
335f9996aaSopenharmony_ci_EMPTY_YAML = "empty yaml file input"
345f9996aaSopenharmony_ci_INVALID_YAML = "invalid yaml format"
355f9996aaSopenharmony_ci_DUPLICATE_DOMAIN = "duplicate domain"
365f9996aaSopenharmony_ci_INVALID_DOMAIN_NUMBER = "invalid domain number"
375f9996aaSopenharmony_ci_INVALID_DOMAIN_LENGTH = "invalid domain length"
385f9996aaSopenharmony_ci_INVALID_DOMAIN_CHAR = "invalid domain character"
395f9996aaSopenharmony_ci_INVALID_DOMAIN_CHAR_HEAD = "invalid domain character head"
405f9996aaSopenharmony_ci_INVALID_EVENT_NUMBER = "invalid event number"
415f9996aaSopenharmony_ci_INVALID_EVENT_LENGTH = "invalid event length"
425f9996aaSopenharmony_ci_INVALID_EVENT_CHAR = "invalid event character"
435f9996aaSopenharmony_ci_INVALID_EVENT_CHAR_HEAD = "invalid event character head"
445f9996aaSopenharmony_ci_MISSING_EVENT_BASE = "missing event base"
455f9996aaSopenharmony_ci_MISSING_EVENT_TYPE = "missing event type"
465f9996aaSopenharmony_ci_INVALID_EVENT_TYPE = "invalid event type"
475f9996aaSopenharmony_ci_MISSING_EVENT_LEVEL = "missing event level"
485f9996aaSopenharmony_ci_INVALID_EVENT_LEVEL = "invalid event level"
495f9996aaSopenharmony_ci_MISSING_EVENT_DESC = "missing event desc"
505f9996aaSopenharmony_ci_INVALID_EVENT_DESC_LENGTH = "invalid event desc length"
515f9996aaSopenharmony_ci_INVALID_EVENT_TAG_NUM = "invalid event tag number"
525f9996aaSopenharmony_ci_INVALID_EVENT_TAG_LEN = "invalid event tag length"
535f9996aaSopenharmony_ci_INVALID_EVENT_TAG_CHAR = "invalid event tag character"
545f9996aaSopenharmony_ci_DUPLICATE_EVENT_TAG = "duplicate event tag"
555f9996aaSopenharmony_ci_INVALID_EVENT_BASE_KEY = "invalid event base key"
565f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_NUM = "invalid event param number"
575f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_LEN = "invalid event param length"
585f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_CHAR = "invalid event param character"
595f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_CHAR_HEAD = "invalid event param character head"
605f9996aaSopenharmony_ci_MISSING_EVENT_PARAM_TYPE = "missing event param type"
615f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_TYPE = "invalid event param type"
625f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_ARRSIZE = "invalid event param arrsize"
635f9996aaSopenharmony_ci_MISSING_EVENT_PARAM_DESC = "missing event param desc"
645f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_DESC_LEN = "invalid event param desc length"
655f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_KEY = "invalid event param key"
665f9996aaSopenharmony_ci_DEPRECATED_EVENT_NAME_PREFIX = "deprecated event name prefix"
675f9996aaSopenharmony_ci_DEPRECATED_PARAM_NAME_PREFIX = "deprecated param name prefix"
685f9996aaSopenharmony_ci_DEPRECATED_TAG_NAME = "deprecated tag name"
695f9996aaSopenharmony_ci_DEPRECATED_EVENT_DESC_NAME = "deprecated event desc name"
705f9996aaSopenharmony_ci_DEPRECATED_PARAM_DESC_NAME = "deprecated param desc name"
715f9996aaSopenharmony_ci_INVALID_DOMAIN_DEF = "invalid definition type for domain"
725f9996aaSopenharmony_ci_INVALID_EVENT_DEF = "invalid definition type for event"
735f9996aaSopenharmony_ci_INVALID_EVENT_BASE_DEF = "invalid definition type for event base"
745f9996aaSopenharmony_ci_INVALID_EVENT_TYPE_DEF = "invalid definition type for event type"
755f9996aaSopenharmony_ci_INVALID_EVENT_LEVEL_DEF = "invalid definition type for event level"
765f9996aaSopenharmony_ci_INVALID_EVENT_DESC_DEF = "invalid definition type for event desc"
775f9996aaSopenharmony_ci_INVALID_EVENT_TAG_DEF = "invalid definition type for event tag"
785f9996aaSopenharmony_ci_INVALID_EVENT_PRESERVE_DEF = "invalid definition type for event preserve"
795f9996aaSopenharmony_ci_INVALID_EVENT_PARAM_DEF = "invalid definition type for event param"
805f9996aaSopenharmony_ci_INVALID_PARAM_TYPE_DEF = "invalid definition type for param type"
815f9996aaSopenharmony_ci_INVALID_PARAM_ARRSIZE_DEF = "invalid definition type for param arrsize"
825f9996aaSopenharmony_ci_INVALID_PARAM_DESC_DEF = "invalid definition type for param desc"
835f9996aaSopenharmony_ci_WARNING_MAP = {
845f9996aaSopenharmony_ci    _EMPTY_YAML :
855f9996aaSopenharmony_ci        "The yaml file list is empty.",
865f9996aaSopenharmony_ci    _INVALID_YAML :
875f9996aaSopenharmony_ci        "Invalid yaml file, error message: <<%s>>.",
885f9996aaSopenharmony_ci    _DUPLICATE_DOMAIN :
895f9996aaSopenharmony_ci        "Domain <<%s>> is already defined in <<%s>>.",
905f9996aaSopenharmony_ci    _INVALID_DOMAIN_NUMBER :
915f9996aaSopenharmony_ci        "The domain definition is missing in the yaml file.",
925f9996aaSopenharmony_ci    _INVALID_DOMAIN_LENGTH :
935f9996aaSopenharmony_ci        "The length of the domain must be between [1, 16], "\
945f9996aaSopenharmony_ci        "but the actual length of the domain <<%s>> is <<%d>>.",
955f9996aaSopenharmony_ci    _INVALID_DOMAIN_CHAR :
965f9996aaSopenharmony_ci        "The character of the domain must be in [A-Z0-9_], "\
975f9996aaSopenharmony_ci        "but the domain <<%s>> actually has <<%c>>.",
985f9996aaSopenharmony_ci    _INVALID_DOMAIN_CHAR_HEAD :
995f9996aaSopenharmony_ci        "The header of the domain must be in [A-Z], "\
1005f9996aaSopenharmony_ci        "but the actual header of the domain <<%s>> is <<%c>>.",
1015f9996aaSopenharmony_ci    _INVALID_EVENT_NUMBER :
1025f9996aaSopenharmony_ci        "The number of the events must be between [1, 4096], ."\
1035f9996aaSopenharmony_ci        "but there are actually <<%d>> events.",
1045f9996aaSopenharmony_ci    _INVALID_EVENT_LENGTH :
1055f9996aaSopenharmony_ci        "The length of the event must be between [1, 32], "\
1065f9996aaSopenharmony_ci        "but the actual length of the event <<%s>> is <<%d>>.",
1075f9996aaSopenharmony_ci    _INVALID_EVENT_CHAR :
1085f9996aaSopenharmony_ci        "The character of the event must be in [A-Z0-9_], "\
1095f9996aaSopenharmony_ci        "but the event <<%s>> actually has <<%c>>.",
1105f9996aaSopenharmony_ci    _INVALID_EVENT_CHAR_HEAD :
1115f9996aaSopenharmony_ci        "The header of the event must be in [A-Z], "\
1125f9996aaSopenharmony_ci        "but the actual header of the event <<%s>> is <<%c>>.",
1135f9996aaSopenharmony_ci    _MISSING_EVENT_BASE :
1145f9996aaSopenharmony_ci        "Event <<%s>> is missing __BASE definition.",
1155f9996aaSopenharmony_ci    _MISSING_EVENT_TYPE :
1165f9996aaSopenharmony_ci        "__BASE for event <<%s>> is missing type definition.",
1175f9996aaSopenharmony_ci    _INVALID_EVENT_TYPE :
1185f9996aaSopenharmony_ci        "The type of the event <<%s>> must be in "\
1195f9996aaSopenharmony_ci        "[FAULT, STATISTIC, SECURITY, BEHAVIOR], "\
1205f9996aaSopenharmony_ci        "but the actual event type is <<%s>>.",
1215f9996aaSopenharmony_ci    _MISSING_EVENT_LEVEL :
1225f9996aaSopenharmony_ci        "__BASE for event <<%s>> is missing level definition.",
1235f9996aaSopenharmony_ci    _INVALID_EVENT_LEVEL :
1245f9996aaSopenharmony_ci        "The level of the event <<%s>> must be in [CRITICAL, MINOR], "\
1255f9996aaSopenharmony_ci        "but the actual event level is <<%s>>.",
1265f9996aaSopenharmony_ci    _MISSING_EVENT_DESC :
1275f9996aaSopenharmony_ci        "__BASE for event <<%s>> is missing desc definition.",
1285f9996aaSopenharmony_ci    _INVALID_EVENT_DESC_LENGTH :
1295f9996aaSopenharmony_ci        "The length of the event desc must be between [3, 128], "\
1305f9996aaSopenharmony_ci        "but the actual length of the event <<%s>> desc <<%s>> is <<%d>>.",
1315f9996aaSopenharmony_ci    _INVALID_EVENT_TAG_NUM :
1325f9996aaSopenharmony_ci        "The number of the event tags must be between [0, 5], "\
1335f9996aaSopenharmony_ci        "but actually the event <<%s>> tag <<%s>> has <<%d>> tags.",
1345f9996aaSopenharmony_ci    _INVALID_EVENT_TAG_LEN :
1355f9996aaSopenharmony_ci        "The length of the event tag must be between [1, 16], "\
1365f9996aaSopenharmony_ci        "but the actual length of the event <<%s>> tag <<%s>> is <<%d>>.",
1375f9996aaSopenharmony_ci    _INVALID_EVENT_TAG_CHAR :
1385f9996aaSopenharmony_ci        "The character of the event tag must be in [A-Za-z0-9], "\
1395f9996aaSopenharmony_ci        "but the event <<%s>> tag <<%s>> actually has <<%c>>.",
1405f9996aaSopenharmony_ci    _DUPLICATE_EVENT_TAG :
1415f9996aaSopenharmony_ci        "Event tag should not be duplicated, "\
1425f9996aaSopenharmony_ci        "but tag <<%s>> for event <<%s>> has multiple identical.",
1435f9996aaSopenharmony_ci    _INVALID_EVENT_BASE_KEY :
1445f9996aaSopenharmony_ci        "Event <<%s>> __BASE key should be [type, level, tag, desc], "\
1455f9996aaSopenharmony_ci        "but actually has an invalid key <<%s>>.",
1465f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_NUM :
1475f9996aaSopenharmony_ci        "The number of the event param must be between [0, 128], "\
1485f9996aaSopenharmony_ci        "but actually the event <<%s>> has <<%d>> params.",
1495f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_LEN :
1505f9996aaSopenharmony_ci        "The length of the event param must be between [1, 32], "\
1515f9996aaSopenharmony_ci        "but the actual length of the event <<%s>> param <<%s>> is <<%d>>.",
1525f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_CHAR :
1535f9996aaSopenharmony_ci        "The character of the event param must be in [A-Z0-9_], "\
1545f9996aaSopenharmony_ci        "but the event <<%s>> param <<%s>> actually has <<%c>>.",
1555f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_CHAR_HEAD:
1565f9996aaSopenharmony_ci        "The header of the event param must be in [A-Z], "\
1575f9996aaSopenharmony_ci        "but the actual header of the event <<%s>> param <<%s>> is <<%c>>.",
1585f9996aaSopenharmony_ci    _MISSING_EVENT_PARAM_TYPE :
1595f9996aaSopenharmony_ci        "Event <<%s>> param <<%s>> is missing type definition.",
1605f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_TYPE :
1615f9996aaSopenharmony_ci        "The type of the event <<%s>> param <<%s>> must be in "\
1625f9996aaSopenharmony_ci        "[BOOL, INT8, UINT8, INT16, UINT16, INT32, UINT32, INT64, UINT64, "\
1635f9996aaSopenharmony_ci        "FLOAT, DOUBLE, STRING], but the actual type is <<%s>>.",
1645f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_ARRSIZE :
1655f9996aaSopenharmony_ci        "The arrsize of the event param must be between [1, 100], "\
1665f9996aaSopenharmony_ci        "but the actual arrsize of the event <<%s>> param <<%s>> is <<%d>>.",
1675f9996aaSopenharmony_ci    _MISSING_EVENT_PARAM_DESC :
1685f9996aaSopenharmony_ci        "Event <<%s>> param <<%s>> is missing desc definition.",
1695f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_DESC_LEN :
1705f9996aaSopenharmony_ci        "The length of the event param desc must be between [3, 128], "\
1715f9996aaSopenharmony_ci        "but the actual length of the event <<%s>> param <<%s>> "\
1725f9996aaSopenharmony_ci        "desc <<%s>> is <<%d>>.",
1735f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_KEY :
1745f9996aaSopenharmony_ci        "Event <<%s>> param <<%s>> key should be [type, arrsize, desc], "\
1755f9996aaSopenharmony_ci        "but actually has an invalid key <<%s>>.",
1765f9996aaSopenharmony_ci    _DEPRECATED_EVENT_NAME_PREFIX :
1775f9996aaSopenharmony_ci        "Event <<%s>> should not start with domain <<%s>>.",
1785f9996aaSopenharmony_ci    _DEPRECATED_PARAM_NAME_PREFIX :
1795f9996aaSopenharmony_ci        "Event param <<%s>> should not start with event <<%s>>.",
1805f9996aaSopenharmony_ci    _DEPRECATED_TAG_NAME :
1815f9996aaSopenharmony_ci        "Event tag <<%s>> should not be same as %s <<%s>>.",
1825f9996aaSopenharmony_ci    _DEPRECATED_EVENT_DESC_NAME :
1835f9996aaSopenharmony_ci        "Event desc <<%s>> should not be same as event <<%s>> and "\
1845f9996aaSopenharmony_ci        "should be more detailed.",
1855f9996aaSopenharmony_ci    _DEPRECATED_PARAM_DESC_NAME :
1865f9996aaSopenharmony_ci        "Event param desc <<%s>> should not be same as event <<%s>> "\
1875f9996aaSopenharmony_ci        "param <<%s>> and should be more detailed.",
1885f9996aaSopenharmony_ci    _INVALID_DOMAIN_DEF :
1895f9996aaSopenharmony_ci        "The definition type of the domain must be string.",
1905f9996aaSopenharmony_ci    _INVALID_EVENT_DEF :
1915f9996aaSopenharmony_ci        "The definition type of the event <<%s>> must be dictionary.",
1925f9996aaSopenharmony_ci    _INVALID_EVENT_BASE_DEF :
1935f9996aaSopenharmony_ci        "The definition type of the event <<%s>> __BASE must be dictionary.",
1945f9996aaSopenharmony_ci    _INVALID_EVENT_TYPE_DEF :
1955f9996aaSopenharmony_ci        "The definition type of the event <<%s>> type must be string.",
1965f9996aaSopenharmony_ci    _INVALID_EVENT_LEVEL_DEF :
1975f9996aaSopenharmony_ci        "The definition type of the event <<%s>> level must be string.",
1985f9996aaSopenharmony_ci    _INVALID_EVENT_DESC_DEF :
1995f9996aaSopenharmony_ci        "The definition type of the event <<%s>> desc must be string.",
2005f9996aaSopenharmony_ci    _INVALID_EVENT_TAG_DEF :
2015f9996aaSopenharmony_ci        "The definition type of the event <<%s>> tag must be string.",
2025f9996aaSopenharmony_ci    _INVALID_EVENT_PRESERVE_DEF :
2035f9996aaSopenharmony_ci        "The definition type of the event <<%s>> preserve must be bool.",
2045f9996aaSopenharmony_ci    _INVALID_EVENT_PARAM_DEF :
2055f9996aaSopenharmony_ci        "The definition type of the event <<%s>> param <<%s>> "\
2065f9996aaSopenharmony_ci        "must be dictionary.",
2075f9996aaSopenharmony_ci    _INVALID_PARAM_TYPE_DEF :
2085f9996aaSopenharmony_ci        "The definition type of the event <<%s>> param <<%s>> "\
2095f9996aaSopenharmony_ci        "type must be string.",
2105f9996aaSopenharmony_ci    _INVALID_PARAM_ARRSIZE_DEF :
2115f9996aaSopenharmony_ci        "The definition type of the event <<%s>> param <<%s>> "\
2125f9996aaSopenharmony_ci        "arrsize must be integer.",
2135f9996aaSopenharmony_ci    _INVALID_PARAM_DESC_DEF :
2145f9996aaSopenharmony_ci        "The definition type of the event <<%s>> param <<%s>> "\
2155f9996aaSopenharmony_ci        "desc must be string.",
2165f9996aaSopenharmony_ci    _DUPLICATE_KEY_DEF :
2175f9996aaSopenharmony_ci        "Duplicate key <<%s>> exists%s.",
2185f9996aaSopenharmony_ci}
2195f9996aaSopenharmony_ci
2205f9996aaSopenharmony_ci
2215f9996aaSopenharmony_ci_domain_dict = {}
2225f9996aaSopenharmony_ci_warning_dict = {}
2235f9996aaSopenharmony_ci_warning_file_path = ""
2245f9996aaSopenharmony_ci_yaml_file_path = ""
2255f9996aaSopenharmony_ci_warning_file = None
2265f9996aaSopenharmony_ci_hisysevent_parse_res = True
2275f9996aaSopenharmony_ci_deprecated_dict = {}
2285f9996aaSopenharmony_ci
2295f9996aaSopenharmony_ci
2305f9996aaSopenharmony_ciclass _UniqueKeySafeLoader(yaml.SafeLoader):
2315f9996aaSopenharmony_ci    def construct_mapping(self, node, deep=False):
2325f9996aaSopenharmony_ci        mapping = []
2335f9996aaSopenharmony_ci        for key_node, value_node in node.value:
2345f9996aaSopenharmony_ci            key = self.construct_object(key_node, deep=deep)
2355f9996aaSopenharmony_ci            if (key in mapping):
2365f9996aaSopenharmony_ci                _build_warning_info(_DUPLICATE_KEY_DEF,
2375f9996aaSopenharmony_ci                    (key, key_node.start_mark))
2385f9996aaSopenharmony_ci                global _hisysevent_parse_res
2395f9996aaSopenharmony_ci                _hisysevent_parse_res = False
2405f9996aaSopenharmony_ci                continue
2415f9996aaSopenharmony_ci            mapping.append(key)
2425f9996aaSopenharmony_ci        return super().construct_mapping(node, deep)
2435f9996aaSopenharmony_ci
2445f9996aaSopenharmony_ci
2455f9996aaSopenharmony_cidef _build_header(info_dict: dict):
2465f9996aaSopenharmony_ci    table_header = "HiSysEvent yaml file: <<%s>>" % _yaml_file_path
2475f9996aaSopenharmony_ci    info_dict[_yaml_file_path] = [table_header]
2485f9996aaSopenharmony_ci    table_boundary = "-".rjust(100, '-')
2495f9996aaSopenharmony_ci    info_dict[_yaml_file_path].append(table_boundary)
2505f9996aaSopenharmony_ci    table_title = "Failed Item".ljust(50) + "|    " + "Failed Reason"
2515f9996aaSopenharmony_ci    info_dict[_yaml_file_path].append(table_title)
2525f9996aaSopenharmony_ci    info_dict[_yaml_file_path].append(table_boundary)
2535f9996aaSopenharmony_ci
2545f9996aaSopenharmony_ci
2555f9996aaSopenharmony_cidef _build_warning_header():
2565f9996aaSopenharmony_ci    global _warning_dict
2575f9996aaSopenharmony_ci    _build_header(_warning_dict)
2585f9996aaSopenharmony_ci
2595f9996aaSopenharmony_ci
2605f9996aaSopenharmony_cidef _build_deprecated_header():
2615f9996aaSopenharmony_ci    global _deprecated_dict
2625f9996aaSopenharmony_ci    _build_header(_deprecated_dict)
2635f9996aaSopenharmony_ci
2645f9996aaSopenharmony_ci
2655f9996aaSopenharmony_cidef _build_warning_info(item, values):
2665f9996aaSopenharmony_ci    detail = _WARNING_MAP[item] % values
2675f9996aaSopenharmony_ci    content = item.ljust(50) + "|    " + detail
2685f9996aaSopenharmony_ci    global _warning_dict
2695f9996aaSopenharmony_ci    _warning_dict[_yaml_file_path].append(content)
2705f9996aaSopenharmony_ci
2715f9996aaSopenharmony_ci
2725f9996aaSopenharmony_ci# Current set to warning, subsequent set to error.
2735f9996aaSopenharmony_cidef _build_deprecated_info(item, values):
2745f9996aaSopenharmony_ci    _build_deprecated_header()
2755f9996aaSopenharmony_ci    detail = _WARNING_MAP[item] % values
2765f9996aaSopenharmony_ci    content = item.ljust(50) + "|    " + detail
2775f9996aaSopenharmony_ci    global _deprecated_dict
2785f9996aaSopenharmony_ci    _deprecated_dict[_yaml_file_path].append(content)
2795f9996aaSopenharmony_ci
2805f9996aaSopenharmony_ci
2815f9996aaSopenharmony_cidef _open_warning_file(output_path: str):
2825f9996aaSopenharmony_ci    global _warning_file_path
2835f9996aaSopenharmony_ci    _warning_file_path = os.path.join(output_path, 'hisysevent_warning.txt')
2845f9996aaSopenharmony_ci    global _warning_file
2855f9996aaSopenharmony_ci    _warning_file = open(_warning_file_path, 'w+')
2865f9996aaSopenharmony_ci
2875f9996aaSopenharmony_ci
2885f9996aaSopenharmony_cidef _close_warning_file():
2895f9996aaSopenharmony_ci    if not _warning_file:
2905f9996aaSopenharmony_ci        _warning_file.close()
2915f9996aaSopenharmony_ci
2925f9996aaSopenharmony_ci
2935f9996aaSopenharmony_cidef _output_warning():
2945f9996aaSopenharmony_ci    for warning_list in _warning_dict.values():
2955f9996aaSopenharmony_ci        if len(warning_list) > 4 or len(warning_list) == 1:
2965f9996aaSopenharmony_ci            warning_list.append("")
2975f9996aaSopenharmony_ci            for content in warning_list:
2985f9996aaSopenharmony_ci                print(content)
2995f9996aaSopenharmony_ci                print(content, file=_warning_file)
3005f9996aaSopenharmony_ci
3015f9996aaSopenharmony_ci
3025f9996aaSopenharmony_cidef _output_deprecated(output_path: str):
3035f9996aaSopenharmony_ci    deprecated_file = open(os.path.join(output_path, 'hisysevent_deprecated.txt'), 'w+')
3045f9996aaSopenharmony_ci    for deprecated_list in _deprecated_dict.values():
3055f9996aaSopenharmony_ci        deprecated_list.append("")
3065f9996aaSopenharmony_ci        for content in deprecated_list:
3075f9996aaSopenharmony_ci            print(content, file=deprecated_file)
3085f9996aaSopenharmony_ci    if not deprecated_file:
3095f9996aaSopenharmony_ci        deprecated_file.close()
3105f9996aaSopenharmony_ci
3115f9996aaSopenharmony_ci
3125f9996aaSopenharmony_cidef _exit_sys():
3135f9996aaSopenharmony_ci    print("Failed to parse the yaml file. For details about the error "\
3145f9996aaSopenharmony_ci        "information, see file %s." % (_warning_file_path))
3155f9996aaSopenharmony_ci    _output_warning()
3165f9996aaSopenharmony_ci    _close_warning_file()
3175f9996aaSopenharmony_ci    sys.exit(1)
3185f9996aaSopenharmony_ci
3195f9996aaSopenharmony_ci
3205f9996aaSopenharmony_cidef _is_valid_length(content: str, len_min: int, len_max: int) -> bool:
3215f9996aaSopenharmony_ci    return len(content) >= len_min and len(content) <= len_max
3225f9996aaSopenharmony_ci
3235f9996aaSopenharmony_ci
3245f9996aaSopenharmony_cidef _is_valid_header(content: str) -> bool:
3255f9996aaSopenharmony_ci    return len(content) == 0 or (content[0] >= 'A' and content[0] <= 'Z')
3265f9996aaSopenharmony_ci
3275f9996aaSopenharmony_ci
3285f9996aaSopenharmony_cidef _is_invalid_char(ch) -> bool:
3295f9996aaSopenharmony_ci    return (ch >= 'A' and ch <= 'Z') or (ch >= '0' and ch <= '9') or ch == '_'
3305f9996aaSopenharmony_ci
3315f9996aaSopenharmony_ci
3325f9996aaSopenharmony_cidef _check_invalid_char(content: str):
3335f9996aaSopenharmony_ci    for ch in iter(content):
3345f9996aaSopenharmony_ci        if not _is_invalid_char(ch):
3355f9996aaSopenharmony_ci            return ch
3365f9996aaSopenharmony_ci    return None
3375f9996aaSopenharmony_ci
3385f9996aaSopenharmony_ci
3395f9996aaSopenharmony_cidef _check_domain_duplicate(domain: str) -> bool:
3405f9996aaSopenharmony_ci    if domain in _domain_dict:
3415f9996aaSopenharmony_ci        _build_warning_info(_DUPLICATE_DOMAIN, (domain, _domain_dict[domain]))
3425f9996aaSopenharmony_ci        return False
3435f9996aaSopenharmony_ci    else:
3445f9996aaSopenharmony_ci        _domain_dict[domain] = _yaml_file_path
3455f9996aaSopenharmony_ci        return True
3465f9996aaSopenharmony_ci
3475f9996aaSopenharmony_ci
3485f9996aaSopenharmony_cidef _check_event_domain(yaml_info: dict) -> bool:
3495f9996aaSopenharmony_ci    if not "domain" in yaml_info:
3505f9996aaSopenharmony_ci        _build_warning_info(_INVALID_DOMAIN_NUMBER, ())
3515f9996aaSopenharmony_ci        return False
3525f9996aaSopenharmony_ci    if not isinstance(yaml_info["domain"], str):
3535f9996aaSopenharmony_ci        _build_warning_info(_INVALID_DOMAIN_DEF, ())
3545f9996aaSopenharmony_ci        return False
3555f9996aaSopenharmony_ci    domain = yaml_info["domain"]
3565f9996aaSopenharmony_ci    check_res = True
3575f9996aaSopenharmony_ci    if not _is_valid_length(domain, 1, 16):
3585f9996aaSopenharmony_ci        _build_warning_info(_INVALID_DOMAIN_LENGTH, (domain, len(domain)))
3595f9996aaSopenharmony_ci        check_res = False
3605f9996aaSopenharmony_ci    if not _is_valid_header(domain):
3615f9996aaSopenharmony_ci        _build_warning_info(_INVALID_DOMAIN_CHAR_HEAD, (domain, domain[0]))
3625f9996aaSopenharmony_ci        check_res = False
3635f9996aaSopenharmony_ci    invalid_ch = _check_invalid_char(domain)
3645f9996aaSopenharmony_ci    if invalid_ch:
3655f9996aaSopenharmony_ci        _build_warning_info(_INVALID_DOMAIN_CHAR, (domain, invalid_ch))
3665f9996aaSopenharmony_ci        check_res = False
3675f9996aaSopenharmony_ci    if not _check_domain_duplicate(domain):
3685f9996aaSopenharmony_ci        check_res = False
3695f9996aaSopenharmony_ci    return check_res
3705f9996aaSopenharmony_ci
3715f9996aaSopenharmony_ci
3725f9996aaSopenharmony_cidef _check_yaml_format(yaml_info) -> bool:
3735f9996aaSopenharmony_ci    if not yaml_info:
3745f9996aaSopenharmony_ci        _build_warning_info(_INVALID_YAML, ("The yaml file is empty"))
3755f9996aaSopenharmony_ci        return False
3765f9996aaSopenharmony_ci    if not isinstance(yaml_info, dict):
3775f9996aaSopenharmony_ci        _build_warning_info(_INVALID_YAML,
3785f9996aaSopenharmony_ci            ("The content of yaml file is invalid"))
3795f9996aaSopenharmony_ci        return False
3805f9996aaSopenharmony_ci    return True
3815f9996aaSopenharmony_ci
3825f9996aaSopenharmony_ci
3835f9996aaSopenharmony_cidef _check_event_name(domain: str, event_name: str) -> bool:
3845f9996aaSopenharmony_ci    check_res = True
3855f9996aaSopenharmony_ci    if not _is_valid_length(event_name, 1, 32):
3865f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_LENGTH,
3875f9996aaSopenharmony_ci            (event_name, len(event_name)))
3885f9996aaSopenharmony_ci        check_res = False
3895f9996aaSopenharmony_ci    if len(domain) > 0 and event_name.startswith(domain):
3905f9996aaSopenharmony_ci        _build_deprecated_info(_DEPRECATED_EVENT_NAME_PREFIX,
3915f9996aaSopenharmony_ci            (event_name, domain))
3925f9996aaSopenharmony_ci    if not _is_valid_header(event_name):
3935f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_CHAR_HEAD,
3945f9996aaSopenharmony_ci            (event_name, event_name[0]))
3955f9996aaSopenharmony_ci        check_res = False
3965f9996aaSopenharmony_ci    invalid_ch = _check_invalid_char(event_name)
3975f9996aaSopenharmony_ci    if invalid_ch:
3985f9996aaSopenharmony_ci        _build_warning_info(_INVALID_DOMAIN_CHAR, (event_name, invalid_ch))
3995f9996aaSopenharmony_ci        check_res = False
4005f9996aaSopenharmony_ci    return check_res
4015f9996aaSopenharmony_ci
4025f9996aaSopenharmony_ci
4035f9996aaSopenharmony_cidef _check_event_type(event_name: str, event_base: dict) -> bool:
4045f9996aaSopenharmony_ci    if not "type" in event_base:
4055f9996aaSopenharmony_ci        _build_warning_info(_MISSING_EVENT_TYPE, (event_name))
4065f9996aaSopenharmony_ci        return False
4075f9996aaSopenharmony_ci    else:
4085f9996aaSopenharmony_ci        if not isinstance(event_base["type"], str):
4095f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_TYPE_DEF, event_name)
4105f9996aaSopenharmony_ci            return False
4115f9996aaSopenharmony_ci        type_list = ["FAULT", "STATISTIC", "SECURITY", "BEHAVIOR"]
4125f9996aaSopenharmony_ci        if not event_base["type"] in type_list:
4135f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_TYPE,
4145f9996aaSopenharmony_ci                (event_name, event_base["type"]))
4155f9996aaSopenharmony_ci            return False
4165f9996aaSopenharmony_ci    return True
4175f9996aaSopenharmony_ci
4185f9996aaSopenharmony_ci
4195f9996aaSopenharmony_cidef _check_event_level(event_name: str, event_base: dict) -> bool:
4205f9996aaSopenharmony_ci    if not "level" in event_base:
4215f9996aaSopenharmony_ci        _build_warning_info(_MISSING_EVENT_LEVEL, (event_name))
4225f9996aaSopenharmony_ci        return False
4235f9996aaSopenharmony_ci    else:
4245f9996aaSopenharmony_ci        if not isinstance(event_base["level"], str):
4255f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_LEVEL_DEF, event_name)
4265f9996aaSopenharmony_ci            return False
4275f9996aaSopenharmony_ci        level_list = ["CRITICAL", "MINOR"]
4285f9996aaSopenharmony_ci        if not event_base["level"] in level_list:
4295f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_LEVEL,
4305f9996aaSopenharmony_ci                (event_name, event_base["level"]))
4315f9996aaSopenharmony_ci            return False
4325f9996aaSopenharmony_ci    return True
4335f9996aaSopenharmony_ci
4345f9996aaSopenharmony_ci
4355f9996aaSopenharmony_cidef _check_event_desc(event_name: str, event_base: dict) -> bool:
4365f9996aaSopenharmony_ci    if not "desc" in event_base:
4375f9996aaSopenharmony_ci        _build_warning_info(_MISSING_EVENT_DESC, (event_name))
4385f9996aaSopenharmony_ci        return False
4395f9996aaSopenharmony_ci    else:
4405f9996aaSopenharmony_ci        event_desc = event_base["desc"]
4415f9996aaSopenharmony_ci        if not isinstance(event_desc, str):
4425f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_DESC_DEF, event_name)
4435f9996aaSopenharmony_ci            return False
4445f9996aaSopenharmony_ci        check_res = True
4455f9996aaSopenharmony_ci        if event_desc.lower() == event_name.lower():
4465f9996aaSopenharmony_ci            _build_deprecated_info(_DEPRECATED_EVENT_DESC_NAME,
4475f9996aaSopenharmony_ci                (event_desc, event_name))
4485f9996aaSopenharmony_ci        if not _is_valid_length(event_desc, 3, 128):
4495f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_DESC_LENGTH,
4505f9996aaSopenharmony_ci                (event_name, event_desc, len(event_desc)))
4515f9996aaSopenharmony_ci            check_res = False
4525f9996aaSopenharmony_ci        return check_res
4535f9996aaSopenharmony_ci
4545f9996aaSopenharmony_ci
4555f9996aaSopenharmony_cidef _check_tag_char(event_tag: list):
4565f9996aaSopenharmony_ci    for ch in iter(event_tag):
4575f9996aaSopenharmony_ci        if not ch.isalnum():
4585f9996aaSopenharmony_ci            return ch
4595f9996aaSopenharmony_ci    return None
4605f9996aaSopenharmony_ci
4615f9996aaSopenharmony_ci
4625f9996aaSopenharmony_cidef _check_tag_name(event_name: str, event_base: dict, tag_name: str) -> bool:
4635f9996aaSopenharmony_ci    check_res = True
4645f9996aaSopenharmony_ci    if tag_name.lower() == event_name.lower():
4655f9996aaSopenharmony_ci        _build_deprecated_info(_DEPRECATED_TAG_NAME,
4665f9996aaSopenharmony_ci            (tag_name, "event", event_name))
4675f9996aaSopenharmony_ci    if "type" in event_base and tag_name.lower() == event_base["type"].lower():
4685f9996aaSopenharmony_ci        _build_deprecated_info(_DEPRECATED_TAG_NAME,
4695f9996aaSopenharmony_ci            (tag_name, "event type", event_base["type"]))
4705f9996aaSopenharmony_ci    if not _is_valid_length(tag_name, 1, 16):
4715f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_TAG_LEN,
4725f9996aaSopenharmony_ci            (event_name, tag_name, len(tag_name)))
4735f9996aaSopenharmony_ci        check_res = False
4745f9996aaSopenharmony_ci    invalid_ch = _check_tag_char(tag_name)
4755f9996aaSopenharmony_ci    if invalid_ch:
4765f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_TAG_CHAR,
4775f9996aaSopenharmony_ci            (event_name, tag_name, invalid_ch))
4785f9996aaSopenharmony_ci        check_res = False
4795f9996aaSopenharmony_ci    return check_res
4805f9996aaSopenharmony_ci
4815f9996aaSopenharmony_ci
4825f9996aaSopenharmony_cidef _get_duplicate_tag(tag_list: list):
4835f9996aaSopenharmony_ci    tag_dict = dict(Counter(tag_list))
4845f9996aaSopenharmony_ci    for key, value in tag_dict.items():
4855f9996aaSopenharmony_ci        if value > 1:
4865f9996aaSopenharmony_ci            return key
4875f9996aaSopenharmony_ci    return None
4885f9996aaSopenharmony_ci
4895f9996aaSopenharmony_ci
4905f9996aaSopenharmony_cidef _check_event_tag(event_name: str, event_base: dict) -> bool:
4915f9996aaSopenharmony_ci    if not "tag" in event_base:
4925f9996aaSopenharmony_ci        return True
4935f9996aaSopenharmony_ci    event_tag = event_base["tag"]
4945f9996aaSopenharmony_ci    if not isinstance(event_tag, str):
4955f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_TAG_DEF, event_name)
4965f9996aaSopenharmony_ci        return False
4975f9996aaSopenharmony_ci    tag_list = event_tag.split()
4985f9996aaSopenharmony_ci    if not _is_valid_length(tag_list, 1, 5):
4995f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_TAG_NUM,
5005f9996aaSopenharmony_ci            (event_name, event_tag, len(tag_list)))
5015f9996aaSopenharmony_ci        return False
5025f9996aaSopenharmony_ci    check_res = True
5035f9996aaSopenharmony_ci    for each_tag in tag_list:
5045f9996aaSopenharmony_ci        if not _check_tag_name(event_name, event_base, each_tag):
5055f9996aaSopenharmony_ci            check_res = False
5065f9996aaSopenharmony_ci    dup_tag = _get_duplicate_tag(tag_list)
5075f9996aaSopenharmony_ci    if dup_tag:
5085f9996aaSopenharmony_ci        _build_warning_info(_DUPLICATE_EVENT_TAG, (dup_tag, event_name))
5095f9996aaSopenharmony_ci        check_res = False
5105f9996aaSopenharmony_ci    return check_res
5115f9996aaSopenharmony_ci
5125f9996aaSopenharmony_ci
5135f9996aaSopenharmony_cidef _check_event_preserve(event_name: str, event_base: dict) -> bool:
5145f9996aaSopenharmony_ci    if not "preserve" in event_base:
5155f9996aaSopenharmony_ci        return True
5165f9996aaSopenharmony_ci    event_preserve = event_base["preserve"]
5175f9996aaSopenharmony_ci    if not isinstance(event_preserve, bool):
5185f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_PRESERVE_DEF, event_name)
5195f9996aaSopenharmony_ci        return False
5205f9996aaSopenharmony_ci    return True
5215f9996aaSopenharmony_ci
5225f9996aaSopenharmony_ci
5235f9996aaSopenharmony_cidef _check_base_key(event_name: str, event_base: dict) -> bool:
5245f9996aaSopenharmony_ci    key_list = ["type", "level", "tag", "desc", "preserve"]
5255f9996aaSopenharmony_ci    for base_key in event_base.keys():
5265f9996aaSopenharmony_ci        if not base_key in key_list:
5275f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_BASE_KEY,
5285f9996aaSopenharmony_ci                (event_name, base_key))
5295f9996aaSopenharmony_ci            return False
5305f9996aaSopenharmony_ci    return True
5315f9996aaSopenharmony_ci
5325f9996aaSopenharmony_ci
5335f9996aaSopenharmony_cidef _check_event_base(event_name: str, event_def: str) -> bool:
5345f9996aaSopenharmony_ci    if not "__BASE" in event_def:
5355f9996aaSopenharmony_ci        _build_warning_info(_MISSING_EVENT_BASE, (event_name))
5365f9996aaSopenharmony_ci        return False
5375f9996aaSopenharmony_ci    event_base = event_def["__BASE"]
5385f9996aaSopenharmony_ci    if not isinstance(event_base, dict):
5395f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_BASE_DEF, (event_name))
5405f9996aaSopenharmony_ci        return False
5415f9996aaSopenharmony_ci    check_res = True
5425f9996aaSopenharmony_ci    if not _check_event_type(event_name, event_base):
5435f9996aaSopenharmony_ci        check_res = False
5445f9996aaSopenharmony_ci    if not _check_event_level(event_name, event_base):
5455f9996aaSopenharmony_ci        check_res = False
5465f9996aaSopenharmony_ci    if not _check_event_desc(event_name, event_base):
5475f9996aaSopenharmony_ci        check_res = False
5485f9996aaSopenharmony_ci    if not _check_event_tag(event_name, event_base):
5495f9996aaSopenharmony_ci        check_res = False
5505f9996aaSopenharmony_ci    if not _check_event_preserve(event_name, event_base):
5515f9996aaSopenharmony_ci        check_res = False
5525f9996aaSopenharmony_ci    if not _check_base_key(event_name, event_base):
5535f9996aaSopenharmony_ci        check_res = False
5545f9996aaSopenharmony_ci    return check_res
5555f9996aaSopenharmony_ci
5565f9996aaSopenharmony_ci
5575f9996aaSopenharmony_cidef _check_param_name(event_name: str, name: str) -> bool:
5585f9996aaSopenharmony_ci    check_res = True
5595f9996aaSopenharmony_ci    if not _is_valid_length(name, 1, 32):
5605f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_PARAM_LEN,
5615f9996aaSopenharmony_ci            (event_name, name, len(name)))
5625f9996aaSopenharmony_ci        check_res = False
5635f9996aaSopenharmony_ci    if len(event_name) > 0 and name.startswith(event_name):
5645f9996aaSopenharmony_ci        _build_deprecated_info(_DEPRECATED_PARAM_NAME_PREFIX, (name, event_name))
5655f9996aaSopenharmony_ci    if not _is_valid_header(name):
5665f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_PARAM_CHAR_HEAD,
5675f9996aaSopenharmony_ci            (event_name, name, name[0]))
5685f9996aaSopenharmony_ci        check_res = False
5695f9996aaSopenharmony_ci    invalid_ch = _check_invalid_char(name)
5705f9996aaSopenharmony_ci    if invalid_ch:
5715f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_PARAM_CHAR,
5725f9996aaSopenharmony_ci            (event_name, name, invalid_ch))
5735f9996aaSopenharmony_ci        check_res = False
5745f9996aaSopenharmony_ci    return check_res
5755f9996aaSopenharmony_ci
5765f9996aaSopenharmony_ci
5775f9996aaSopenharmony_cidef _check_param_type(event_name: str, param_name: str, param_info: dict) -> bool:
5785f9996aaSopenharmony_ci    if not "type" in param_info:
5795f9996aaSopenharmony_ci        _build_warning_info(_MISSING_EVENT_PARAM_TYPE,
5805f9996aaSopenharmony_ci            (event_name, param_name))
5815f9996aaSopenharmony_ci        return False
5825f9996aaSopenharmony_ci    else:
5835f9996aaSopenharmony_ci        if not isinstance(param_info["type"], str):
5845f9996aaSopenharmony_ci            _build_warning_info(_INVALID_PARAM_TYPE_DEF,
5855f9996aaSopenharmony_ci                (event_name, param_name))
5865f9996aaSopenharmony_ci            return False
5875f9996aaSopenharmony_ci        type_list = ["BOOL", "INT8", "UINT8", "INT16", "UINT16", "INT32",
5885f9996aaSopenharmony_ci            "UINT32", "INT64", "UINT64", "FLOAT", "DOUBLE", "STRING"]
5895f9996aaSopenharmony_ci        if not param_info["type"] in type_list:
5905f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_PARAM_TYPE,
5915f9996aaSopenharmony_ci                (event_name, param_name, param_info["type"]))
5925f9996aaSopenharmony_ci            return False
5935f9996aaSopenharmony_ci    return True
5945f9996aaSopenharmony_ci
5955f9996aaSopenharmony_ci
5965f9996aaSopenharmony_cidef _check_param_arrsize(event_name: str, param_name: str, param_info: dict) -> bool:
5975f9996aaSopenharmony_ci    if not "arrsize" in param_info:
5985f9996aaSopenharmony_ci        return True
5995f9996aaSopenharmony_ci    arrsize = param_info["arrsize"]
6005f9996aaSopenharmony_ci    if not isinstance(arrsize, int):
6015f9996aaSopenharmony_ci        _build_warning_info(_INVALID_PARAM_ARRSIZE_DEF,
6025f9996aaSopenharmony_ci            (event_name, param_name))
6035f9996aaSopenharmony_ci        return False
6045f9996aaSopenharmony_ci    if not (arrsize >= 1 and arrsize <= 100):
6055f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_PARAM_ARRSIZE,
6065f9996aaSopenharmony_ci            (event_name, param_name, arrsize))
6075f9996aaSopenharmony_ci        return False
6085f9996aaSopenharmony_ci    return True
6095f9996aaSopenharmony_ci
6105f9996aaSopenharmony_ci
6115f9996aaSopenharmony_cidef _check_param_desc(event_name: str, param_name: str, param_info: dict) -> bool:
6125f9996aaSopenharmony_ci    if not "desc" in param_info:
6135f9996aaSopenharmony_ci        _build_warning_info(_MISSING_EVENT_PARAM_DESC,
6145f9996aaSopenharmony_ci            (event_name, param_name))
6155f9996aaSopenharmony_ci        return False
6165f9996aaSopenharmony_ci    else:
6175f9996aaSopenharmony_ci        param_desc = param_info["desc"]
6185f9996aaSopenharmony_ci        if not isinstance(param_desc, str):
6195f9996aaSopenharmony_ci            _build_warning_info(_INVALID_PARAM_DESC_DEF,
6205f9996aaSopenharmony_ci                (event_name, param_name))
6215f9996aaSopenharmony_ci            return False
6225f9996aaSopenharmony_ci        check_res = True
6235f9996aaSopenharmony_ci        if param_desc.lower() == param_name.lower():
6245f9996aaSopenharmony_ci            _build_deprecated_info(_DEPRECATED_PARAM_DESC_NAME,
6255f9996aaSopenharmony_ci                (param_desc, event_name, param_name))
6265f9996aaSopenharmony_ci        if not _is_valid_length(param_desc, 3, 128):
6275f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_PARAM_DESC_LEN,
6285f9996aaSopenharmony_ci                (event_name, param_name, param_desc, len(param_desc)))
6295f9996aaSopenharmony_ci            check_res = False
6305f9996aaSopenharmony_ci        return check_res
6315f9996aaSopenharmony_ci
6325f9996aaSopenharmony_ci
6335f9996aaSopenharmony_cidef _check_param_key(event_name: str, param_name: str, param_info: dict) -> bool:
6345f9996aaSopenharmony_ci    key_list = ["type", "arrsize", "desc"]
6355f9996aaSopenharmony_ci    for key in param_info.keys():
6365f9996aaSopenharmony_ci        if not key in key_list:
6375f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_PARAM_KEY,
6385f9996aaSopenharmony_ci                (event_name, param_name, key))
6395f9996aaSopenharmony_ci            return False
6405f9996aaSopenharmony_ci    return True
6415f9996aaSopenharmony_ci
6425f9996aaSopenharmony_ci
6435f9996aaSopenharmony_cidef _check_param_info(event_name: str, param_name: str, param_info: dict) -> bool:
6445f9996aaSopenharmony_ci    check_res = True
6455f9996aaSopenharmony_ci    if not _check_param_type(event_name, param_name, param_info):
6465f9996aaSopenharmony_ci        check_res = False
6475f9996aaSopenharmony_ci    if not _check_param_arrsize(event_name, param_name, param_info):
6485f9996aaSopenharmony_ci        check_res = False
6495f9996aaSopenharmony_ci    if not _check_param_desc(event_name, param_name, param_info):
6505f9996aaSopenharmony_ci        check_res = False
6515f9996aaSopenharmony_ci    if not _check_param_key(event_name, param_name, param_info):
6525f9996aaSopenharmony_ci        check_res = False
6535f9996aaSopenharmony_ci    return check_res
6545f9996aaSopenharmony_ci
6555f9996aaSopenharmony_ci
6565f9996aaSopenharmony_cidef _check_event_param(event_name: str, event_def: str) -> bool:
6575f9996aaSopenharmony_ci    sub_num = (0, 1)["__BASE" in event_def]
6585f9996aaSopenharmony_ci    check_res = True
6595f9996aaSopenharmony_ci    if not _is_valid_length(event_def, 0 + sub_num, 128 + sub_num):
6605f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_PARAM_NUM,
6615f9996aaSopenharmony_ci            (event_name, (len(event_def) - sub_num)))
6625f9996aaSopenharmony_ci        check_res = False
6635f9996aaSopenharmony_ci    for param_name in event_def.keys():
6645f9996aaSopenharmony_ci        if param_name == "__BASE":
6655f9996aaSopenharmony_ci            continue
6665f9996aaSopenharmony_ci        if not _check_param_name(event_name, param_name):
6675f9996aaSopenharmony_ci            check_res = False
6685f9996aaSopenharmony_ci        param_info = event_def[param_name]
6695f9996aaSopenharmony_ci        if not isinstance(param_info, dict):
6705f9996aaSopenharmony_ci            _build_warning_info(_INVALID_EVENT_PARAM_DEF,
6715f9996aaSopenharmony_ci                (event_name, param_name))
6725f9996aaSopenharmony_ci            check_res = False
6735f9996aaSopenharmony_ci            continue
6745f9996aaSopenharmony_ci        if not _check_param_info(event_name, param_name, param_info):
6755f9996aaSopenharmony_ci            check_res = False
6765f9996aaSopenharmony_ci    return check_res
6775f9996aaSopenharmony_ci
6785f9996aaSopenharmony_ci
6795f9996aaSopenharmony_cidef _check_event_def(event_name: str, event_def: str) -> bool:
6805f9996aaSopenharmony_ci    check_res = True
6815f9996aaSopenharmony_ci    if not _check_event_base(event_name, event_def):
6825f9996aaSopenharmony_ci        check_res = False
6835f9996aaSopenharmony_ci    if not _check_event_param(event_name, event_def):
6845f9996aaSopenharmony_ci        check_res = False
6855f9996aaSopenharmony_ci    return check_res
6865f9996aaSopenharmony_ci
6875f9996aaSopenharmony_ci
6885f9996aaSopenharmony_cidef _check_event_info(domain: str, event_info: list) -> bool:
6895f9996aaSopenharmony_ci    event_name = event_info[0]
6905f9996aaSopenharmony_ci    event_def = event_info[1]
6915f9996aaSopenharmony_ci    check_res = True
6925f9996aaSopenharmony_ci    if not isinstance(event_def, dict):
6935f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_DEF, (event_name))
6945f9996aaSopenharmony_ci        return False
6955f9996aaSopenharmony_ci    if not _check_event_name(domain, event_name):
6965f9996aaSopenharmony_ci        check_res = False
6975f9996aaSopenharmony_ci    if not _check_event_def(event_name, event_def):
6985f9996aaSopenharmony_ci        check_res = False
6995f9996aaSopenharmony_ci    return check_res
7005f9996aaSopenharmony_ci
7015f9996aaSopenharmony_ci
7025f9996aaSopenharmony_cidef _check_events_info(domain: str, yaml_info: str) -> bool:
7035f9996aaSopenharmony_ci    event_num = len(yaml_info)
7045f9996aaSopenharmony_ci    if not (event_num >= 1 and event_num <= 4096):
7055f9996aaSopenharmony_ci        _build_warning_info(_INVALID_EVENT_NUMBER, (event_num))
7065f9996aaSopenharmony_ci        return False
7075f9996aaSopenharmony_ci    check_res = True
7085f9996aaSopenharmony_ci    for event_info in yaml_info.items():
7095f9996aaSopenharmony_ci        if not _check_event_info(domain, event_info):
7105f9996aaSopenharmony_ci            check_res = False
7115f9996aaSopenharmony_ci    return check_res
7125f9996aaSopenharmony_ci
7135f9996aaSopenharmony_ci
7145f9996aaSopenharmony_cidef merge_hisysevent_config(yaml_list: str, output_path: str) -> str:
7155f9996aaSopenharmony_ci    if (len(output_path) == 0):
7165f9996aaSopenharmony_ci        present_path = os.path.dirname(os.path.abspath(__file__))
7175f9996aaSopenharmony_ci        output_path = present_path
7185f9996aaSopenharmony_ci    if (len(yaml_list) == 0):
7195f9996aaSopenharmony_ci        _build_warning_info(_EMPTY_YAML, ())
7205f9996aaSopenharmony_ci        _exit_sys()
7215f9996aaSopenharmony_ci    if not os.path.exists(output_path):
7225f9996aaSopenharmony_ci        os.makedirs(output_path, exist_ok=True)
7235f9996aaSopenharmony_ci    _open_warning_file(output_path)
7245f9996aaSopenharmony_ci
7255f9996aaSopenharmony_ci    yaml_info_dict = {}
7265f9996aaSopenharmony_ci    global _hisysevent_parse_res
7275f9996aaSopenharmony_ci    for yaml_path in yaml_list:
7285f9996aaSopenharmony_ci        global _yaml_file_path
7295f9996aaSopenharmony_ci        _yaml_file_path = yaml_path.replace("../", "")
7305f9996aaSopenharmony_ci        _build_warning_header()
7315f9996aaSopenharmony_ci        with os.fdopen(os.open(yaml_path, os.O_RDWR | os.O_CREAT, stat.S_IWUSR | stat.S_IRUSR),
7325f9996aaSopenharmony_ci            'r', encoding='utf-8') as yaml_file:
7335f9996aaSopenharmony_ci            yaml_info = yaml.load(yaml_file, Loader=_UniqueKeySafeLoader)
7345f9996aaSopenharmony_ci        if not _check_yaml_format(yaml_info):
7355f9996aaSopenharmony_ci            _hisysevent_parse_res = False
7365f9996aaSopenharmony_ci            continue
7375f9996aaSopenharmony_ci        if not _check_event_domain(yaml_info):
7385f9996aaSopenharmony_ci            _hisysevent_parse_res = False
7395f9996aaSopenharmony_ci            continue
7405f9996aaSopenharmony_ci        domain = yaml_info["domain"]
7415f9996aaSopenharmony_ci        del yaml_info["domain"]
7425f9996aaSopenharmony_ci        if not _check_events_info(domain, yaml_info):
7435f9996aaSopenharmony_ci            _hisysevent_parse_res = False
7445f9996aaSopenharmony_ci            continue
7455f9996aaSopenharmony_ci        yaml_info_dict[domain] = yaml_info
7465f9996aaSopenharmony_ci    _output_deprecated(output_path)
7475f9996aaSopenharmony_ci    if not _hisysevent_parse_res:
7485f9996aaSopenharmony_ci        _exit_sys()
7495f9996aaSopenharmony_ci
7505f9996aaSopenharmony_ci    hisysevent_def_file = os.path.join(output_path, 'hisysevent.def')
7515f9996aaSopenharmony_ci    with open(hisysevent_def_file, 'w') as j:
7525f9996aaSopenharmony_ci        json.dump(yaml_info_dict, j, indent=4)
7535f9996aaSopenharmony_ci    print("The hisysevent.def {} is generated successfully."
7545f9996aaSopenharmony_ci        .format(hisysevent_def_file))
7555f9996aaSopenharmony_ci    _close_warning_file()
7565f9996aaSopenharmony_ci
7575f9996aaSopenharmony_ci    # zip def file
7585f9996aaSopenharmony_ci    hisysevent_def_zip_file = os.path.join(output_path, 'hisysevent.zip')
7595f9996aaSopenharmony_ci    def_zip_file = zipfile.ZipFile(hisysevent_def_zip_file, "w", zipfile.ZIP_DEFLATED)
7605f9996aaSopenharmony_ci    def_zip_file.write(hisysevent_def_file, arcname=os.path.basename(hisysevent_def_file))
7615f9996aaSopenharmony_ci    def_zip_file.close()
7625f9996aaSopenharmony_ci    # remove def file
7635f9996aaSopenharmony_ci    os.remove(hisysevent_def_file)
7645f9996aaSopenharmony_ci
7655f9996aaSopenharmony_ci    return hisysevent_def_zip_file
7665f9996aaSopenharmony_ci
7675f9996aaSopenharmony_ci
7685f9996aaSopenharmony_cidef main(argv) -> int:
7695f9996aaSopenharmony_ci    parser = argparse.ArgumentParser(description='yaml list')
7705f9996aaSopenharmony_ci    parser.add_argument("--yaml-list", nargs='+', required=True)
7715f9996aaSopenharmony_ci    parser.add_argument("--def-path", required=True)
7725f9996aaSopenharmony_ci    args = parser.parse_args(argv)
7735f9996aaSopenharmony_ci    hisysevent_def_file = merge_hisysevent_config(args.yaml_list,
7745f9996aaSopenharmony_ci        args.def_path)
7755f9996aaSopenharmony_ci    print(hisysevent_def_file)
7765f9996aaSopenharmony_ci    return 0
7775f9996aaSopenharmony_ci
7785f9996aaSopenharmony_ci
7795f9996aaSopenharmony_ciif __name__ == '__main__':
7805f9996aaSopenharmony_ci    sys.exit(main(sys.argv[1:]))
781