1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#include "trigger_checker.h"
17d9f0492fSopenharmony_ci
18d9f0492fSopenharmony_ci#include <ctype.h>
19d9f0492fSopenharmony_ci#include "init_param.h"
20d9f0492fSopenharmony_ci#include "trigger_manager.h"
21d9f0492fSopenharmony_ci#include "securec.h"
22d9f0492fSopenharmony_ci
23d9f0492fSopenharmony_ci#define MAX_CALC_PARAM 100
24d9f0492fSopenharmony_ci// 申请整块能存作为计算的节点
25d9f0492fSopenharmony_ciint CalculatorInit(LogicCalculator *calculator, int dataNumber, int dataUnit, int needCondition)
26d9f0492fSopenharmony_ci{
27d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
28d9f0492fSopenharmony_ci    PARAM_CHECK(dataUnit <= (int)sizeof(LogicData), return -1, "Invalid param");
29d9f0492fSopenharmony_ci    PARAM_CHECK(dataNumber <= MAX_CALC_PARAM, return -1, "Invalid param");
30d9f0492fSopenharmony_ci    int dataSize = dataUnit * dataNumber;
31d9f0492fSopenharmony_ci    if (needCondition) {
32d9f0492fSopenharmony_ci        dataSize += MAX_DATA_BUFFER_MAX;
33d9f0492fSopenharmony_ci    }
34d9f0492fSopenharmony_ci    calculator->data = (char *)calloc(1, dataSize);
35d9f0492fSopenharmony_ci    PARAM_CHECK(calculator->data != NULL, return -1, "Failed to malloc for calculator");
36d9f0492fSopenharmony_ci    calculator->dataNumber = dataNumber;
37d9f0492fSopenharmony_ci    calculator->endIndex = 0;
38d9f0492fSopenharmony_ci    calculator->dataUnit = dataUnit;
39d9f0492fSopenharmony_ci
40d9f0492fSopenharmony_ci    dataSize = dataUnit * dataNumber;
41d9f0492fSopenharmony_ci    calculator->conditionName = calculator->data + dataSize;
42d9f0492fSopenharmony_ci    dataSize += SUPPORT_DATA_BUFFER_MAX;
43d9f0492fSopenharmony_ci    calculator->conditionContent = calculator->data + dataSize;
44d9f0492fSopenharmony_ci    dataSize += SUPPORT_DATA_BUFFER_MAX;
45d9f0492fSopenharmony_ci    calculator->inputName = calculator->data + dataSize;
46d9f0492fSopenharmony_ci    dataSize += SUPPORT_DATA_BUFFER_MAX;
47d9f0492fSopenharmony_ci    calculator->inputContent = calculator->data + dataSize;
48d9f0492fSopenharmony_ci    dataSize += SUPPORT_DATA_BUFFER_MAX;
49d9f0492fSopenharmony_ci    calculator->readContent = calculator->data + dataSize;
50d9f0492fSopenharmony_ci    return memset_s(calculator->triggerContent,
51d9f0492fSopenharmony_ci        sizeof(calculator->triggerContent), 0, sizeof(calculator->triggerContent));
52d9f0492fSopenharmony_ci}
53d9f0492fSopenharmony_ci
54d9f0492fSopenharmony_civoid CalculatorFree(LogicCalculator *calculator)
55d9f0492fSopenharmony_ci{
56d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL, return, "Invalid param");
57d9f0492fSopenharmony_ci    if (calculator->data != NULL) {
58d9f0492fSopenharmony_ci        free(calculator->data);
59d9f0492fSopenharmony_ci    }
60d9f0492fSopenharmony_ci    calculator->data = NULL;
61d9f0492fSopenharmony_ci}
62d9f0492fSopenharmony_ci
63d9f0492fSopenharmony_cistatic void CalculatorClear(LogicCalculator *calculator)
64d9f0492fSopenharmony_ci{
65d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL, return, "Invalid param");
66d9f0492fSopenharmony_ci    calculator->endIndex = 0;
67d9f0492fSopenharmony_ci}
68d9f0492fSopenharmony_ci
69d9f0492fSopenharmony_cistatic int CalculatorPushChar(LogicCalculator *calculator, char data)
70d9f0492fSopenharmony_ci{
71d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
72d9f0492fSopenharmony_ci    PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
73d9f0492fSopenharmony_ci    PARAM_CHECK(sizeof(char) == calculator->dataUnit, return -1, "More data for calculator support");
74d9f0492fSopenharmony_ci    calculator->data[calculator->endIndex++] = data;
75d9f0492fSopenharmony_ci    return 0;
76d9f0492fSopenharmony_ci}
77d9f0492fSopenharmony_ci
78d9f0492fSopenharmony_cistatic int CalculatorPopChar(LogicCalculator *calculator, char *data)
79d9f0492fSopenharmony_ci{
80d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
81d9f0492fSopenharmony_ci    PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
82d9f0492fSopenharmony_ci    if (calculator->endIndex == 0) {
83d9f0492fSopenharmony_ci        return -1;
84d9f0492fSopenharmony_ci    }
85d9f0492fSopenharmony_ci    *data = calculator->data[--calculator->endIndex];
86d9f0492fSopenharmony_ci    return 0;
87d9f0492fSopenharmony_ci}
88d9f0492fSopenharmony_ci
89d9f0492fSopenharmony_cistatic int CalculatorPush(LogicCalculator *calculator, const void *data)
90d9f0492fSopenharmony_ci{
91d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL, return -1, "Invalid param");
92d9f0492fSopenharmony_ci    PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
93d9f0492fSopenharmony_ci    char *tmpData = (char *)calculator->data + calculator->dataUnit * calculator->endIndex;
94d9f0492fSopenharmony_ci    int ret = memcpy_s(tmpData, calculator->dataUnit, data, calculator->dataUnit);
95d9f0492fSopenharmony_ci    PARAM_CHECK(ret == EOK, return -1, "Failed to copy logic data");
96d9f0492fSopenharmony_ci    calculator->endIndex++;
97d9f0492fSopenharmony_ci    return 0;
98d9f0492fSopenharmony_ci}
99d9f0492fSopenharmony_ci
100d9f0492fSopenharmony_cistatic int CalculatorPop(LogicCalculator *calculator, void *data)
101d9f0492fSopenharmony_ci{
102d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL && data != NULL, return -1, "Invalid param");
103d9f0492fSopenharmony_ci    PARAM_CHECK(calculator->endIndex < calculator->dataNumber, return -1, "More data for calculator support");
104d9f0492fSopenharmony_ci    if (calculator->endIndex == 0) {
105d9f0492fSopenharmony_ci        return -1;
106d9f0492fSopenharmony_ci    }
107d9f0492fSopenharmony_ci    char *tmpData = (char *)calculator->data + calculator->dataUnit * (calculator->endIndex - 1);
108d9f0492fSopenharmony_ci    int ret = memcpy_s(data, calculator->dataUnit, tmpData, calculator->dataUnit);
109d9f0492fSopenharmony_ci    PARAM_CHECK(ret == EOK, return -1, "Failed to copy logic data");
110d9f0492fSopenharmony_ci    calculator->endIndex--;
111d9f0492fSopenharmony_ci    return 0;
112d9f0492fSopenharmony_ci}
113d9f0492fSopenharmony_ci
114d9f0492fSopenharmony_cistatic int CalculatorLength(const LogicCalculator *calculator)
115d9f0492fSopenharmony_ci{
116d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL, return 0, "Invalid param");
117d9f0492fSopenharmony_ci    return calculator->endIndex;
118d9f0492fSopenharmony_ci}
119d9f0492fSopenharmony_ci
120d9f0492fSopenharmony_cistatic int PrefixAdd(char *prefix, uint32_t *prefixIndex, uint32_t prefixLen, char op)
121d9f0492fSopenharmony_ci{
122d9f0492fSopenharmony_ci    if ((*prefixIndex + 1 + 1 + 1) >= prefixLen) {
123d9f0492fSopenharmony_ci        return -1;
124d9f0492fSopenharmony_ci    }
125d9f0492fSopenharmony_ci    prefix[(*prefixIndex)++] = ' ';
126d9f0492fSopenharmony_ci    prefix[(*prefixIndex)++] = op;
127d9f0492fSopenharmony_ci    prefix[(*prefixIndex)++] = ' ';
128d9f0492fSopenharmony_ci    return 0;
129d9f0492fSopenharmony_ci}
130d9f0492fSopenharmony_ci
131d9f0492fSopenharmony_cistatic int HandleOperationOr(LogicCalculator *calculator, char *prefix, uint32_t *prefixIndex, uint32_t prefixLen)
132d9f0492fSopenharmony_ci{
133d9f0492fSopenharmony_ci    char e = 0;
134d9f0492fSopenharmony_ci    prefix[(*prefixIndex)++] = ' ';
135d9f0492fSopenharmony_ci    if (CalculatorLength(calculator) == 0) {
136d9f0492fSopenharmony_ci        CalculatorPushChar(calculator, '|');
137d9f0492fSopenharmony_ci    } else {
138d9f0492fSopenharmony_ci        do {
139d9f0492fSopenharmony_ci            CalculatorPopChar(calculator, &e);
140d9f0492fSopenharmony_ci            if (e == '(') {
141d9f0492fSopenharmony_ci                CalculatorPushChar(calculator, e);
142d9f0492fSopenharmony_ci            } else {
143d9f0492fSopenharmony_ci                int ret = PrefixAdd(prefix, prefixIndex, prefixLen, e);
144d9f0492fSopenharmony_ci                PARAM_CHECK(ret == 0, return -1, "Invalid prefix");
145d9f0492fSopenharmony_ci            }
146d9f0492fSopenharmony_ci        } while (CalculatorLength(calculator) > 0 && e != '(');
147d9f0492fSopenharmony_ci        CalculatorPushChar(calculator, '|');
148d9f0492fSopenharmony_ci    }
149d9f0492fSopenharmony_ci    return 0;
150d9f0492fSopenharmony_ci}
151d9f0492fSopenharmony_ci
152d9f0492fSopenharmony_cistatic int CompareValue(const char *condition, const char *value)
153d9f0492fSopenharmony_ci{
154d9f0492fSopenharmony_ci    if (strcmp(condition, "*") == 0) {
155d9f0492fSopenharmony_ci        return 1;
156d9f0492fSopenharmony_ci    }
157d9f0492fSopenharmony_ci    if (strcmp(condition, value) == 0) {
158d9f0492fSopenharmony_ci        return 1;
159d9f0492fSopenharmony_ci    }
160d9f0492fSopenharmony_ci    char *tmp = strstr(condition, "*");
161d9f0492fSopenharmony_ci    if (tmp != NULL && (strncmp(value, condition, tmp - condition) == 0)) {
162d9f0492fSopenharmony_ci        return 1;
163d9f0492fSopenharmony_ci    }
164d9f0492fSopenharmony_ci    return 0;
165d9f0492fSopenharmony_ci}
166d9f0492fSopenharmony_ci
167d9f0492fSopenharmony_cistatic int ComputeSubCondition(const LogicCalculator *calculator, LogicData *data, const char *condition)
168d9f0492fSopenharmony_ci{
169d9f0492fSopenharmony_ci    if (!LOGIC_DATA_TEST_FLAG(data, LOGIC_DATA_FLAGS_ORIGINAL)) {
170d9f0492fSopenharmony_ci        return LOGIC_DATA_TEST_FLAG(data, LOGIC_DATA_FLAGS_TRUE);
171d9f0492fSopenharmony_ci    }
172d9f0492fSopenharmony_ci    uint32_t triggerContentSize = strlen(calculator->triggerContent);
173d9f0492fSopenharmony_ci    // 解析条件, aaaa && bbb=1 && ccc=1的场景
174d9f0492fSopenharmony_ci    char *subStr = strstr(condition + data->startIndex, "=");
175d9f0492fSopenharmony_ci    if (subStr != NULL && ((uint32_t)(subStr - condition) > data->endIndex)) {
176d9f0492fSopenharmony_ci        if (strncmp(condition + data->startIndex, calculator->triggerContent, triggerContentSize) == 0) {
177d9f0492fSopenharmony_ci            return 1;
178d9f0492fSopenharmony_ci        }
179d9f0492fSopenharmony_ci        return 0;
180d9f0492fSopenharmony_ci    }
181d9f0492fSopenharmony_ci    int ret = GetValueFromContent(condition + data->startIndex,
182d9f0492fSopenharmony_ci        data->endIndex - data->startIndex, 0, calculator->conditionName, SUPPORT_DATA_BUFFER_MAX);
183d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return -1, "Failed parse content name");
184d9f0492fSopenharmony_ci    ret = GetValueFromContent(condition + data->startIndex, data->endIndex - data->startIndex,
185d9f0492fSopenharmony_ci        strlen(calculator->conditionName) + 1, calculator->conditionContent, SUPPORT_DATA_BUFFER_MAX);
186d9f0492fSopenharmony_ci    PARAM_CHECK(ret == 0, return -1, "Failed parse content value");
187d9f0492fSopenharmony_ci    // check name
188d9f0492fSopenharmony_ci    if ((calculator->inputName != NULL) && (strcmp(calculator->conditionName, calculator->inputName) == 0)) {
189d9f0492fSopenharmony_ci        return CompareValue(calculator->conditionContent, calculator->inputContent);
190d9f0492fSopenharmony_ci    } else if (strlen(calculator->conditionName) > 0) {
191d9f0492fSopenharmony_ci        uint32_t len = SUPPORT_DATA_BUFFER_MAX;
192d9f0492fSopenharmony_ci        ret = SystemReadParam(calculator->conditionName, calculator->readContent, &len);
193d9f0492fSopenharmony_ci        if (ret != 0) {
194d9f0492fSopenharmony_ci            return 0;
195d9f0492fSopenharmony_ci        }
196d9f0492fSopenharmony_ci        return CompareValue(calculator->conditionContent, calculator->readContent);
197d9f0492fSopenharmony_ci    }
198d9f0492fSopenharmony_ci    return 0;
199d9f0492fSopenharmony_ci}
200d9f0492fSopenharmony_ci
201d9f0492fSopenharmony_ciint GetValueFromContent(const char *content, uint32_t contentSize, uint32_t start, char *value, uint32_t valueSize)
202d9f0492fSopenharmony_ci{
203d9f0492fSopenharmony_ci    uint32_t contentIndex = start;
204d9f0492fSopenharmony_ci    uint32_t currIndex = 0;
205d9f0492fSopenharmony_ci    while (contentIndex < contentSize && currIndex < valueSize) {
206d9f0492fSopenharmony_ci        if (content[contentIndex] == '=') {
207d9f0492fSopenharmony_ci            value[currIndex++] = '\0';
208d9f0492fSopenharmony_ci            return 0;
209d9f0492fSopenharmony_ci        }
210d9f0492fSopenharmony_ci        value[currIndex++] = content[contentIndex++];
211d9f0492fSopenharmony_ci    }
212d9f0492fSopenharmony_ci    if (currIndex < valueSize) {
213d9f0492fSopenharmony_ci        value[currIndex] = '\0';
214d9f0492fSopenharmony_ci        return 0;
215d9f0492fSopenharmony_ci    }
216d9f0492fSopenharmony_ci    return -1;
217d9f0492fSopenharmony_ci}
218d9f0492fSopenharmony_ci
219d9f0492fSopenharmony_ciint ComputeCondition(LogicCalculator *calculator, const char *condition)
220d9f0492fSopenharmony_ci{
221d9f0492fSopenharmony_ci    PARAM_CHECK(calculator != NULL && condition != NULL, return -1, "Invalid calculator");
222d9f0492fSopenharmony_ci    uint32_t currIndex = 0;
223d9f0492fSopenharmony_ci    uint32_t start = 0;
224d9f0492fSopenharmony_ci    size_t conditionLen = strlen(condition);
225d9f0492fSopenharmony_ci    int noneOper = 1;
226d9f0492fSopenharmony_ci    CalculatorClear(calculator);
227d9f0492fSopenharmony_ci    LogicData data1 = {};
228d9f0492fSopenharmony_ci    LogicData data2 = {};
229d9f0492fSopenharmony_ci    while (currIndex < conditionLen) {
230d9f0492fSopenharmony_ci        if (condition[currIndex] == '|' || condition[currIndex] == '&') {
231d9f0492fSopenharmony_ci            noneOper = 0;
232d9f0492fSopenharmony_ci            int ret = CalculatorPop(calculator, (void*)&data2);
233d9f0492fSopenharmony_ci            int ret1 = CalculatorPop(calculator, (void*)&data1);
234d9f0492fSopenharmony_ci            PARAM_CHECK((ret == 0 && ret1 == 0), return -1, "Failed to pop data");
235d9f0492fSopenharmony_ci
236d9f0492fSopenharmony_ci            ret = ComputeSubCondition(calculator, &data1, condition);
237d9f0492fSopenharmony_ci            data1.flags = 0;
238d9f0492fSopenharmony_ci            if (condition[currIndex] == '|' && ret == 1) {
239d9f0492fSopenharmony_ci                LOGIC_DATA_SET_FLAG(&data1, LOGIC_DATA_FLAGS_TRUE);
240d9f0492fSopenharmony_ci            } else if ((condition[currIndex] == '|' || ret == 1) &&
241d9f0492fSopenharmony_ci                (ComputeSubCondition(calculator, &data2, condition) == 1)) {
242d9f0492fSopenharmony_ci                LOGIC_DATA_SET_FLAG(&data1, LOGIC_DATA_FLAGS_TRUE);
243d9f0492fSopenharmony_ci            }
244d9f0492fSopenharmony_ci            ret = CalculatorPush(calculator, (void *)&data1);
245d9f0492fSopenharmony_ci            PARAM_CHECK(ret == 0, return -1, "Failed to push data");
246d9f0492fSopenharmony_ci            start = currIndex + 1; // 跳过符号
247d9f0492fSopenharmony_ci        } else if (isspace(condition[currIndex])) {
248d9f0492fSopenharmony_ci            if (start == currIndex) {
249d9f0492fSopenharmony_ci                start = ++currIndex;
250d9f0492fSopenharmony_ci                continue;
251d9f0492fSopenharmony_ci            }
252d9f0492fSopenharmony_ci            data1.flags = LOGIC_DATA_FLAGS_ORIGINAL;
253d9f0492fSopenharmony_ci            data1.startIndex = start;
254d9f0492fSopenharmony_ci            data1.endIndex = currIndex;
255d9f0492fSopenharmony_ci            int ret = CalculatorPush(calculator, (void *)&data1);
256d9f0492fSopenharmony_ci            PARAM_CHECK(ret == 0, return -1, "Failed to push data");
257d9f0492fSopenharmony_ci            start = currIndex + 1;
258d9f0492fSopenharmony_ci        }
259d9f0492fSopenharmony_ci        currIndex++;
260d9f0492fSopenharmony_ci    }
261d9f0492fSopenharmony_ci    if (noneOper) {
262d9f0492fSopenharmony_ci        data1.flags = LOGIC_DATA_FLAGS_ORIGINAL;
263d9f0492fSopenharmony_ci        data1.startIndex = start;
264d9f0492fSopenharmony_ci        data1.endIndex = strlen(condition);
265d9f0492fSopenharmony_ci    } else {
266d9f0492fSopenharmony_ci        int ret = CalculatorPop(calculator, &data1);
267d9f0492fSopenharmony_ci        PARAM_CHECK(ret == 0, return -1, "Invalid calculator");
268d9f0492fSopenharmony_ci    }
269d9f0492fSopenharmony_ci    return ComputeSubCondition(calculator, &data1, condition);
270d9f0492fSopenharmony_ci}
271d9f0492fSopenharmony_ci
272d9f0492fSopenharmony_ciint ConvertInfixToPrefix(const char *condition, char *prefix, uint32_t prefixLen)
273d9f0492fSopenharmony_ci{
274d9f0492fSopenharmony_ci    PARAM_CHECK(condition != NULL && prefix != NULL, return -1, "Invalid condition");
275d9f0492fSopenharmony_ci    char e = 0;
276d9f0492fSopenharmony_ci    int ret;
277d9f0492fSopenharmony_ci    uint32_t curr = 0;
278d9f0492fSopenharmony_ci    uint32_t prefixIndex = 0;
279d9f0492fSopenharmony_ci    size_t conditionLen = strlen(condition);
280d9f0492fSopenharmony_ci    LogicCalculator calculator;
281d9f0492fSopenharmony_ci    PARAM_CHECK(CalculatorInit(&calculator, MAX_CALC_PARAM, 1, 0) == 0, return -1, "Failed to init calculator");
282d9f0492fSopenharmony_ci
283d9f0492fSopenharmony_ci    while (curr < conditionLen) {
284d9f0492fSopenharmony_ci        if (condition[curr] == ')') {
285d9f0492fSopenharmony_ci            CalculatorPopChar(&calculator, &e);
286d9f0492fSopenharmony_ci            while (e != '(') {
287d9f0492fSopenharmony_ci                ret = PrefixAdd(prefix, &prefixIndex, prefixLen, e);
288d9f0492fSopenharmony_ci                PARAM_CHECK(ret == 0,
289d9f0492fSopenharmony_ci                    CalculatorFree(&calculator); return -1, "Invalid prefix");
290d9f0492fSopenharmony_ci                CalculatorPopChar(&calculator, &e);
291d9f0492fSopenharmony_ci            }
292d9f0492fSopenharmony_ci        } else if (condition[curr] == '|') {
293d9f0492fSopenharmony_ci            PARAM_CHECK(condition[curr + 1] == '|',
294d9f0492fSopenharmony_ci                CalculatorFree(&calculator); return -1, "Invalid condition");
295d9f0492fSopenharmony_ci            ret = HandleOperationOr(&calculator, prefix, &prefixIndex, prefixLen);
296d9f0492fSopenharmony_ci            PARAM_CHECK(ret == 0,
297d9f0492fSopenharmony_ci                CalculatorFree(&calculator); return -1, "Invalid prefix");
298d9f0492fSopenharmony_ci            curr++;
299d9f0492fSopenharmony_ci        } else if (condition[curr] == '&') {
300d9f0492fSopenharmony_ci            PARAM_CHECK(condition[curr + 1] == '&',
301d9f0492fSopenharmony_ci                CalculatorFree(&calculator); return -1, "Invalid condition");
302d9f0492fSopenharmony_ci            prefix[prefixIndex++] = ' ';
303d9f0492fSopenharmony_ci            CalculatorPushChar(&calculator, condition[curr]);
304d9f0492fSopenharmony_ci            curr++;
305d9f0492fSopenharmony_ci        } else if (condition[curr] == '(') {
306d9f0492fSopenharmony_ci            CalculatorPushChar(&calculator, condition[curr]);
307d9f0492fSopenharmony_ci        } else {
308d9f0492fSopenharmony_ci            prefix[prefixIndex++] = condition[curr];
309d9f0492fSopenharmony_ci        }
310d9f0492fSopenharmony_ci        curr++;
311d9f0492fSopenharmony_ci        PARAM_CHECK(prefixIndex < prefixLen,
312d9f0492fSopenharmony_ci            CalculatorFree(&calculator); return -1, "Invalid prefixIndex");
313d9f0492fSopenharmony_ci    }
314d9f0492fSopenharmony_ci
315d9f0492fSopenharmony_ci    while (CalculatorLength(&calculator) > 0) {
316d9f0492fSopenharmony_ci        CalculatorPopChar(&calculator, &e);
317d9f0492fSopenharmony_ci        ret = PrefixAdd(prefix, &prefixIndex, prefixLen, e);
318d9f0492fSopenharmony_ci        PARAM_CHECK(ret == 0,
319d9f0492fSopenharmony_ci            CalculatorFree(&calculator);
320d9f0492fSopenharmony_ci            return -1, "Invalid prefix %u %u", prefixIndex, prefixLen);
321d9f0492fSopenharmony_ci    }
322d9f0492fSopenharmony_ci    prefix[prefixIndex] = '\0';
323d9f0492fSopenharmony_ci    CalculatorFree(&calculator);
324d9f0492fSopenharmony_ci    return 0;
325d9f0492fSopenharmony_ci}
326d9f0492fSopenharmony_ci
327d9f0492fSopenharmony_ciint CheckMatchSubCondition(const char *condition, const char *input, int length)
328d9f0492fSopenharmony_ci{
329d9f0492fSopenharmony_ci    PARAM_CHECK(condition != NULL, return 0, "Invalid condition");
330d9f0492fSopenharmony_ci    PARAM_CHECK(input != NULL, return 0, "Invalid input");
331d9f0492fSopenharmony_ci    const char *tmp = strstr(condition, input);
332d9f0492fSopenharmony_ci    while (tmp != NULL) {
333d9f0492fSopenharmony_ci        PARAM_LOGV("CheckMatchSubCondition Condition: '%s' content: '%s' length %d", condition, input, length);
334d9f0492fSopenharmony_ci        if (((int)strlen(tmp) <= length) || (tmp[length] != '=')) {
335d9f0492fSopenharmony_ci            return 0;
336d9f0492fSopenharmony_ci        }
337d9f0492fSopenharmony_ci        // for condition: parameter = 1
338d9f0492fSopenharmony_ci        if (tmp == condition) {
339d9f0492fSopenharmony_ci            return 1;
340d9f0492fSopenharmony_ci        }
341d9f0492fSopenharmony_ci        // for condition: parameter1 = 1 && parameter2 = 1
342d9f0492fSopenharmony_ci        if (*(tmp - 1) == ' ') {
343d9f0492fSopenharmony_ci            return 1;
344d9f0492fSopenharmony_ci        }
345d9f0492fSopenharmony_ci        tmp = strstr(tmp + 1, input);
346d9f0492fSopenharmony_ci    }
347d9f0492fSopenharmony_ci    return 0;
348d9f0492fSopenharmony_ci}