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}